systrace的簡單使用
1.安裝python并配置python環(huán)境變量
注意:
- Systrace.py的使用需要安裝python 2.7乃坤,不能用python 3.x羹饰。
安裝完成后輸入python systrace.py -l
如下圖所示證明安裝成功梦染。
- 若提示
ImportError: No module named win32con
則輸入pip install pypiwin32
安裝win32con模塊愧怜。
2.輸入命令初茶,執(zhí)行待分析的操作壕吹,獲取trace.html文件
在android sdk下trace目錄下執(zhí)行形如python systrace.py [options] [category1] [category2] ... [categoryN]
的命令蕊爵,同時打開待分析app并執(zhí)行相應(yīng)操作辉哥,便能得到可供分析的trace.html文件。
命令用法
python systrace.py [options] [category1] [category2] ... [categoryN]
options
其中options可取值:
category
category可取值:
[option]
中比較重要的幾個參數(shù)如下:
-a <package_name>:這個選項可以開啟指定包名App中自定義Trace Label的Trace功能在辆。也就是說证薇,如果你在代碼中使用了
Trace.beginSection("tag")
,Trace.endSection
;默認(rèn)情況下匆篓,你的這些代碼是不會生效的浑度,因此,這個選項一定要開啟鸦概!-t N:用來指定Trace運(yùn)行的時間箩张,取決于你需要分析過程的時間甩骏;還是那句話,在需要的時候盡可能縮小時間先慷;當(dāng)然饮笛,絕對不要把時間設(shè)的太短導(dǎo)致你操作沒完Trace就跑完了,這樣會出現(xiàn)
Did not finish
的標(biāo)簽论熙,分析數(shù)據(jù)就基本無效了福青。-l:這個用來列出你分析的那個手機(jī)系統(tǒng)支持的Trace模塊;也就是上面命令中
[category1]
能使用的部分脓诡;不同版本的系統(tǒng)能支持的模塊是不同的无午,一般來說,高版本的支持的模塊更多祝谚。-o FILE:指定trace數(shù)據(jù)文件的輸出路徑宪迟,如果不指定就是當(dāng)前目錄的
trace.html
。systrace.py -l
可以輸出手機(jī)能支持的Trace模塊交惯,而且輸出還給出了此模塊的用途次泽;
常用的模塊如下:
-
sched
: CPU調(diào)度的信息,非常重要席爽;你能看到CPU在每個時間段在運(yùn)行什么線程意荤;線程調(diào)度情況,比如鎖信息拳昌。
gfx
:Graphic系統(tǒng)的相關(guān)信息袭异,包括SerfaceFlinger,VSYNC消息炬藤,Texture御铃,RenderThread等;分析卡頓非常依賴這個沈矿。
view
: View繪制系統(tǒng)的相關(guān)信息上真,比如onMeasure,onLayout等羹膳;對分析卡頓比較有幫助睡互。
am
:ActivityManager調(diào)用的相關(guān)信息;用來分析Activity的啟動過程比較有效陵像。dalvik
: 虛擬機(jī)相關(guān)信息就珠,比如GC停頓等。
binder_driver
: Binder驅(qū)動的相關(guān)信息醒颖,如果你懷疑是Binder IPC的問題妻怎,不妨打開這個。
core_services
: SystemServer中系統(tǒng)核心Service的相關(guān)信息泞歉,分析特定問題用逼侦。
示例:
3.用瀏覽器打開并分析trace.html文件
瀏覽器打開trace文件后如下圖所示:
橫坐標(biāo)是以時間為單位匿辩,縱坐標(biāo)是以進(jìn)程-線程的方式來劃分,同一進(jìn)程的線程為一組放在一起榛丢,可收縮/展開铲球。 systrace會記錄下所有進(jìn)程在所給時間內(nèi)的表現(xiàn)。
Frames
在每個app進(jìn)程晰赞,都有一個Frames行稼病,正常情況以綠色的圓點表示。當(dāng)圓點顏色為黃色或者紅色時宾肺,意味著這一幀超過16.6ms(即發(fā)現(xiàn)丟幀)溯饵,這時需要通過放大那一幀進(jìn)一步分析問題。
Alerts
Systrace能自動分析trace中的事件锨用,并能自動高亮性能問題作為一個Alerts,建議調(diào)試人員下一步該怎么做隘谣。比如對于丟幀是增拥,點擊黃色或紅色的Frames圓點便會有相關(guān)的提示信息;另外寻歧,在systrace的最右上方掌栅,有一個Alerts tab可以展開,這里記錄著所有的的警告提示信息码泛。
模式切換
- Select mode: 雙擊已選定區(qū)能將所有相同的塊高亮選中猾封;(對應(yīng)數(shù)字1)
- Pan mode: 拖動平移視圖(對應(yīng)數(shù)字2
- Zoom mode:通過上/下拖動鼠標(biāo)來實現(xiàn)放大/縮小功能;(對應(yīng)數(shù)字3)
- Timing mode:拖動來創(chuàng)建或移除時間窗口線噪珊。(對應(yīng)數(shù)字4)
可通過按數(shù)字1~4晌缘,用于切換鼠標(biāo)模式; 另外痢站,按住alt鍵磷箕,再滾動鼠標(biāo)滾輪能實現(xiàn)放大/縮小功能。
如何定位到自己打個tag
/ 搜索關(guān)鍵字搜索到后阵难,再m定位到區(qū)域岳枷。
Systrace小結(jié)
特性
- 結(jié)合Android內(nèi)核的數(shù)據(jù),生成Html報告呜叫。
- 系統(tǒng)版本越高空繁,Android Framework中添加的系統(tǒng)可用Label就越多,能夠支持和分析的系統(tǒng)模塊也就越多朱庆。
- 必須手動縮小范圍盛泡,會幫助你加速收斂問題的分析過程,進(jìn)而快速地定位和解決問題椎工。
作用
- 主要用于分析繪制性能方面的問題饭于。
- 分析系統(tǒng)關(guān)鍵方法和應(yīng)用方法耗時蜀踏。
如何分析非Debug的App
systrace官方文檔說待trace的App必須是debuggable的,但是官方又說掰吕,debuggable的App與非debuggable的性能有較大差別果覆;因為系統(tǒng)為了支持debug開啟了一些列功能并且關(guān)閉掉了某些重要的優(yōu)化,如果我們想要待分析的App盡可能接近真實情況殖熟,那么必須要在非Debug的App中能啟用systrace功能局待;因為相同情況下Debug的App性能比非Debuggable的差,你無法確保在debuggable版本上分析出來的結(jié)論能準(zhǔn)確推廣到非debuggable的版本上菱属。
分析systrace源碼之后 钳榨,發(fā)現(xiàn)這個條件只是個障眼法而已;我們可以手動開啟App的自定義Label的Trace功能纽门,方法也很簡單薛耻,調(diào)用一個函數(shù)即可;但是這個函數(shù)是SDK @hide的赏陵,我們需要反射調(diào)用:
Class<?> trace = Class.forName("android.os.Trace");
Method setAppTracingAllowed = trace.getDeclaredMethod("setAppTracingAllowed", boolean.class);
setAppTracingAllowed.invoke(null, true);
把這段代碼放在Application的attachBaseContext
中饼齿,這樣就可以手動開啟App自定義Label的Trace功能,在非debuggable的版本中也適用蝙搔!