保證系統流暢度,也就是保證系統能連續不間斷地提供每秒60幀的運行狀態。當出現掉幀時(也可稱為Jank),需要知道當前整個系統所處的狀態,systrace便是最佳的選擇,它能手機檢測android系統各個組件隨著時間的運行狀態,並能提示該如何有效地修復問題,接下來說說systrace如何使用以及如何解讀。
java framework層
import android.os.Trace;
Trace.traceBegin(long traceTag, String methodName)
Trace.traceEnd(long traceTag)
在代碼中必須成對出現,一般將traceEnd放入到finally語句塊,另外,必須在同一個線程。
app層
import android.os.Trace;
Trace.beginSection(String sectionName)
Trace.EndSection()
這裡默認的traceTag為TRACE_TAG_APP
,systrace命令通過指定app參數即
native framework層
#include<utils/Trace.h>
ATRACE_CALL();
命令行
python systrace.py [options] [category1] [category2] ... [categoryN]
其中options可取值:
<FILE
>
輸出的目標文件
-t N, –time=N
執行時間,默認5s
-b N, –buf-size=N
buffer大小(單位kB),用於限制trace總大小,默認無上限
-k <KFUNCS
>,–ktrace=<KFUNCS
>
追蹤kernel函數,用逗號分隔
-a <APP_NAME
>,–app=<APP_NAME
>
追蹤應用包名,用逗號分隔
–from-file=<FROM_FILE
>
從文件中創建互動的systrace
-e <DEVICE_SERIAL
>,–serial=<DEVICE_SERIAL
>
指定設備
-l, –list-categories
列舉可用的tags
category可取值:
例如,在systrace.py所在目錄下執行指令:2.3 圖形化
python systrace.py -b 32768 -t 5 -o mytrace.html wm gfx input view sched freq
又例如,輸出全部的trace信息
python systrace.py -b 32768 -t 5 -o mytrace.html gfx input view webview wm am sm audio video camera hal app res dalvik rs bionic power sched irq freq idle disk mmc load sync workq memreclaim regulators
注:收集trace,需要提前安裝python,並且一定要注意必須是python 2.x,而不是能3.x,否則可能會出現問題。另外,buffer大小不可過大,否則會出現oom異常。
橫坐標是以時間為單位,縱坐標是以進程-線程的方式來劃分,同一進程的線程為一組放在一起,可收縮/展開,如下圖:
產生的html格式的trace文件必須使用Google Chrome打開,才能正確地解析並已圖標形式展現。上圖中紅色圈起來的,都是可以點擊操作的地方,最上方是搜索欄,往下處是Alerts按鈕,再往下是鼠標操作模式。
在每個app進程,都有一個Frames行,正常情況以綠色的圓點表示。當圓點顏色為黃色或者紅色時,意味著這一幀超過16.6ms(即發現丟幀),這時需要通過放大那一幀進一步分析問題。對於Android 5.0(API level 21)或者更高的設備,該問題主要聚焦在UI Thread和Render Thread這兩個線程當中。對於更早的版本,則所有工作在UI Thread。
Systrace能自動分析trace中的事件,並能自動高亮性能問題作為一個Alerts,建議調試人員下一步該怎麼做。
比如對於丟幀是,點擊黃色或紅色的Frames圓點便會有相關的提示信息;另外,在systrace的最右上方,有一個Alerts tab可以展開,這裡記錄著所有的的警告提示信息。
注:本文講到最新版的systrace,其中sdk 23,chrome版本49.0,部分功能在老版本systrace並沒有。
對於腳本控制台,除了能當做記事本的功能,目前還不清楚有啥功能,或許還在開發中。
可通過按數字1~4,用於切換鼠標模式; 另外,按住alt鍵,再滾動鼠標滾輪能實現放大/縮小功能。