-
背景
1、什麼是systrace?
Systrace是Android4.1引入的性能分析工具。利用ftrace,在系統關鍵位置都有埋點,主要用於分析系統調用耗時問題,可以自定義trace標籤來細化調用棧
2 、爲什麼要用systrace,像騰訊的PerfDog不香嗎?
原因有以下幾點:
- PerfDog這種軟件能直觀的查看CPU、GPU、內存等數據,比較適合用來做內存泄漏分析或者幀率的測試,但是對CPU具體使用情況是無法細化的,而systrace可以查看手機全部CPU每時每刻的佔用情況,從而發現哪些時刻的CPU比較空閒或者太忙碌
- 想象一下,如果你要排查項目中主線程耗時情況,你會怎麼做呢?可選的方法是可以寫個基於asm的插件來爲每個方法進行插樁,不過這樣一方面需要額外的人力消耗,另一方面不夠直觀,因爲你最多隻能發現耗時點,但是不知道當時的環境以及其他相關耗時。這時候systrace就有優勢了,它可以直觀的展示出比較耗時的方法以及裏面的相關調用,而且也不需要你額外編寫什麼插件,最好的方式是systrace與插樁的結合,這樣能快速定位問題
-
具體使用
-
systrace命令
systrace_path=“/xxx/Android/sdk/platform-tools/systrace/systrace.py"
python $systrace_path -a “com.test.myapplication” -o trace.html gfx input view wm am dalvik
說明:systrace是Android SDK自帶的工具,位置就是systrace_path定義的目錄,注意的是目前只能用Python2來執行,不能用Python3
1)option可取值:
Option |
解釋 |
-o <FILE> |
指定trace數據文件的輸出路徑,如果不指定就是當前目錄的trace.html |
-t N, –time=N |
執行時間,默認5s。絕對不要把時間設的太短導致你操作沒完Trace就跑完了,這樣會出現Did not finish 的標籤,分析數據就基本無效了 |
-b N, –buf-size=N |
buffer大小(單位kB),用於限制trace總大小,默認無上限 |
-k <KFUNCS>,–ktrace=<KFUNCS> |
追蹤kernel函數,用逗號分隔 |
-a <APP_NAME>,–app=<APP_NAME> |
這個選項可以開啓指定包名App中自定義Trace Label的Trace功能。也就是說,如果你在代碼中使用了Trace.beginSection("tag"), Trace.endSection;默認情況下,你的這些代碼是不會生效的,因此,這個選項一定要開啓 |
–from-file=<FROM_FILE> |
從文件中創建互動的systrace |
-e <DEVICE_SERIAL>,–serial=<DEVICE_SERIAL> |
指定設備,在特定連接設備上進行跟蹤,由 |
2)category可取值:
gfx |
Graphic系統的相關信息 |
input |
輸入事件 |
view |
View繪製相關信息 |
webview |
Webview |
wm |
Window Manager |
am |
Activity Manager |
sm |
Sync Manager |
audio |
Audio |
video |
Video |
camera |
Camera |
hal |
Hardware Modules |
app |
Application |
res |
Resource Loading |
dalvik |
虛擬機相關信息 |
rs |
RenderScript |
bionic |
Bionic C Library |
power |
Power Management |
sched |
CPU調度的信息 |
Binder_driver |
Binder驅動的相關信息 |
core_services |
SystemServer中系統核心Service的相關信息 |
irq |
IRQ Events |
freq |
CPU Frequency |
idle |
CPU Idle |
disk |
Disk I/O |
mmc |
eMMC commands |
load |
CPU Load |
sync |
Synchronization |
workq |
Kernel Workqueues |
memreclaim |
Kernel Memory Reclaim |
regulators |
Voltage and Current Regulators |
從上面命令可以看出,systrace提供了非常豐富的性能種類,可以根據自己需要來選擇相關category,一般情況下我們主要監聽主線程和CPU情況,所以像input、view、am、wm、dalvik、sched是比較常用的
-
具體場景分析
以上圖爲例進行分析:
- 先看一下左邊欄目,左邊是一些具體的性能種類,我們一般是先找到對應的進程名,每個進程下面有一系列信息,比如上面的UI Thread就是我們關心的
- 接着定位到具體欄目,開始查看右邊信息,上圖右邊是UI線程相關情況,這裏我們抓取的是應用啓動5秒內的信息,最上面是時間軸,中間那些五顏六色的就是具體的調用方法以及耗時信息,顏色越深代表越耗時
- 快捷鍵介紹,如何查看信息,這邊介紹幾個快捷鍵,分別是a、d、w、s,和遊戲使用的按鍵有點像,分別代表左移、右移、放大、縮小。第一次使用應該很多人不知道這個快捷鍵
- 接着看下面部分,下面部分是你選擇具體某個調用方法後展示的相關信息,裏面有這個調用方法的介紹,耗時信息以及一些描述,比如我們可以看到像bindApplication這些系統方法,這個就代表了應用啓動階段走到了Application初始化這邊,從上往下分別是該方法的調用棧,越往下越具體,比如下面這個:
上面是點擊了框中位置的方法調用,然後下面就顯示了該方法具體信息,可以看出是我們的一個類對象創建,Wall Duration代表持續時間,即該方法總耗時,CPU Duration代表CPU耗時,還有個Self Time代表自身方法耗時,不包含其調用方法
- CPU信息查看
以上圖爲例,我們可以清楚看到該手機八個CPU核的佔用情況,和上面方法視圖類似,也是用顏色來代表耗時情況,白色就是空閒狀態,像我們做啓動優化就可以根據CPU的空閒狀態來重新分配每個時間段的代碼調用,這樣就能充分利用CPU,又能避免CPU高負載導致的ANR
-
總結
- systrace是提供查看系統相關api調用情況的工具,它相比插樁來看是無法具體到每個方法,但是可以提供一個全局的性能數據,然後你可以根據定位到的具體對象來進一步排查就能解決大部分問題
- systrace提供了很多性能選項,並且視圖裏面以時間爲橫軸記錄了完整的代碼執行過程,可以清晰看到CPU和每個對象的創建過程,可以做爲性能優化的參考依據
- systrace結合插樁可以做到先定位具體對象,再看對象具體方法耗時的操作流程,建議作爲性能優化的必備工具