2020年5月3日 星期日

[Android] system tracing

markdown systrace 是一個用來量測 Android 系統層級執行時間的 command line tool,位置在 android-sdk/platform-tools/systrace/systrace.py,是一個 python script。它的一些參數可以看[官方文件](https://developer.android.com/topic/performance/tracing/command-line)的說明。 在講 systrace 的用法之前,先來講一下為什麼它可以收集 Android 系統的執行時間,Android 本身會在很多重要的函數前後插入 Label,用這個資訊讓 systrace 可以知道某個函數執行了多久。所謂插入 Label,其實就是呼叫 [TraceCompat](https://developer.android.com/reference/android/support/v4/os/TraceCompat) 的 beginSection 和 endSection。例如在 RecyclerView 的 onLayout 就有插入 Label。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibRjV9ccicC5xhih9wBTdxMnDKqq73mg38BG6AOVv5Mrlc6bE4JCggMTFcgaCnHfVl8JMiVpUWt_grolqxF3dnXxctDSb3isDC12L-ZNN4gBzsD1ChuN2bwz-p5A27z1Oe-586ff037nw3/s1600/Image+2.png) 這樣的 Label 被插入到 Android 系統的各個關鍵 call path 中,讓你可以知道你的 app 在這些系統函數到底花了多久時間。 執行 systrace 時會喂給它時間參數,表示你希望它收集多久的資料,然後是各個模組名稱,表示你希望它收集哪些模組的資料。還有你自己 app 的 package name,這樣 systrace 也會抓你自己在 app code 中插入的 Label,例如下面是我用來 debug UI 卡頓時常用的命令。
systrace.py -t 3 sched gfx view -a myapp.package.name --no-compress
systrace 執行完之後,就會在目錄中產生一個 trace.html 檔案,這個檔案可以用 chrome 開啟,用圖形化的界面顯示執行時間,如下圖,你可以用 WASD 按鍵做移動還有放大跟縮小 timeline。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnOkhF7X1mkYZ5Cr5Qw8UxuPo3cp6d4PT48hyphenhyphenz9odjEj7penLMDnCukpVxoAJgYG182-Y03XD7OlUu5ExZfdivVGJz-6rlyC94E2fVkFyKVZepgiiZId_fJQ4kxJczHO4KVF4_Rul5Wv0u/s1600/Image+1.png) 跟 method trace 不同,systrace 只記錄某些關鍵 call path 的執行時間,不過這也正好是他的優點,因為 method trace 記錄的 method 太多,除非有某個函數真的明顯跟其他函數比起來花了太多時間,不然在調查效能瓶頸時很容易被淹沒在函數海中,找不到該優化的地方。用 systrace 可以先從大方向找出在哪些系統函式比較耗時,接著再用 method trace 做深入追查,這樣會比較有效率。 --- * [Overview of system tracing](https://developer.android.com/topic/performance/tracing/)

沒有留言:

張貼留言