您好,登錄后才能下訂單哦!
這篇“性能分析工具Systrace如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“性能分析工具Systrace如何使用”文章吧。
Systrace 是Android平臺提供的一款工具,用于記錄短期內的設備活動。該工具會生成一份報告,其中匯總了Android內核中的數據,例如CPU調度程序、磁盤活動和應用線程。
這份報告可幫助我們了解如何以最佳方式改善應用或游戲的性能。
Systrace 工具用于顯示整個設備在做些什么,不過也可用于識別應用中的卡頓。Systrace 的系統開銷非常小,因此你可以在插樁測試期間體驗實際卡頓情況。
Systrace報告示例:
這份報告提供了 Android 設備在給定時間段內的系統進程的總體情況,還會檢查所捕獲的跟蹤信息,以突出顯示它所觀察到的問題(例如界面卡頓或耗電量高)。
要想使用Systrace分析性能,我們首先需要找到Systrace工具,以及使用該工具生成一份.html的報告文件。
systrace命令
systrace命令會調用Systrace工具,以收集和檢查設備上在系統一級運行的所有進程的時間信息。
systrace命令是一個Python腳本,所以需要進行如下準備:
Android Studio下載并安裝最新的Android SDK Tools。
安裝Python并將其添加到工作站的執行路徑中(注意,這里要求Python2.7版本)。
使用USB調試連接將搭載Android 4.3(API 級別 18)或更高版本的設備連接到開發系統。
systrace 命令在 Android SDK Tools 工具包中提供,位于 android-sdk/platform-tools/systrace/。
例如,作者電腦上sstrace位置為:/Users/apple/Library/Android/sdk/platform-tools/systrace。
命令語法
要為應用生成HTML報告,我們需要使用以下語法從命令行運行systrace:
python systrace.py [options] [categories]
命令和命令選項
示例1:
python ./systrace.py -t 5 -o mynewtrace.html
mynewtrace.html是最終的生成產物。
5代表捕獲5s的數據。
示例2:
python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \ binder_driver hal dalvik camera input res
mynewtrace.html之后的參數,表示類別列表。
提示:如果要在跟蹤輸出中查看任務名稱,必須在命令參數中添加 sched 類別。
查看已連接設備支持的類別列表
命令如下:
python systrace.py --list-categories
示例:
通過以上操作,會生成一個HTML文件,我們可以使用chrome瀏覽器,地址欄輸入chrome://tracing/ 來查看報告。
界面如下(點擊Load按鈕加載HTML文件即可):
Systrace 會生成包含多個部分的輸出 HTML 文件。該報告列出了每個進程的線程。如果給定線程會渲染界面幀,該報告還會沿時間軸指明所渲染的幀。當您在報告中從左向右移動時,時間會向前推移。
報告從上到下包含以下幾個部分。
用戶互動
第一部分包含表示應用或游戲中的具體用戶互動(例如點按設備屏幕)的條形圖。這些互動可用作有用的時間標記。
CPU 活動
下一部分顯示了表示每個 CPU 中的線程活動的條形圖。這些條形會顯示所有應用(包括你的應用或游戲)中的 CPU 活動。
CPU 活動部分可以展開,展開后您就可以查看每個 CPU 的時鐘頻率。
圖 1 展示了一個收起后的 CPU 活動部分示例,圖 2 展示了顯示時鐘頻率的展開后版本:
系統事件
此部分中的直方圖會顯示特定的系統級事件,例如特定對象的紋理計數和總大小。
值得仔細檢查的直方圖是標記為 SurfaceView 的直方圖。計數表示已傳遞到顯示管道并等待顯示在設備屏幕上的組合幀緩沖區的數量。由于大多數設備都會進行雙重或三重緩沖,因此該計數幾乎總為 0、1 或 2。
描繪 Surface Flinger 進程(包括 VSync 事件和界面線程交換工作)的其他直方圖,如圖所示:
顯示幀
描繪了一條多色線條,后面是成堆的條形。這些形狀表示已創建的特定線程的狀態和幀堆棧。
堆棧的每個層級代表對 beginSection() 的一次調用,或您為應用或游戲定義的自定義跟蹤事件的開頭。
每個條形堆上方的多色線條表示特定線程隨時間變化的一組狀態。每段線條可以包含以下顏色之一:
綠色:正在運行
線程正在完成與某個進程相關的工作或正在響應中斷。
藍色:可運行
線程可以運行但目前未進行調度。
白色:休眠
線程沒有可執行的任務,可能是因為線程在遇到斥鎖定時被阻止。
橙色:不可中斷的休眠
線程在遇到 I/O 操作時被阻止或正在等待磁盤操作完成。
紫色:可中斷的休眠
線程在遇到另一項內核操作(通常是內存管理)時被阻止。
注意:在Systrace報告中,你可以點擊該線條以確定該線程在給定時間由哪個CPU控制。
下表列出了查看 Systrace 報告時可以使用的鍵盤快捷鍵:
瀏覽 Systrace 報告時,您可以通過執行以下一項或多項操作來更輕松地識別性能問題:
通過在時間間隔周圍繪制一個矩形來選擇所需的時間間隔。
使用標尺工具標記或突出顯示問題區域。
依次點擊 View Options > Highlight VSync,以顯示每項顯示屏刷新操作。
如果覺得頁面中的信息太多了,想要篩選,可以點擊Processes菜單,在彈出列表中進行篩選。
如圖所示,Systrace 報告列出了渲染界面幀的每個進程,并指明了沿時間軸渲染的每個幀。在 16.6 毫秒內渲染的必須保持每秒 60 幀穩定幀速率的幀會以綠色圓圈表示。渲染時間超過 16.6 毫秒的幀會以黃色或紅色幀圓圈表示。
點擊某個幀圓圈可將其突出顯示,并提供有關系統為渲染該幀所做工作的其他信息,包括提醒。此報告還會顯示系統在渲染該幀時執行的方法。您可以調查這些方法以確定界面卡頓的可能原因。
如果所示,選擇有問題的幀后,跟蹤報告下方會顯示一條提醒,用于指明問題所在。
選擇運行速度慢的幀后,您可能會在報告的底部窗格中看到一條提醒。
點擊窗口最右側的Alerts標簽頁可以查看此工具在你的跟蹤記錄中發現的每條提醒以及設備觸發每條提醒的次數,如下圖所示。Alerts 面板可幫助你了解跟蹤記錄中出現的問題以及這些問題導致出現卡頓的頻率。我們也可以將此面板視為要修正的錯誤列表。通常情況下,只需對一個區域進行細微改動或改進即可移除整組提醒。
Systrace(系統跟蹤)僅在系統級別顯示進程的相關信息,這樣導致有時很難知道APP的哪些方法是在給定時間針對系統事件執行的。
例如,我們在解決卡頓問題,當查看系統跟蹤信息輸出后,你可能會懷疑應用中的某些方法是導致卡頓的因素。例如,如果時間軸顯示某個幀的呈現速度較慢是因為 RecyclerView 花費很長時間導致的,這時我們需要更多的信息來進行判斷。
如何做呢?
我們可以在相關代碼中添加跟蹤標記(定義自定義事件),然后重新運行 systrace 以獲取更多信息。在新的系統跟蹤信息中,時間軸會顯示應用中的方法的調用時間和執行時長。
定義自定義事件
Android 平臺提供了一個跟蹤 API,可用于為特定的代碼段添加標簽。如果您捕獲應用的“調試”版本的新系統跟蹤并添加 -a 選項(如以下代碼段所示),這些自定義事件便會顯示在 Systrace 報告中:
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 選項才能跟蹤應用;如果沒有此選項,應用的方法將不會顯示在 Systrace 報告中。
注意:該方法與使用 Debug 類不同,后者可幫助您通過生成 .trace 文件來檢查應用 CPU 的詳細使用情況。
代碼中添加
在 Android 4.3(API 級別 18)及更高版本中,我們可以在代碼中使用 Trace 類來定義隨后會出現在 Perfetto 和 Systrace 報告中的自定義事件,如以下代碼段所示。
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(); } } }
注意:如果多次調用 beginSection(),調用 endSection() 只會結束最后調用的 beginSection() 方法。因此,對于嵌套調用(如以下代碼段中所示),請務必將每次對 beginSection() 的調用與一次對 endSection() 的調用正確匹配。
此外,我們不能在一個線程上調用 beginSection(),而在另一個線程上結束它;而是必須在同一個線程上調用這兩個方法。
以上就是關于“性能分析工具Systrace如何使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。