一般用systrace分析問題,我們直接查看關注的流程即可。
有時logcat提供了重要的信息,但這些信息沒有用systrace log輸出。
如果我們能將systrace時間與手機時間對應起來,就不用添加systrace log重新編譯手機ROM了。
----------------------------------------------------------------------------------
這篇文章的小目標:
1. 計算systrace時間與手機時間的對應關系
2. 在自己的代碼中添加systrace log
---------------------------------------------------
這里存在三個時間戳,
1)systrace時間軸上的時間,時間軸從0開始算起,以毫秒為單位
2)kernel 時間,記錄kernel開始啟動后流逝的時間,以秒為單位
3)系統時鍾,顯示當時幾點鍾,也就是system log的時間
要找到systrace時間與kernel時間的對應關系,非常簡單,只需要以純文本方式打開systrace的html文件,搜"TIMESTAMP FUNCTION",第一句log顯示的kernel時間,就對應着systrace時間軸的起始時間。
我們用一個真實的trace文件來算一下,下面是第一句log
<...>-8634 (-----) [001] ...1 944990.442341: tracing_mark_write: trace_event_clock_sync: parent_ts=80241.648438
這里的944990.442341是kernel log時間,同時也是systrace時間軸的起始時間。
我們用下面截圖,算出DrawFrame流程的開始時的kernel時間,由於單位不同,這里systrace時間戳需要轉換單位為秒。
我們用純文本打開trace文件看看是不是:
RenderThread-8555 ( 8508) [002] ...1 944997.124754: tracing_mark_write: B|8508|DrawFrame
這里的誤差是毫秒以內的,一般足夠了。
我們再來找kernel log時間與系統system log時間的對應關系。
每個廠商或許都有各自的log對照,這里使用一個淺顯的方法來對照。
思路是在app中以systrace log的方式,輸出當前系統時間,再用systrace來看。
首先要介紹添加systrace log的方法,按照慣例,我引用官方文檔:
https://developer.android.google.cn/studio/profile/systrace/custom-events?hl=zh-cn
這個文檔,說明了在自己代碼添加systrace log,測量耗時的方法。
看完如何加log的文檔,言歸正傳,我們在Hello world app上加上一個按鈕,一點按鈕就打systrace log,我們這里用Time align作為關鍵字。
package nothing.example; import android.os.Bundle; import android.os.Trace; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button TimeAlignButton = findViewById(R.id.TimeAlignButton); TimeAlignButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { long totalMilliSeconds = System.currentTimeMillis(); long totalSeconds = totalMilliSeconds / 1000; long currentSecond = totalSeconds % 60; long totalMinutes = totalSeconds / 60; long currentMinute = totalMinutes % 60; //中國時區是東八區,所以+8 long totalHour = totalMinutes / 60 + 8; long currentHour = totalHour % 24; long ms = totalMilliSeconds % 1000; Trace.beginSection("Time align " + currentHour + ":" + currentMinute + ":" + currentSecond + "." + ms); Trace.endSection(); } }); } }
接下來我們抓取點擊按鈕操作的systrace,按照 [Android systrace系列] systrace入門第一式 的方法,把app輸出的systrace log抓到。
需要留心的是,因為這里需要抓app的systrace log,所以需要userdebug版本的手機。
python systrace.py -o mynewtrace.html -a nothing.example
純文本打開mynewtrace.html,搜索Time align,kernel時間1434.981241和系統時鍾15:11:32.537就對上了。
nothing.exampl-7676 ( 7676) [000] ...1 1434.981241: tracing_mark_write: B|7676|Time align 15:11:32.537
小目標,完成。
轉載請注明出處:https://www.cnblogs.com/zzcperf/p/14008147.html