一、SysTrace簡介
Systrace是android性能調試優化的常用工具,它可以收集進程的活動信息,如界面布局、UI渲染、binder通信等;也可以收集內核信息,如cpu調度、IO活動、中斷等;這些信息會統一時間軸,在Chrome瀏覽器中顯示出來,非常方便工程師性能調試、優化卡頓等工作。
Systrace允許你監視和跟蹤Android系統的行為(trace)。它會告訴你系統都在哪些工作上花費時間、CPU周期都用在哪里,甚至你可以看到每個線程、進程在指定時間內都在干嘛。它同時還會突出觀測到的問題,從垃圾回收到渲染內容都可能是問題對象,甚至提供給你建議的解決方案。但是不能確定具體有問題的代碼在哪里,這里可用用traceview工具。在Android平台中,Systrace主要由3部分組成:
內核部分:Systrace利用了Linux Kernel中的ftrace功能。所以,如果要使用Systrace的話,必須開啟kernel中和ftrace相關的模塊。
數據采集部分:Android定義了一個Trace類。應用程序可利用該類把統計信息輸出給ftrace。同時,Android還有一個atrace程序,它可以從ftrace中讀取統計信息然后交給數據分析工具來處理。
數據分析工具:Android提供一個systrace.py(python腳本文件,位於Android SDK目錄/tools/systrace中,其內部將調用atrace程序)用來配置數據采集的方式(如采集數據的標簽、輸出文件名等)和收集ftrace統計數據並生成一個結果網頁文件供用戶查看。 從本質上說,Systrace是對Linux Kernel中ftrace的封裝。應用進程需要利用Android提供的Trace類來使用Systrace.
CPU調度
程序,IO和APP Thread),並且會生成HTML報告,方便用戶查看分析trace內容。
Android
系統或者某個
app
的卡頓性能或者渲染問題,這時候Systrace 就非常有用。
首先我們需要抓取
Systrace
文件,然后分析並找出引起系統卡頓,或者
app反應慢
的原因,最好在源碼上解決引起卡頓、響應慢的問題。
二、使用命令行抓取 Systrace
1. 使用命令行抓取Systrace的准備工作
抓取systrace
之前,請完成以下步驟:
- 下載並安裝
Android SDK Tools
- 安裝
Python ,
並將其包含在系統環境變量的path中。 - 連接手機,打開開發者選項中的
USB Debug
選項 。 - 查找
Systrace
腳本,存儲路徑如下:android-sdk/platform-tools/systrace/
2. 使用命令行抓取 Systrace
的語法
使用命令行抓取 Systrace
的語法如下:
python systrace.py [options] [categories]
3. 使用命令行抓取 Systrace
舉例
例如,以下命令調用systrace
在10
秒鍾內記錄設備進程,包括圖形進程,並生成一個名為mynewtrace
的HTML
報告:
python systrace.py --time=10 -o mynewtrace.html gfx
如果不指定任何類別或選項,systrace
將生成包含所有可用類別的報告,並使用默認設置。 可用的類別取決於您使用的連接設備。
三、使用Systrace 檢測UI 性能
systrace
對於檢查應用程序的UI性能
特別有用,因為它可以分析您的代碼和幀速率,進而識別問題區域,同時提供可工參考的解決方案。
使用Systrace 檢測UI 性能
首先,按照以下步驟進行操作:
- 連接手機並運行您的
app
。 - 使用以下命令運行systrace:
python systrace.py view --time = 10
- 操作您的應用 10秒后,
systrace
生成一個HTML報告。 - 使用網絡瀏覽器打開HTML報告。
使用Chrome 打開生成的trace 文件,檢測記錄期間設備CPU
使用情況,丟幀情況,卡頓耗時情況等等。
四、使用Systrace 檢測卡頓丟幀問題
如下Systrace報告列出了每個進程呈現UI frame,並顯示沿着時間線的每個渲染幀。 在綠色框架
圓圈中,是指在16.6ms內呈現每秒穩定60幀。 花費16.6ms以上渲染的幀用黃色
或紅色
圓圈表示
在運行Android 5.0(API級別21)
或更高版本的設備上, UI 渲染的工作主要由UI Thread
和RenderThread
兩個線程完成。 在之前的版本中,創建渲染框架的所有工作都是在UI Thread
上完成的。
點擊一個F圓圈
,它可以提供系統為渲染該frame 完成所包含的工作信息,包括警報,丟幀,建議等。
同時它還向您展示了在渲染該frame時系統正在執行的方法,因此您可以調查這些方法是否導致UI jank
。
選擇黃色的frame后,您可能會在報告的底部窗格中看到如上提示信息。
上圖中顯示的Alert
, 主要問題是在ListView
回收和重新bind中花費了太多的時間。 trace中有相關事件的鏈接,點擊可以獲取更多關於系統在這段時間內正在做什么的事情。
要查看Systrace中發現的每個Alert
以及設備觸發Alert
的次數,請單擊窗口最右側的Alerts
選項卡,如下圖所示。
Alerts
面板可幫助您查看發生了哪些問題,以及發生的頻率。 將Alert
面板看作是要修復的錯誤列表, 通常情況下,一個區域的微小變化或改進就可以消除應用程序中的全部Alert。
如果你的代碼在UI Thread
上做太多的工作,你需要找出哪些方法消耗了太多的CPU時間
。
一種方法是添加systrace(請參閱檢測應用代碼)到您認為會導致這些卡頓或者導致慢的方法地方,然后查看這些函數調用是否顯示在systrace
中。 如果您不確定哪些方法可能會在UI線程上造成卡頓,請使用Android Studio
的內置CPU Profiler,
或者生成跟蹤日志並使用Traceview
查看它們。
參考鏈接
https://www.jianshu.com/p/75aa88d1b575
https://www.jianshu.com/p/0090d1428714
https://www.sohu.com/a/404342135_467784
https://blog.csdn.net/vicwudi/article/details/100191529