極力推薦文章:歡迎收藏
Android 干貨分享
Systrace
允許您在系統級別收集和檢查設備上運行的所有進程的計時信息。 它將來自Android
內核的數據(例如CPU調度
程序,磁盤活動和應用程序線程)組合起來,以生成HTML
報告。
本篇文章主要介紹 Android
開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:
- Systrace 簡介
- Systrace 使用方法
- 使用命令行抓取 Systrace
- 使用Systrace 檢測UI 性能
- 使用Systrace 檢測警告以及掉幀問題
- 查看trace 文件的快捷鍵
- 代碼中添加trace 標記具體分析問題所在
- 使用TraceView 分析trace Log
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的內容
此時根據不同的需求,配置抓取不同的trace
時間(時間請勿過長,否則會導致抓取內容部分丟失),內容等,然后點擊OK
,操作要分析系統卡頓或app
運行緩慢的部分,系統會自動收集運行時的信息,然后用Chrome 瀏覽器打
開生成的trace
文件 。
注意:
假如抓取過多次trace,為避免數據丟失,請及時清除緩存中的內容,清理地方在Android Device Monitor
的右下角,如下圖所示
用Chrome 瀏覽器
打開生成的trace 文件
,如下圖所示,里面會包含每個CPU,
以及圖形渲染,輸入事件等等內容。
抓取的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
將生成包含所有可用類別的報告,並使用默認設置。 可用的類別取決於您使用的連接設備。
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毫秒以上渲染的幀用黃色
或紅色
框圈表示。
注意:
在運行Android 5.0(API級別21)
或更高版本的設備上, UI 渲染的工作是在UI Thread
和RenderThread
兩個線程完成。 在之前的版本中,創建框架的所有工作都是在UI Thread
上完成的。
點擊一個F框架圈
可以提供有關系統為渲染該框架而完成的工作的其他信息,包括警報。 它還向您展示了在渲染該框架時系統正在執行的方法,因此您可以調查這些方法是否導致UI jank
。
選擇慢幀后,您可能會在報告的底部窗格中看到警報。 上圖中顯示的Alert
提出,框架的主要問題是在ListView
回收和重新綁定中花費了太多的時間。 跟蹤中有相關事件的鏈接可以解釋更多關於系統在這段時間內正在做什么的事情。
要查看工具在trace
中發現的每個Alert
以及設備觸發Alert
的次數,請單擊窗口最右側的Alerts
選項卡,如下圖所示。
Alerts
面板可幫助您查看發生了哪些問題,以及發生的頻率。 將Alert
面板看作是要修復的錯誤列表, 通常情況下,一個區域的微小變化或改進可以消除應用程序中的全部警報。
如果你在UI Thread
上做太多的工作,你需要找出哪些方法消耗了太多的CPU時間
。
一種方法是添加跟蹤標記(請參閱檢測應用代碼)到您認為會導致這些瓶頸的方法,以查看這些函數調用是否顯示在systrace
中。 如果您不確定哪些方法可能會在UI線程上造成瓶頸,請使用Android Studio
的內置CPU分析器,
或者生成跟蹤日志並使用Traceview
查看它們。
6. 查看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
的抓取與查看。
打開跟蹤日志后,Traceview
使用以下兩個窗格顯示日志數據:
-
- 時間軸窗格:
描述每個線程何時進入和退出方法的時間軸窗格
- 時間軸窗格:
-
- 配置文件窗格:
總結每個線程在跟蹤日志的執行期間的配置文件窗格
以下各節提供有關traceview輸出窗格的附加信息。
- 配置文件窗格:
1.時間軸窗格
每個線程的執行都顯示在自己的進程中,並且時間向右增加。 每種方法都以不同的顏色顯示。 第一行下方的細線顯示所選方法的子項(從入口到出口),如下圖所示。
2. 配置文件窗格
如下圖所示,配置文件窗格提供了系統在跟蹤日志期間執行的每種方法的列表以及執行這些方法所用的時間。
調用另一個方法的方法稱為父級方法,父級調用的方法稱為其子級。 當您通過單擊方法選擇一種方法時,它會在兩個單獨的節點下顯示其父項和子項。
對於每種方法(頂級節點),該表都顯示包含和排他時間(以毫秒為單位)以及總時間的百分比。獨占時間是執行方法自己的代碼的時間,而包含時間是執行方法自己的代碼的時間加上執行子程序的時間。定時信息也以CPU時間
和實時的方式報告。 CPU時間
只考慮線程主動使用CPU時間的時間
,實時提供絕對時間信息,從您的應用程序進入方法的時刻到退出該方法的時間 - 無論線程處於活動狀態還是休眠狀態。
對於配置文件窗格中的每個頂級節點,表中的Calls + Rec
,Calls / Total
列(圖2中未顯示)將報告該方法的調用次數和遞歸調用次數。或者,對於父級和子級方法,此列顯示方法在頂級節點中是方法的子級或父級的調用次數。
Traceview 已知問題
Traceview
日志記錄不能很好地處理線程,導致以下問題:
-
1.如果線程在分析期間退出,線程名稱不會被發射
(在Android 5.1及更高版本中被修復)
。 -
- 虛擬機重用線程ID。 如果一個線程停止,另一個線程開始,他們可能會得到相同的ID。
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!