極力推薦文章:歡迎收藏 Android 乾貨分享 html
#####閱讀五分鐘,每日十點,和您一塊兒終身學習,這裏是程序員Androidpython
Systrace
容許您在系統級別收集和檢查設備上運行的全部進程的計時信息。 它未來自Android
內核的數據(例如CPU調度
程序,磁盤活動和應用程序線程)組合起來,以生成HTML
報告。android
本篇文章主要介紹 Android
開發中的部分知識點,經過閱讀本篇文章,您將收穫如下內容:程序員
- Systrace 簡介
- Systrace 使用方法
- 使用命令行抓取 Systrace
- 使用Systrace 檢測UI 性能
- 使用Systrace 檢測警告以及掉幀問題
- 查看trace 文件的快捷鍵
- 代碼中添加trace 標記具體分析問題所在
- 使用TraceView 分析trace Log
#1.Systrace 簡介瀏覽器
Systrace 容許您在系統級別收集和檢查設備上運行的全部進程的計時信息。 它未來自Android
內核的數據(例如CPU調度
程序,磁盤活動和應用程序線程)組合起來,以生成HTML報告。緩存
若是想分析Android
系統或者app
的問題,首先咱們須要抓取Systrace
文件分析並找出引發系統卡頓,或者app反應慢
的緣由,而後在源碼上解決引發慢的問題。微信
抓取Systrace 的方法:網絡
Android Device Monitor
,選擇要分析的進程(好比com.google.process.gapps
),點擊Capture system wide trace using Android systrace
(下圖右上角箭頭所指的地方)此時根據不一樣的需求,配置抓取不一樣的trace
時間(時間請勿過長,不然會致使抓取內容部分丟失),內容等,而後點擊OK
,操做要分析系統卡頓或app
運行緩慢的部分,系統會自動收集運行時的信息,而後用Chrome 瀏覽器打
開生成的trace
文件 。app
注意: 假如抓取過屢次trace,爲避免數據丟失,請及時清除緩存中的內容,清理地方在
Android Device Monitor
的右下角,以下圖所示框架
用Chrome 瀏覽器
打開生成的trace 文件
,以下圖所示,裏面會包含每一個CPU,
以及圖形渲染,輸入事件等等內容。
抓取的Trace
報告提供了Android
系統進程在特定時間段內的總體狀況。 它檢查捕獲的跟蹤信息,並突出顯示其檢查到的問題,例如在顯示運動或動畫時UI粗糙
,並提供關於如何解決這些問題的建議。 可是,systrace
不會在應用程序進程中收集有關代碼執行的信息。 有關您的應用程序執行哪些方法以及使用多少CPU資源
的更多詳細信息,請使用Android Studio
的內置CPU分析器
,或生成跟蹤日誌並使用Traceview
查看它們。
本文檔介紹瞭如何從命令行生成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
將生成包含全部可用類別的報告,並使用默認設置。 可用的類別取決於您使用的鏈接設備。
systrace
對於檢查應用程序的UI性能
特別有用,由於它能夠分析您的代碼和幀速率以識別問題區域並提供可能的解決方案。 開始,按照如下步驟進行:
app
。python systrace.py view --time = 10
systrace
生成一個HTML報告。您如今能夠與報告進行交互,以便在記錄期間檢查設備CPU
使用狀況。 如下部分介紹如何檢查報告中的信息以查找和修復UI性能問題
。
以下報告列出了每一個進程呈現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
查看它們。
因爲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()
。
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
使用如下兩個窗格顯示日誌數據:
每一個線程的執行都顯示在本身的進程中,而且時間向右增長。 每種方法都以不一樣的顏色顯示。 第一行下方的細線顯示所選方法的子項(從入口到出口),以下圖所示。
以下圖所示,配置文件窗格提供了系統在跟蹤日誌期間執行的每種方法的列表以及執行這些方法所用的時間。 調用另外一個方法的方法稱爲父級方法,父級調用的方法稱爲其子級。 當您經過單擊方法選擇一種方法時,它會在兩個單獨的節點下顯示其父項和子項。
對於每種方法(頂級節點),該表都顯示包含和排他時間(以毫秒爲單位)以及總時間的百分比。獨佔時間是執行方法本身的代碼的時間,而包含時間是執行方法本身的代碼的時間加上執行子程序的時間。定時信息也以CPU時間
和實時的方式報告。 CPU時間
只考慮線程主動使用CPU時間的時間
,實時提供絕對時間信息,從您的應用程序進入方法的時刻到退出該方法的時間 - 不管線程處於活動狀態仍是休眠狀態。
對於配置文件窗格中的每一個頂級節點,表中的Calls + Rec
,Calls / Total
列(圖2中未顯示)將報告該方法的調用次數和遞歸調用次數。或者,對於父級和子級方法,此列顯示方法在頂級節點中是方法的子級或父級的調用次數。
Traceview
日誌記錄不能很好地處理線程,致使如下問題:
1.若是線程在分析期間退出,線程名稱不會被髮射(在Android 5.1及更高版本中被修復)
。
至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!