Android Systrace 使用方法



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

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

本篇文章主要介紹 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 文件 。

根據不同的需求,配置抓取不同的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,領福利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM