|
一般用systrace分析問題,我們直接查看關注的流程即可。 有時logcat提供了重要的信息,但這些信息沒有用systrace log輸出。 如果我們能將systrace時間與手機時間對應起來,就不用添加systrace log重新編譯手機ROM了。 ---------------------------------------------------------------------------------- 這篇文章的小目標: 1. 計算systrace時間與手機時間的對應關系 2. 在自己的代碼中添加systrace log ---------------------------------------------------
這里存在三個時間戳, 1)systrace時間軸上的時間,時間軸從0開始算起,以毫秒為單位 2)kernel 時間,記錄kernel開始啟動后流逝的時間,以秒為單位 3)系統(tǒng)時鐘,顯示當時幾點鐘,也就是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時間與系統(tǒng)system log時間的對應關系。 每個廠商或許都有各自的log對照,這里使用一個淺顯的方法來對照。 思路是在app中以systrace log的方式,輸出當前系統(tǒng)時間,再用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; //中國時區(qū)是東八區(qū),所以+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和系統(tǒng)時鐘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 |
|
|