Android性能優(yōu)化之啟動(dòng)優(yōu)化工具(TraceView、Systrace、Profiler)

1.traceview使用

Debug.startMethodTracing("myapp")//startMethodTracing有好幾個(gè)重載方法
Debug.stopMethodTracing()

?運(yùn)行之后可以在目錄下生成文件:內(nèi)部存儲(chǔ)/android/data/cpm.example.myapplication/files/myapp.trace
使用android studio profiler打開trace文件,Android官網(wǎng)有詳細(xì)的profiler文件使用介紹:https://developer.android.com/studio/profile/cpu-profiler

profiles打開文件

?接下來一起來分析Trace文件:
?Wall Clock time是線程真正執(zhí)行的時(shí)間,比如我們測(cè)試一個(gè)方法執(zhí)行了100ms,從Wall Clock time上看就是100ms
?Thread time上所看到的時(shí)間是指CPU執(zhí)行的時(shí)間,時(shí)間只會(huì)比100ms少,使用Thread Time可以讓您更好地了解線程的實(shí)際 CPU 使用率中有多少是給定方法或函數(shù)消耗的。還可以在方法上右鍵點(diǎn)擊jump to source。實(shí)際優(yōu)化過程中重點(diǎn)關(guān)注的就是Thread time,例如發(fā)生了死鎖,整個(gè)wall clock time的時(shí)間是很長(zhǎng)的,但是Thread time時(shí)間反應(yīng)出來的才是真實(shí)在方法上所消耗的時(shí)間
?Threads(12)表示的是線程的總數(shù),trace可以查看十二個(gè)線程,main是我們的主線程,我們可以點(diǎn)任意一個(gè)線程查看做了什么。
THREADS

?Call Chart最上面表示總時(shí)間,垂直向下依次為被調(diào)用方法的時(shí)間。其中,對(duì)于系統(tǒng)Api顯示的是黃色,被應(yīng)用調(diào)用的方法是綠色的,第三方api(java sdk也屬于第三方)的顏色就是藍(lán)色
Call Chart

?Flame Chart火焰圖主要的作用是收集調(diào)用方法的時(shí)間,比如多次調(diào)用LayoutInflate.inflate,F(xiàn)lame Chart會(huì)把他們都收集到一起。
Flame Chart

?Top Down就是函數(shù)的調(diào)用列表,可以依次從上往下查看調(diào)用列表。Total顯示的是總調(diào)用時(shí)間,self顯示的是自身執(zhí)行的時(shí)間,children顯示的是子方法被調(diào)用的時(shí)間。
Top down

?Bottom UpTop Down是相反的,可以依次從下往上查看調(diào)用方。
Bottom up

traceview有以下幾點(diǎn)需要注意:
1.運(yùn)行時(shí)開銷嚴(yán)重,整體變慢。因?yàn)閠race會(huì)收集程序運(yùn)行時(shí)所有方法的耗時(shí)情況,因此會(huì)拖累整體速度。
2.有了cpu profiler為什么還要用traceview?因?yàn)閠raceview可以埋點(diǎn),cpu profiler不能埋點(diǎn),我們可以結(jié)合二者的優(yōu)勢(shì)使用。traceview埋點(diǎn),cpu profiler分析

2. Systrace

查看官方教程
要運(yùn)行 systrace,請(qǐng)完成以下步驟:

  1. 從 Android Studio 下載并安裝最新的 Android SDK Tools
  2. 安裝 Python (v2.7)并將其添加到工作站的執(zhí)行路徑中。
  3. 使用 USB 調(diào)試連接將搭載 Android 4.3(API 級(jí)別 18)或更高版本的設(shè)備連接到開發(fā)系統(tǒng)。然后在Acticvity中使用Trace,但是因?yàn)橹恢С諥PI 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]
例如,以下命令會(huì)調(diào)用 systrace 來記錄設(shè)備活動(dòng)并生成一個(gè)名為 mynewtrace.html 的 HTML 報(bào)告。此類別列表是大多數(shù)設(shè)備的合理默認(rèn)列表。

$ 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文件,打開如下所示:

mynewtrace

可以使用快捷鍵快速閱讀該文件,常用快捷鍵說明如下所示:
W: 放大橫軸,用于查看耗時(shí)方法細(xì)節(jié);
S: 縮小橫軸,用于查看整體情況;
A: 將面板左移;
D: 將面板右移;
M: 高亮某一段耗時(shí)內(nèi)容。
?從圖中看出CPU核心數(shù)、進(jìn)程信息、Surfaceflinger等信息。我們可以從進(jìn)程中的frames去分析是否有卡頓存在,每一個(gè)F代表著一幀,紅色的F表示丟幀,android的display的時(shí)間大約是16.6ms,因此超過此時(shí)間的在我們看來都是卡頓現(xiàn)象也就是丟幀。
?按下M選擇紅色F如下高亮部分所示,可以看出繪制時(shí)間為201.192ms,這是遠(yuǎn)遠(yuǎn)超出16.6ms繪制時(shí)間的。
?通過分析選中部分調(diào)用方法的細(xì)節(jié)以及結(jié)合Frames下的Description去分析掉幀的方法。
具體丟幀的方法

想要深入了解systrace的還可以查看這篇文章

總結(jié)

?Trace和Profiler相比,Trace可以進(jìn)行埋點(diǎn),精確的計(jì)算app啟動(dòng)所消耗的時(shí)間,Profiler雖然是最新的工具,但是無法做到所有界面都精確計(jì)時(shí)。可以使用Trace進(jìn)行埋點(diǎn)生成文件,再使用Profiler對(duì)Trace文件進(jìn)行卡頓分析。
?分析卡頓的一般步驟如下所示:
1.在app內(nèi)找到卡頓的場(chǎng)景,并抓取卡頓發(fā)生時(shí)的文件;
2.找到發(fā)生問題的應(yīng)用進(jìn)程的主線程,找到發(fā)生問題的問題幀;
3.通過profiler或者systrace中frames紅色高亮部分去判斷具體耗時(shí)情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容