通常用systrace分析問題,咱們直接查看關注的流程便可。html
有時logcat提供了重要的信息,但這些信息沒有用systrace log輸出。python
若是咱們能將systrace時間與手機時間對應起來,就不用添加systrace log從新編譯手機ROM了。android
----------------------------------------------------------------------------------app
這篇文章的小目標:ide
1. 計算systrace時間與手機時間的對應關係google
2. 在本身的代碼中添加systrace logspa
---------------------------------------------------debug
這裏存在三個時間戳,code
1)systrace時間軸上的時間,時間軸從0開始算起,以毫秒爲單位htm
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