性能分析工具Systrace的使用及說明
Systrace介紹
Systrace 是Android平臺(tái)提供的一款工具,用于記錄短期內(nèi)的設(shè)備活動(dòng)。該工具會(huì)生成一份報(bào)告,其中匯總了Android內(nèi)核中的數(shù)據(jù),例如CPU調(diào)度程序、磁盤活動(dòng)和應(yīng)用線程。
這份報(bào)告可幫助我們了解如何以最佳方式改善應(yīng)用或游戲的性能。
Systrace 工具用于顯示整個(gè)設(shè)備在做些什么,不過也可用于識(shí)別應(yīng)用中的卡頓。Systrace 的系統(tǒng)開銷非常小,因此你可以在插樁測(cè)試期間體驗(yàn)實(shí)際卡頓情況。
Systrace報(bào)告示例:
這份報(bào)告提供了 Android 設(shè)備在給定時(shí)間段內(nèi)的系統(tǒng)進(jìn)程的總體情況,還會(huì)檢查所捕獲的跟蹤信息,以突出顯示它所觀察到的問題(例如界面卡頓或耗電量高)。
Systrace使用方法詳解
要想使用Systrace分析性能,我們首先需要找到Systrace工具,以及使用該工具生成一份.html的報(bào)告文件。
使用命令行捕獲Systreace報(bào)告文件
systrace命令
systrace命令會(huì)調(diào)用Systrace工具,以收集和檢查設(shè)備上在系統(tǒng)一級(jí)運(yùn)行的所有進(jìn)程的時(shí)間信息。
systrace命令是一個(gè)Python腳本,所以需要進(jìn)行如下準(zhǔn)備:
- Android Studio下載并安裝最新的Android SDK Tools。
- 安裝Python并將其添加到工作站的執(zhí)行路徑中(注意,這里要求Python2.7版本)。
- 使用USB調(diào)試連接將搭載Android 4.3(API 級(jí)別 18)或更高版本的設(shè)備連接到開發(fā)系統(tǒng)。
systrace 命令在 Android SDK Tools 工具包中提供,位于 android-sdk/platform-tools/systrace/。
例如,作者電腦上sstrace位置為:/Users/apple/Library/Android/sdk/platform-tools/systrace。
命令語法
要為應(yīng)用生成HTML報(bào)告,我們需要使用以下語法從命令行運(yùn)行systrace:
python systrace.py [options] [categories]
命令和命令選項(xiàng)
示例1:
python ./systrace.py -t 5 -o mynewtrace.html
- mynewtrace.html是最終的生成產(chǎn)物。
- 5代表捕獲5s的數(shù)據(jù)。
示例2:
python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \ binder_driver hal dalvik camera input res
mynewtrace.html之后的參數(shù),表示類別列表。
提示:如果要在跟蹤輸出中查看任務(wù)名稱,必須在命令參數(shù)中添加 sched 類別。
查看已連接設(shè)備支持的類別列表
命令如下:
python systrace.py --list-categories
示例:
打開System報(bào)告
通過以上操作,會(huì)生成一個(gè)HTML文件,我們可以使用chrome瀏覽器,地址欄輸入chrome://tracing/ 來查看報(bào)告。
界面如下(點(diǎn)擊Load按鈕加載HTML文件即可):
查看報(bào)告元素
Systrace 會(huì)生成包含多個(gè)部分的輸出 HTML 文件。該報(bào)告列出了每個(gè)進(jìn)程的線程。如果給定線程會(huì)渲染界面幀,該報(bào)告還會(huì)沿時(shí)間軸指明所渲染的幀。當(dāng)您在報(bào)告中從左向右移動(dòng)時(shí),時(shí)間會(huì)向前推移。
報(bào)告從上到下包含以下幾個(gè)部分。
用戶互動(dòng)
第一部分包含表示應(yīng)用或游戲中的具體用戶互動(dòng)(例如點(diǎn)按設(shè)備屏幕)的條形圖。這些互動(dòng)可用作有用的時(shí)間標(biāo)記。
CPU 活動(dòng)
下一部分顯示了表示每個(gè) CPU 中的線程活動(dòng)的條形圖。這些條形會(huì)顯示所有應(yīng)用(包括你的應(yīng)用或游戲)中的 CPU 活動(dòng)。
CPU 活動(dòng)部分可以展開,展開后您就可以查看每個(gè) CPU 的時(shí)鐘頻率。
圖 1 展示了一個(gè)收起后的 CPU 活動(dòng)部分示例,圖 2 展示了顯示時(shí)鐘頻率的展開后版本:
系統(tǒng)事件
此部分中的直方圖會(huì)顯示特定的系統(tǒng)級(jí)事件,例如特定對(duì)象的紋理計(jì)數(shù)和總大小。
值得仔細(xì)檢查的直方圖是標(biāo)記為 SurfaceView 的直方圖。計(jì)數(shù)表示已傳遞到顯示管道并等待顯示在設(shè)備屏幕上的組合幀緩沖區(qū)的數(shù)量。由于大多數(shù)設(shè)備都會(huì)進(jìn)行雙重或三重緩沖,因此該計(jì)數(shù)幾乎總為 0、1 或 2。
描繪 Surface Flinger 進(jìn)程(包括 VSync 事件和界面線程交換工作)的其他直方圖,如圖所示:
顯示幀
描繪了一條多色線條,后面是成堆的條形。這些形狀表示已創(chuàng)建的特定線程的狀態(tài)和幀堆棧。
堆棧的每個(gè)層級(jí)代表對(duì) beginSection() 的一次調(diào)用,或您為應(yīng)用或游戲定義的自定義跟蹤事件的開頭。
每個(gè)條形堆上方的多色線條表示特定線程隨時(shí)間變化的一組狀態(tài)。每段線條可以包含以下顏色之一:
- 綠色:正在運(yùn)行
- 線程正在完成與某個(gè)進(jìn)程相關(guān)的工作或正在響應(yīng)中斷。
- 藍(lán)色:可運(yùn)行
- 線程可以運(yùn)行但目前未進(jìn)行調(diào)度。
- 白色:休眠
- 線程沒有可執(zhí)行的任務(wù),可能是因?yàn)榫€程在遇到斥鎖定時(shí)被阻止。
- 橙色:不可中斷的休眠
- 線程在遇到 I/O 操作時(shí)被阻止或正在等待磁盤操作完成。
- 紫色:可中斷的休眠
- 線程在遇到另一項(xiàng)內(nèi)核操作(通常是內(nèi)存管理)時(shí)被阻止。
注意:在Systrace報(bào)告中,你可以點(diǎn)擊該線條以確定該線程在給定時(shí)間由哪個(gè)CPU控制。
鍵盤快捷鍵
下表列出了查看 Systrace 報(bào)告時(shí)可以使用的鍵盤快捷鍵:
使用工具幫助定位性能問題
瀏覽 Systrace 報(bào)告時(shí),您可以通過執(zhí)行以下一項(xiàng)或多項(xiàng)操作來更輕松地識(shí)別性能問題:
- 通過在時(shí)間間隔周圍繪制一個(gè)矩形來選擇所需的時(shí)間間隔。
- 使用標(biāo)尺工具標(biāo)記或突出顯示問題區(qū)域。
- 依次點(diǎn)擊 View Options > Highlight VSync,以顯示每項(xiàng)顯示屏刷新操作。
- 如果覺得頁(yè)面中的信息太多了,想要篩選,可以點(diǎn)擊Processes菜單,在彈出列表中進(jìn)行篩選。
檢查界面幀和提醒
如圖所示,Systrace 報(bào)告列出了渲染界面幀的每個(gè)進(jìn)程,并指明了沿時(shí)間軸渲染的每個(gè)幀。在 16.6 毫秒內(nèi)渲染的必須保持每秒 60 幀穩(wěn)定幀速率的幀會(huì)以綠色圓圈表示。渲染時(shí)間超過 16.6 毫秒的幀會(huì)以黃色或紅色幀圓圈表示。
點(diǎn)擊某個(gè)幀圓圈可將其突出顯示,并提供有關(guān)系統(tǒng)為渲染該幀所做工作的其他信息,包括提醒。此報(bào)告還會(huì)顯示系統(tǒng)在渲染該幀時(shí)執(zhí)行的方法。您可以調(diào)查這些方法以確定界面卡頓的可能原因。
如果所示,選擇有問題的幀后,跟蹤報(bào)告下方會(huì)顯示一條提醒,用于指明問題所在。
選擇運(yùn)行速度慢的幀后,您可能會(huì)在報(bào)告的底部窗格中看到一條提醒。
點(diǎn)擊窗口最右側(cè)的Alerts標(biāo)簽頁(yè)可以查看此工具在你的跟蹤記錄中發(fā)現(xiàn)的每條提醒以及設(shè)備觸發(fā)每條提醒的次數(shù),如下圖所示。Alerts 面板可幫助你了解跟蹤記錄中出現(xiàn)的問題以及這些問題導(dǎo)致出現(xiàn)卡頓的頻率。我們也可以將此面板視為要修正的錯(cuò)誤列表。通常情況下,只需對(duì)一個(gè)區(qū)域進(jìn)行細(xì)微改動(dòng)或改進(jìn)即可移除整組提醒。
Systrace的擴(kuò)展使用
Systrace(系統(tǒng)跟蹤)僅在系統(tǒng)級(jí)別顯示進(jìn)程的相關(guān)信息,這樣導(dǎo)致有時(shí)很難知道APP的哪些方法是在給定時(shí)間針對(duì)系統(tǒng)事件執(zhí)行的。
例如,我們?cè)诮鉀Q卡頓問題,當(dāng)查看系統(tǒng)跟蹤信息輸出后,你可能會(huì)懷疑應(yīng)用中的某些方法是導(dǎo)致卡頓的因素。例如,如果時(shí)間軸顯示某個(gè)幀的呈現(xiàn)速度較慢是因?yàn)?RecyclerView 花費(fèi)很長(zhǎng)時(shí)間導(dǎo)致的,這時(shí)我們需要更多的信息來進(jìn)行判斷。
如何做呢?
我們可以在相關(guān)代碼中添加跟蹤標(biāo)記(定義自定義事件),然后重新運(yùn)行 systrace 以獲取更多信息。在新的系統(tǒng)跟蹤信息中,時(shí)間軸會(huì)顯示應(yīng)用中的方法的調(diào)用時(shí)間和執(zhí)行時(shí)長(zhǎng)。
定義自定義事件
Android 平臺(tái)提供了一個(gè)跟蹤 API,可用于為特定的代碼段添加標(biāo)簽。如果您捕獲應(yīng)用的“調(diào)試”版本的新系統(tǒng)跟蹤并添加 -a 選項(xiàng)(如以下代碼段所示),這些自定義事件便會(huì)顯示在 Systrace 報(bào)告中:
python systrace.py -a com.example.myapp -b 16384 \ -o my_systrace_report.html sched freq idle am wm gfx view binder_driver hal \ dalvik camera input res
必須提供 -a 選項(xiàng)才能跟蹤應(yīng)用;如果沒有此選項(xiàng),應(yīng)用的方法將不會(huì)顯示在 Systrace 報(bào)告中。
注意:該方法與使用 Debug 類不同,后者可幫助您通過生成 .trace 文件來檢查應(yīng)用 CPU 的詳細(xì)使用情況。
代碼中添加
在 Android 4.3(API 級(jí)別 18)及更高版本中,我們可以在代碼中使用 Trace 類來定義隨后會(huì)出現(xiàn)在 Perfetto 和 Systrace 報(bào)告中的自定義事件,如以下代碼段所示。
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Trace.beginSection("MyAdapter.onCreateViewHolder"); MyViewHolder myViewHolder; try { myViewHolder = MyViewHolder.newInstance(parent); } finally { // In try and catch statements, always call "endSection()" in a // "finally" block. That way, the method is invoked even when an // exception occurs. Trace.endSection(); } return myViewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { Trace.beginSection("MyAdapter.onBindViewHolder"); try { try { Trace.beginSection("MyAdapter.queryDatabase"); RowItem rowItem = queryDatabase(position); dataset.add(rowItem); } finally { Trace.endSection(); } holder.bind(dataset.get(position)); } finally { Trace.endSection(); } } }
注意:如果多次調(diào)用 beginSection(),調(diào)用 endSection() 只會(huì)結(jié)束最后調(diào)用的 beginSection() 方法。因此,對(duì)于嵌套調(diào)用(如以下代碼段中所示),請(qǐng)務(wù)必將每次對(duì) beginSection() 的調(diào)用與一次對(duì) endSection() 的調(diào)用正確匹配。
此外,我們不能在一個(gè)線程上調(diào)用 beginSection(),而在另一個(gè)線程上結(jié)束它;而是必須在同一個(gè)線程上調(diào)用這兩個(gè)方法。
總結(jié)
通過本文學(xué)習(xí)了:
- 性能分析工具Systrace的介紹。
- Systrace報(bào)告文件如何進(jìn)行采集。
- 如何使用工具來查看Systrace報(bào)告文件。
- 如何使用Systrace來分析性能問題。
- Systrace工具的使用及使用技巧。
- 如何添加和使用自定義事件。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解
本篇文章主要介紹了Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02Android自定義View實(shí)現(xiàn)數(shù)字密碼鎖
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)數(shù)字密碼鎖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06sweet alert dialog 在android studio應(yīng)用問題說明詳解
這篇文章主要介紹了sweet alert dialog 在android studio應(yīng)用問題說明詳解的相關(guān)資料,本文圖文并茂介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09關(guān)于Android Studio封裝SDK的那些事兒
這篇文章主要給大家介紹了關(guān)于Android Studio封裝SDK的那些事兒,文中通過圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09