1.traceview使用
Debug.startMethodTracing("myapp")//startMethodTracing有好幾個重載方法
Debug.stopMethodTracing()
?運行之后可以在目錄下生成文件:內部存儲/android/data/cpm.example.myapplication/files/myapp.trace
使用android studio profiler打開trace文件考润,Android官網有詳細的profiler文件使用介紹:https://developer.android.com/studio/profile/cpu-profiler
?接下來一起來分析Trace文件:
?Wall Clock time是線程真正執(zhí)行的時間狭园,比如我們測試一個方法執(zhí)行了100ms,從Wall Clock time上看就是100ms
?Thread time上所看到的時間是指CPU執(zhí)行的時間额划,時間只會比100ms少妙啃,使用Thread Time可以讓您更好地了解線程的實際 CPU 使用率中有多少是給定方法或函數消耗的。還可以在方法上右鍵點擊jump to source俊戳。實際優(yōu)化過程中重點關注的就是Thread time,例如發(fā)生了死鎖馆匿,整個wall clock time的時間是很長的抑胎,但是Thread time時間反應出來的才是真實在方法上所消耗的時間。
?Threads(12)表示的是線程的總數渐北,trace可以查看十二個線程阿逃,main是我們的主線程,我們可以點任意一個線程查看做了什么赃蛛。
?Call Chart最上面表示總時間恃锉,垂直向下依次為被調用方法的時間。其中呕臂,對于系統(tǒng)Api顯示的是黃色破托,被應用調用的方法是綠色的,第三方api(java sdk也屬于第三方)的顏色就是藍色
?Flame Chart火焰圖主要的作用是收集調用方法的時間歧蒋,比如多次調用LayoutInflate.inflate土砂,Flame Chart會把他們都收集到一起。
?Top Down就是函數的調用列表谜洽,可以依次從上往下查看調用列表萝映。Total顯示的是總調用時間,self顯示的是自身執(zhí)行的時間阐虚,children顯示的是子方法被調用的時間序臂。
?Bottom Up和Top Down是相反的,可以依次從下往上查看調用方实束。
traceview有以下幾點需要注意:
1.運行時開銷嚴重奥秆,整體變慢。因為trace會收集程序運行時所有方法的耗時情況磕洪,因此會拖累整體速度吭练。
2.有了cpu profiler為什么還要用traceview?因為traceview可以埋點析显,cpu profiler不能埋點鲫咽,我們可以結合二者的優(yōu)勢使用签赃。traceview埋點,cpu profiler分析
2. Systrace
查看官方教程
要運行 systrace
分尸,請完成以下步驟:
- 從 Android Studio 下載并安裝最新的 Android SDK Tools锦聊。
- 安裝 Python (v2.7)并將其添加到工作站的執(zhí)行路徑中。
- 使用 USB 調試連接將搭載 Android 4.3(API 級別 18)或更高版本的設備連接到開發(fā)系統(tǒng)箩绍。然后在Acticvity中使用Trace孔庭,但是因為只支持API 18以上,所以推薦我們使用TraceCompat材蛛,向下兼容圆到。
TraceCompat.beginSection("start");
TraceCompat.endSection();
4.systrace
命令在 Android SDK Tools 工具包中提供,位于android-sdk/platform-tools/systrace/
卑吭,參照文檔使用命令:
python systrace.py -t 10 [other-options] [categories]
例如芽淡,以下命令會調用 systrace 來記錄設備活動并生成一個名為 mynewtrace.html 的 HTML 報告。此類別列表是大多數設備的合理默認列表豆赏。
$ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
5.在android-sdk/platform-tools/systrace/
下生成mynewtrace.html文件挣菲,打開如下所示:
可以使用快捷鍵快速閱讀該文件,常用快捷鍵說明如下所示:
W: 放大橫軸掷邦,用于查看耗時方法細節(jié)白胀;
S: 縮小橫軸,用于查看整體情況抚岗;
A: 將面板左移或杠;
D: 將面板右移;
M: 高亮某一段耗時內容苟跪。
?從圖中看出CPU核心數廷痘、進程信息、Surfaceflinger等信息件已。我們可以從進程中的frames去分析是否有卡頓存在笋额,
每一個F代表著一幀,紅色的F表示丟幀篷扩,
android的display的時間大約是16.6ms兄猩,因此超過此時間的在我們看來都是卡頓現象也就是丟幀。?按下M選擇紅色F如下高亮部分所示鉴未,可以看出繪制時間為201.192ms枢冤,這是遠遠超出16.6ms繪制時間的。
?
通過分析選中部分調用方法的細節(jié)以及結合Frames下的Description去分析掉幀的方法铜秆。
想要深入了解systrace的還可以查看這篇文章
總結
?Trace和Profiler相比淹真,Trace可以進行埋點,精確的計算app啟動所消耗的時間连茧,Profiler雖然是最新的工具核蘸,但是無法做到所有界面都精確計時巍糯。可以使用Trace進行埋點生成文件客扎,再使用Profiler對Trace文件進行卡頓分析祟峦。
?分析卡頓的一般步驟如下所示:
1.在app內找到卡頓的場景,并抓取卡頓發(fā)生時的文件徙鱼;
2.找到發(fā)生問題的應用進程的主線程宅楞,找到發(fā)生問題的問題幀;
3.通過profiler或者systrace中frames紅色高亮部分去判斷具體耗時情況袱吆。