Android Systrace 使用方法

極力推薦文章:歡迎收藏 Android 乾貨分享 html

#####閱讀五分鐘,每日十點,和您一塊兒終身學習,這裏是程序員Androidpython

Systrace容許您在系統級別收集和檢查設備上運行的全部進程的計時信息。 它未來自Android內核的數據(例如CPU調度程序,磁盤活動和應用程序線程)組合起來,以生成HTML報告。android

本篇文章主要介紹 Android 開發中的部分知識點,經過閱讀本篇文章,您將收穫如下內容:程序員

  1. Systrace 簡介
  2. Systrace 使用方法
  3. 使用命令行抓取 Systrace
  4. 使用Systrace 檢測UI 性能
  5. 使用Systrace 檢測警告以及掉幀問題
  6. 查看trace 文件的快捷鍵
  7. 代碼中添加trace 標記具體分析問題所在
  8. 使用TraceView 分析trace Log

#1.Systrace 簡介瀏覽器

Systrace 容許您在系統級別收集和檢查設備上運行的全部進程的計時信息。 它未來自Android內核的數據(例如CPU調度程序,磁盤活動和應用程序線程)組合起來,以生成HTML報告。緩存

2.Systrace 使用方法

抓取Systrace 的方法

若是想分析Android系統或者app的問題,首先咱們須要抓取Systrace文件分析並找出引發系統卡頓,或者app反應慢的緣由,而後在源碼上解決引發慢的問題。微信

抓取Systrace 的方法:網絡

  1. 首先連接手機,打開Android Device Monitor,選擇要分析的進程(好比com.google.process.gapps),點擊Capture system wide trace using Android systrace(下圖右上角箭頭所指的地方)

抓取Systrace的方法

  1. 配置須要抓取Systrace的內容

此時根據不一樣的需求,配置抓取不一樣的trace 時間(時間請勿過長,不然會致使抓取內容部分丟失),內容等,而後點擊OK,操做要分析系統卡頓或app運行緩慢的部分,系統會自動收集運行時的信息,而後用Chrome 瀏覽器打開生成的trace 文件 。app

根據不一樣的需求,配置抓取不一樣的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以前,請完成如下步驟:

  1. 下載並安裝Android SDK Tools
  2. 安裝Python ,並將其包含在工做站的執行路徑中。
  3. 鏈接手機,打開開發者選項中的USB Debug選項 。
  4. Systrace存儲路徑以下android-sdk/platform-tools/systrace/

使用命令行抓取 Systrace的語法以下: python systrace.py [options] [categories]

例如,如下命令調用systrace10秒鐘內記錄設備進程,包括圖形進程,並生成一個名爲mynewtraceHTML報告:

python systrace.py --time=10 -o mynewtrace.html gfx

若是不指定任何類別或選項,systrace將生成包含全部可用類別的報告,並使用默認設置。 可用的類別取決於您使用的鏈接設備。

Global options

Commands and command options

4.使用Systrace 檢測UI 性能

systrace對於檢查應用程序的UI性能特別有用,由於它能夠分析您的代碼和幀速率以識別問題區域並提供可能的解決方案。 開始,按照如下步驟進行:

  1. 鏈接手機並運行您的app
  2. 使用如下命令運行systrace: python systrace.py view --time = 10
  3. 操做您的應用 10秒後,systrace生成一個HTML報告。
  4. 使用網絡瀏覽器打開HTML報告。

您如今能夠與報告進行交互,以便在記錄期間檢查設備CPU使用狀況。 如下部分介紹如何檢查報告中的信息以查找和修復UI性能問題

5. 使用Systrace 檢測警告以及掉幀問題

以下報告列出了每一個進程呈現UI幀,並指示沿着時間線的每一個渲染幀。 在綠色框架圓圈中指示在16.6毫秒內呈現的幀以保持每秒穩定60幀。 花費16.6毫秒以上渲染的幀用黃色紅色框圈表示。

UI渲染幀率查看

注意: 在運行Android 5.0(API級別21)或更高版本的設備上, UI 渲染的工做是在UI ThreadRenderThread兩個線程完成。 在以前的版本中,建立框架的全部工做都是在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使用如下兩個窗格顯示日誌數據:

    1. 時間軸窗格: 描述每一個線程什麼時候進入和退出方法的時間軸窗格
    1. 配置文件窗格: 總結每一個線程在跟蹤日誌的執行期間的配置文件窗格 如下各節提供有關traceview輸出窗格的附加信息。

1.時間軸窗格

每一個線程的執行都顯示在本身的進程中,而且時間向右增長。 每種方法都以不一樣的顏色顯示。 第一行下方的細線顯示所選方法的子項(從入口到出口),以下圖所示。

時間軸窗格

2. 配置文件窗格

以下圖所示,配置文件窗格提供了系統在跟蹤日誌期間執行的每種方法的列表以及執行這些方法所用的時間。 調用另外一個方法的方法稱爲父級方法,父級調用的方法稱爲其子級。 當您經過單擊方法選擇一種方法時,它會在兩個單獨的節點下顯示其父項和子項。

對於每種方法(頂級節點),該表都顯示包含和排他時間(以毫秒爲單位)以及總時間的百分比。獨佔時間是執行方法本身的代碼的時間,而包含時間是執行方法本身的代碼的時間加上執行子程序的時間。定時信息也以CPU時間和實時的方式報告。 CPU時間只考慮線程主動使用CPU時間的時間,實時提供絕對時間信息,從您的應用程序進入方法的時刻到退出該方法的時間 - 不管線程處於活動狀態仍是休眠狀態。

對於配置文件窗格中的每一個頂級節點,表中的Calls + RecCalls / Total列(圖2中未顯示)將報告該方法的調用次數和遞歸調用次數。或者,對於父級和子級方法,此列顯示方法在頂級節點中是方法的子級或父級的調用次數。

image.png

Traceview 已知問題

Traceview日誌記錄不能很好地處理線程,致使如下問題:

  • 1.若是線程在分析期間退出,線程名稱不會被髮射(在Android 5.1及更高版本中被修復)

    1. 虛擬機重用線程ID。 若是一個線程中止,另外一個線程開始,他們可能會獲得相同的ID。

至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

微信關注公衆號:  程序員Android,領福利
相關文章
相關標籤/搜索