Systrace 分析效能工具使用方法詳解
Systrace
允許您在系統級別收集和檢查裝置上執行的所有程序的計時資訊。 它將來自Android
核心的資料(例如CPU排程
程式,磁碟活動和應用程式執行緒)組合起來,以生成HTML
報告。
本篇文章主要介紹 Android
開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容:
- Systrace 簡介
- Systrace 使用方法
- 使用命令列抓取 Systrace
- 使用Systrace 檢測UI 效能
- 使用Systrace 檢測警告以及掉幀問題
- 檢視trace 檔案的快捷鍵
- 程式碼中新增trace 標記具體分析問題所在
- 使用TraceView 分析trace Log
歡迎關注微信公眾號:程式設計師Android 公眾號ID:ProgramAndroid 獲取更多資訊
微信公眾號:ProgramAndroid
我們不是牛逼的程式設計師,我們只是程式開發中的墊腳石。 我們不傳送紅包,我們只是紅包的搬運工。
1.Systrace 簡介
Systrace 允許您在系統級別收集和檢查裝置上執行的所有程序的計時資訊。 它將來自Android
核心的資料(例如CPU排程
程式,磁碟活動和應用程式執行緒)組合起來,以生成HTML報告。
2.Systrace 使用方法
抓取Systrace 的方法
如果想分析Android
系統或者app
的問題,首先我們需要抓取Systrace
檔案分析並找出引起系統卡頓,或者app反應慢
的原因,然後在原始碼上解決引起慢的問題。
抓取Systrace 的方法:
- 首先連結手機,開啟
Android Device Monitor
,選擇要分析的程序(比如com.google.process.gapps
),點選Capture system wide trace using Android systrace
(下圖右上角箭頭所指的地方)
抓取Systrace的方法
- 配置需要抓取Systrace的內容
此時根據不同的需求,配置抓取不同的trace
時間(時間請勿過長,否則會導致抓取內容部分丟失),內容等,然後點選OK
,操作要分析系統卡頓或app
執行緩慢的部分,系統會自動收集執行時的資訊,然後用Chrome 瀏覽器打
開生成的trace
根據不同的需求,配置抓取不同的trace 時間,內容等
注意: 假如抓取過多次trace,為避免資料丟失,請及時清除快取中的內容,清理地方在
Android Device Monitor
的右下角,如下圖所示
及時清除快取中的資訊,防止抓取trace內容無效
用Chrome 瀏覽器
開啟生成的trace 檔案
,如下圖所示,裡面會包含每個CPU,
以及圖形渲染,輸入事件等等內容。
用Chrome 瀏覽器開啟生成的trace 檔案
抓取的Trace
報告提供了Android
系統程序在特定時間段內的整體情況。 它檢查捕獲的跟蹤資訊,並突出顯示其檢查到的問題,例如在顯示運動或動畫時UI粗糙
,並提供關於如何解決這些問題的建議。
但是,systrace
不會在應用程式程序中收集有關程式碼執行的資訊。 有關您的應用程式執行哪些方法以及使用多少CPU資源
的更多詳細資訊,請使用Android Studio
的內建CPU分析器
,或生成跟蹤日誌並使用Traceview
檢視它們。
3.使用命令列抓取 Systrace
本文件介紹瞭如何從命令列生成systrace
報告,瀏覽由該工具生成的跟蹤檔案,並使用它們來分析和提高應用程式使用者介面(UI)
的效能。
抓取systrace
之前,請完成以下步驟:
- 下載並安裝
Android SDK Tools
- 安裝
Python ,
並將其包含在工作站的執行路徑中。 - 連線手機,開啟開發者選項中的
USB Debug
選項 。 Systrace
儲存路徑如下android-sdk/platform-tools/systrace/
使用命令列抓取 Systrace
的語法如下:python systrace.py [options] [categories]
例如,以下命令呼叫systrace
在10
秒鐘內記錄裝置程序,包括圖形程序,並生成一個名為mynewtrace
的HTML
報告:
python systrace.py --time=10 -o mynewtrace.html gfx
如果不指定任何類別或選項,systrace
將生成包含所有可用類別的報告,並使用預設設定。 可用的類別取決於您使用的連線裝置。
Global options
Commands and command options
4.使用Systrace 檢測UI 效能
systrace
對於檢查應用程式的UI效能
特別有用,因為它可以分析您的程式碼和幀速率以識別問題區域並提供可能的解決方案。 開始,按照以下步驟進行:
- 連線手機並執行您的
app
。 - 使用以下命令執行systrace:
python systrace.py view --time = 10
- 操作您的應用 10秒後,
systrace
生成一個HTML報告。 - 使用網路瀏覽器開啟HTML報告。
您現在可以與報告進行互動,以便在記錄期間檢查裝置CPU
使用情況。 以下部分介紹如何檢查報告中的資訊以查詢和修復UI效能問題
。
5. 使用Systrace 檢測警告以及掉幀問題
如下報告列出了每個程序呈現UI幀,並指示沿著時間線的每個渲染幀。 在綠色框架
圓圈中指示在16.6毫秒內呈現的幀以保持每秒穩定60幀。 花費16.6毫秒以上渲染的幀用黃色
或紅色
框圈表示。
UI渲染幀率檢視
注意: 在執行
Android 5.0(API級別21)
或更高版本的裝置上, UI 渲染的工作是在UI Thread
和RenderThread
兩個執行緒完成。 在之前的版本中,建立框架的所有工作都是在UI Thread
上完成的。
點選一個F框架圈
可以提供有關係統為渲染該框架而完成的工作的其他資訊,包括警報。 它還向您展示了在渲染該框架時系統正在執行的方法,因此您可以調查這些方法是否導致UI jank
。
點選黃色或紅色幀按鈕,會分析提示此幀卡頓的資訊
選擇慢幀後,您可能會在報告的底部窗格中看到警報。 上圖中顯示的Alert
提出,框架的主要問題是在ListView
回收和重新繫結中花費了太多的時間。 跟蹤中有相關事件的連結可以解釋更多關於系統在這段時間內正在做什麼的事情。
要檢視工具在trace
中發現的每個Alert
以及裝置觸發Alert
的次數,請單擊視窗最右側的Alerts
選項卡,如下圖所示。Alerts
面板可幫助您檢視發生了哪些問題,以及發生的頻率。 將Alert
面板看作是要修復的錯誤列表, 通常情況下,一個區域的微小變化或改進可以消除應用程式中的全部警報。
Alert 分析面板
Frame Input File Metrics Alerts 等面板
如果你在UI Thread
上做太多的工作,你需要找出哪些方法消耗了太多的CPU時間
。
一種方法是新增跟蹤標記(請參閱檢測應用程式碼)到您認為會導致這些瓶頸的方法,以檢視這些函式呼叫是否顯示在systrace
中。 如果您不確定哪些方法可能會在UI執行緒上造成瓶頸,請使用Android Studio
的內建CPU分析器,
或者生成跟蹤日誌並使用Traceview
檢視它們。
6. 檢視trace 檔案的快捷鍵
檢視trace 檔案的快捷鍵如圖
7. 程式碼中新增trace 標記具體分析問題所在
由於systrace
是在系統級顯示有關程序的資訊,因此很難在HTML
報告中的某個特定時間知道您的應用程式正在執行什麼方法。 在Android 4.3(API級別18)
及更高版本中,您可以使用程式碼中的Trace
類在HTML
報告中標記執行事件。 您不需要用程式碼來記錄systrace
的跟蹤記錄,但是這樣做可以幫助您檢視應用程式程式碼的哪些部分可能會導致執行緒掛起或UI斷線。 這種方法與使用Debug
類不同,Trace
類簡單地將標誌新增到systrace
報告中,而Debug
類可幫助您通過生成.trace
檔案來檢查詳細的app CPU
使用情況。
要生成包含已檢測的跟蹤事件的systrace HTML
報告,需要使用-a
或--app
命令列選項執行systrace
,並指定應用程式的包名稱。
通常我們在懷疑引起jank程式碼地方,新增如下內容:Trace.beginSection("MyAdapter.onCreateViewHolder");
和 Trace.endSection();
,主要這兩個是成對出現的。
程式碼舉例
多次呼叫beginSection(String)
時,呼叫endSection()
只會結束最近呼叫的beginSection(String)
方法。 因此,對於巢狀的呼叫,例如上面示例中的呼叫,您需要確保通過呼叫endSection()
將每個呼叫正確匹配到beginSection()
。
此外,您不能在一個執行緒上呼叫beginSection()
並從另一個執行緒結束 - 您必須從同一執行緒呼叫endSection()
。
8. 使用TraceView 分析trace Log
Traceview
是提供跟蹤日誌的圖形表示的工具。 您可以通過使用Debug
類來設定程式碼來生成日誌。 這種跟蹤方法非常精確,因為您可以準確指定要啟動的程式碼中的哪個位置,並停止記錄跟蹤資料。 如果尚未生成這些跟蹤日誌並將其從連線的裝置儲存到本地計算機,請轉至通過檢測應用程式生成跟蹤日誌。 使用Traceview
檢查這些日誌可幫助您除錯您的應用程式並剖析其效能。
提示:可以使用命令列中的dmtracedump
來生成跟蹤日誌檔案的圖形呼叫堆疊圖。
如果您不需要檢視通過使用Debug
類檢測應用程式來記錄的跟蹤日誌,則可以使用Android Studio 3.0
及更高版本中包含的CPU
分析器來檢視應用程式的執行緒和記錄方法跟蹤。
使用Android Device Monitor
可以檢視trace Log內容,步驟如下,開啟Android Device Monitor
,選擇File
,然後開啟*.trace log分析。
當然,你也可以使用Android Device Monitor
的圖形按鍵進行trace
的抓取與檢視。
使用Android Device Monitor 檢視trace Log
開啟跟蹤日誌後,Traceview
使用以下兩個窗格顯示日誌資料:
-
- 時間軸窗格: 描述每個執行緒何時進入和退出方法的時間軸窗格
-
- 配置檔案窗格: 總結每個執行緒在跟蹤日誌的執行期間的配置檔案窗格 以下各節提供有關traceview輸出窗格的附加資訊。
1.時間軸窗格
每個執行緒的執行都顯示在自己的程序中,並且時間向右增加。 每種方法都以不同的顏色顯示。 第一行下方的細線顯示所選方法的子項(從入口到出口),如下圖所示。
時間軸窗格
2. 配置檔案窗格
如下圖所示,配置檔案窗格提供了系統在跟蹤日誌期間執行的每種方法的列表以及執行這些方法所用的時間。 呼叫另一個方法的方法稱為父級方法,父級呼叫的方法稱為其子級。 當您通過單擊方法選擇一種方法時,它會在兩個單獨的節點下顯示其父項和子項。
對於每種方法(頂級節點),該表都顯示包含和排他時間(以毫秒為單位)以及總時間的百分比。獨佔時間是執行方法自己的程式碼的時間,而包含時間是執行方法自己的程式碼的時間加上執行子程式的時間。定時資訊也以CPU時間
和實時的方式報告。 CPU時間
只考慮執行緒主動使用CPU時間的時間
,實時提供絕對時間資訊,從您的應用程式進入方法的時刻到退出該方法的時間 - 無論執行緒處於活動狀態還是休眠狀態。
對於配置檔案窗格中的每個頂級節點,表中的Calls + Rec
,Calls / Total
列(圖2中未顯示)將報告該方法的呼叫次數和遞迴呼叫次數。或者,對於父級和子級方法,此列顯示方法在頂級節點中是方法的子級或父級的呼叫次數。
image.png
Traceview 已知問題
Traceview
日誌記錄不能很好地處理執行緒,導致以下問題:
-
1.如果執行緒在分析期間退出,執行緒名稱不會被髮射
(在Android 5.1及更高版本中被修復)
。 -
- 虛擬機器重用執行緒ID。 如果一個執行緒停止,另一個執行緒開始,他們可能會得到相同的ID。
作者:ProgramAndroid 連結:https://www.jianshu.com/p/75aa88d1b575 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。