android性能分析
對于一個app的性能口蝠,我們可以通過以下幾個點去分析:
- 內(nèi)存
- CPU
- GPU
- 網(wǎng)絡(luò)
而這些性能直接影響到手機(jī)耗電量,發(fā)熱量掂器,界面的流程度亚皂,以及流量的消耗俱箱,所以通過對這些點的分析国瓮,可以很好的改善app的整體性能。
對于這四個維度的分析狞谱,android studio提供如下四種監(jiān)測工具:
- Memory Monitor
- CPU Monitor
- GPU Monitor
- Network Monitor
通過以上工具乃摹,app的運行情況都會直觀,實時的顯示在圖表中跟衅。根據(jù)圖表孵睬,可以初步判斷是否存在內(nèi)存抖動,cup負(fù)荷過大等問題伶跷,但如果需要進(jìn)一步分析掰读,就需其詳細(xì)的數(shù)據(jù),尤其是memory和cpu中叭莫,由于代碼實現(xiàn)的不合理導(dǎo)致性能低下且不易被發(fā)現(xiàn)的問題蹈集。
接下來將進(jìn)一步介紹工具等使用,獲取性能相關(guān)的數(shù)據(jù)雇初,以及對這些數(shù)據(jù)的分析拢肆。
*在android studio3.0版本中,Monitor系列工具全新升級為Profiler靖诗,功能更加強(qiáng)大郭怪。
Memory Monitor
內(nèi)存的使用分析,即對其堆的使用刊橘,可以通過Memory Monitor直接獲取.hprof(堆轉(zhuǎn)儲)和.trac文件鄙才。利用這些數(shù)據(jù)確定是否存在內(nèi)存泄漏的問題以及對應(yīng)方法的內(nèi)存占用情況。
*堆轉(zhuǎn)儲
hprof(堆轉(zhuǎn)儲)是應(yīng)用堆中所有對象的快照促绵。
在Memory Monitor中攒庵,有一套完整,高效的內(nèi)存分析工具绞愚,使用也非常簡單叙甸。
-
在 Memory 監(jiān)視器的頂部,點擊
Dump Java Heap.
Android Studio 會創(chuàng)建一個文件名為 application-id_yyyy.mm.dd_hh.mm.hprof 的堆快照文件位衩,在 Android Studio 中打開文件裆蒸,然后將文件添加到 Captures 標(biāo)簽的 Heap Snapshot 列表中。
-
在 Captures 標(biāo)簽中糖驴,右鍵點擊文件僚祷,然后選擇 Export to standard .hprof佛致。
在視圖中,你可以查看堆中的使用情況辙谜,也可以方便的查看引用tree俺榆。
使用Analyzer Task工具,點擊運行按鈕獲取堆中存在泄露的Activity装哆,也可以監(jiān)測重復(fù)的String類.型
以未來域為例罐脊,如圖所示,可以迅速的檢測出存在一個內(nèi)存泄漏的對象蜕琴,在MyHouseActivity類中的RetrofitClient對象萍桌,進(jìn)行了網(wǎng)絡(luò)請求,問題在于未在Activity退出的時候進(jìn)行銷毀凌简。
跟蹤內(nèi)存分配
Allocation Tracker(跟蹤內(nèi)存分配)可以讓您更好地了解分配占用內(nèi)存的對象的位置上炎,跟蹤內(nèi)存分配位于哪些線程上,以及內(nèi)存分配來自何處雏搂。
在內(nèi)存監(jiān)視器工具欄中藕施,點擊“Allocation Tracker” 開始內(nèi)存分配。
與您的應(yīng)用交互凸郑。
-
再次點擊“Allocation Tracker” 停止分配跟蹤裳食。
Android Studio 會創(chuàng)建一個文件名為 application-id_yyyy.mm.dd_hh.mm.alloc 的分配文件,在 Android Studio 中打開該文件线椰,然后將文件添加到 Captures 標(biāo)簽內(nèi)的 Allocations 列表中胞谈。
在分配文件中,確定您的應(yīng)用中哪些操作可能會引起過多分配憨愉,并確定應(yīng)在應(yīng)用中什么位置嘗試減少分配和釋放資源烦绳。
該圖顯示了未來域的“首頁”模塊中的內(nèi)存發(fā)布,上半部分是線程中方法所占的內(nèi)存比配紫,下部分用圖表來展示對象的內(nèi)存占比径密,圓形弧度越大內(nèi)存占用越大,可以看出躺孝,BGABanner占用了較大比重的內(nèi)存享扔,其原因在于banner中涉及到了大圖以及切換動畫等。
CPU Monitor
android studio提供了一套cup使用追蹤工具CPU Monitor植袍,通過該工具可以實時顯示cup使用使用率惧眠。
圖中可以看到,cup的使用分為兩種類型
- User:代碼需要系統(tǒng)接口才能服務(wù)硬件和內(nèi)存于个,出現(xiàn)崩潰是可恢復(fù)的氛魁,
- Kernel:可直接訪問硬件和物理內(nèi)存,出現(xiàn)崩潰往往會導(dǎo)致設(shè)備停止運行。
一般情況下我們需要關(guān)注的是User類型秀存,以及進(jìn)行相應(yīng)的代碼調(diào)優(yōu)捶码。
在CPU Monitor中,我們可以獲取.trace(Method Tracer)文件來進(jìn)行性能分析或链。
-
在CPU Monitor中惫恼,點擊
Start Method Tracing。
-
在交互完成后澳盐,再次點擊
以停止跟蹤祈纯。
此時會生成package_yyyy.mm.dd_hh.mm.ss.trace的文件,Android Studio會默認(rèn)打開該文件洞就,展示入下圖:
圖中給出了方法對應(yīng)的CPU使用時間盆繁。但該工具無法查看方法等調(diào)用棧掀淘,即方法的parent和其child方法旬蟋,同時給的列類型太少,比如realtiem革娄,cputime以及遞歸調(diào)用次數(shù)等等倾贰。因此,我們需要其他的分析工具拦惋,比如Systrace和Traceview
Systrace
Systrace用于UI性能的分析匆浙,通過在瀏覽器中打開trace.html文件可以看到每一幀所執(zhí)行的方法以及需要的時間,是否達(dá)到60的幀率厕妖。
有三種方式可以獲取trace.html:
-
使用SDK中的python腳步
android4.3+
$ cd android-sdk/platform-tools/systrace $ python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
android4.2-
$ cd android-sdk/platform-tools/systrace $ python systrace.py --set-tags=gfx,view,wm $ adb shell stop $ adb shell start
-
添加代碼塊(android4.3+ only)
Trace.beginSection() 開始首尼,以 Trace.endSection() 結(jié)束。
使用DDMS工具
最終獲取到的以trace.html為結(jié)尾的文件言秸,可直接通過瀏覽器打開
以上是未來域的首頁列表滑動過程的System trace软能。
從圖中,我們可以看到在中間紅框中有多個'F'举畸,在表格里每一個'F'都表示一幀查排,綠色的表示在16ms內(nèi)完成了所有的存在的處理。黃色表示該未在16ms內(nèi)完成處理抄沮,但沒消耗太多時間跋核,可能影響接下來的一幀數(shù)據(jù)。紅色表示性能很差叛买,消耗了過多時間砂代,可能會丟棄接下來的多幀數(shù)據(jù)。
我們可以看到在中間一部分出現(xiàn)了多個黃色和幾個紅色幀率挣,
對于這些出錯幀刻伊,我們可以點擊對應(yīng)的'F',然后按'M'按鈕可以高亮顯示該幀區(qū)域,查看窗口關(guān)于出現(xiàn)該現(xiàn)象的原因以及解決建議娃圆。你也可以直接點擊右邊紅框Alerts來查看錯誤的類型玫锋。可以看到存在33個Scheduling delay讼呢。關(guān)于該提示撩鹿,大致是存在需要被處理的特定片段的線程,未及時的被cpu處理悦屏,而導(dǎo)致線程需要更長時間去處理节沦。
我們可以直觀的確定當(dāng)前操作是否存在掉幀的情況,但在trace.html中我們無法定位到特定方法础爬,也看不到具體的執(zhí)行時間甫贯,如果需要進(jìn)一步確認(rèn)出現(xiàn)問題的方法,就需要使用TraceView看蚜。
TraceView
TraceView是一個強(qiáng)大的性能分析工具叫搁,使用該工具加載trace文件,以圖形的形式展示代碼的執(zhí)行時間供炎、次數(shù)及調(diào)用棧渴逻,便于我們分析。
使用TraceView前音诫,我們需要獲取.trace文件惨奕,可以通過以下三種方法獲取:
-
使用代碼塊
在對應(yīng)的代碼區(qū)間內(nèi)輸入如下代碼塊:
// start tracing to "/sdcard/calc.trace" Debug.startMethodTracing("calc"); // ... // stop tracing Debug.stopMethodTracing();
-
使用CPU Monitor
如CPU Monitor段落中的1竭钝,2兩步操作梨撞。
使用DDMS工具
獲取到trace文件后,可以在Android Device Monitor中打開香罐,會展示出如下圖表
圖中可按順序分為線程面板1卧波,時間面板2,數(shù)據(jù)分析面板3穴吹。
線程面板展示了在記錄時間區(qū)間內(nèi)活動的線程幽勒,我們可以看到常見的main線程,對應(yīng)的時間面板中港令,有很多色塊組成啥容,這些色塊表示采集過程中方法調(diào)用時間線,每一個色塊代表一個方法顷霹。當(dāng)點擊色塊的時候咪惠,會在數(shù)據(jù)分析面板中顯示對應(yīng)的方法,以及其調(diào)用棧和相關(guān)性能數(shù)據(jù)淋淀。該面板中的列字段大致意義如下:
列名 | 描述 |
---|---|
Name | 該線程運行過程中所調(diào)用的函數(shù)名 |
Incl Cpu Time | 某函數(shù)占用的CPU時間包含內(nèi)部調(diào)用其它函數(shù)的CPU時間 |
Excl Cpu Time | 某函數(shù)占用的CPU時間但不含內(nèi)部調(diào)用其它函數(shù)所占用的CPU時間 |
Incl Real Time | 某函數(shù)運行的真實時間以毫秒為單位內(nèi)含調(diào)用其它函數(shù)所占用的真實時間 |
Excl Real Time | 某函數(shù)運行的真實時間以毫秒為單位不含調(diào)用其它函數(shù)所占用的真實時間 |
Call+Recur Calls/Total | 某函數(shù)被調(diào)用次數(shù)以及遞歸調(diào)用次數(shù)/總調(diào)用次數(shù) |
Real Time/Call | 同CPU Time/Call類似只不過統(tǒng)計單位換成了真實時間 |
要定位到問題遥昧,就需要結(jié)合這些數(shù)據(jù)來獲取不同類型的潛在可優(yōu)化的熱點,然后進(jìn)行優(yōu)化,具體可參考TraceView工具的使用中的處理技巧炭臭。
GPU Monitor
GPU Monitor顯示視圖的渲染情況永脓,與直接在手機(jī)開發(fā)者模式中開啟GPU分析視圖一樣。
每一幀最好的狀態(tài)是保持在綠線以內(nèi)鞋仍。
Network Monitor
在Studio中常摧,通過該工具可以直觀的檢測網(wǎng)絡(luò)的使用情況,及其上傳和下載的流量威创。在Android Studio3.0中的升級版Monitor本中落午,提供了抓包功能!android可以不再需要設(shè)置代理肚豺,使用第三方抓包工具了溃斋!強(qiáng)大!
選擇2區(qū)域進(jìn)行你需要抓包的區(qū)域吸申, 會在3窗口會顯示接受或發(fā)送的文件信息梗劫,包括文件名,大小呛谜,類型在跳,狀態(tài)和時間等信息。點擊3中的鏈接名隐岛,會在4窗口展示更詳細(xì)的信息,可以查看response瓷翻,消息頭等數(shù)據(jù)聚凹。
獲取當(dāng)前top的Activity
linux:
adb shell dumpsys activity | grep "mFocusedActivity"
windows:
adb shell dumpsys activity | findstr "mFocusedActivity"
相關(guān)文章
- Speed up your app:基本涵蓋了android主流的性能分析工具,以及使用示例齐帚。
- Android Device Monitor:官方關(guān)于ADM的使用教程
- 調(diào)查 RAM 使用情況官方教程笼恰,還是中文的亩钟,介紹了關(guān)于android中內(nèi)存分析的一些方法。