——查閱過無數的systrace資料後,我覺得這個工具介紹篇,可能不會讓大家特別滿意,但是當且算一個學習階段的紀錄吧,希望大家一起學習進步
Systrace
Systrace是分析Android裝置的效能的主要工具
作用
用於收集可幫助您檢查原生系統程式的詳細系統級資料,例如CPU排程、磁碟活動、應用執行緒等,並解決掉幀引起的介面卡頓
本質
它是 atrace 的主機端封裝容器,是用於控制使用者空間跟蹤和設定 ftrace 的裝置端可執行檔案,也是 Linux 核心中的主要跟蹤機制。 systrace 使用 atrace 來啟用跟蹤,然後讀取 ftrace 緩衝區並將其全部封裝到一個獨立的 HTML 檢視器中
官網
https://source.android.google.cn/devices/tech/debug/systrace https://developer.android.google.cn/studio/command-line/systrace
extra: 什麼是atrace?什麼是ftrace?
ftrace 是一種除錯工具,用於瞭解 Linux 核心中的情況;而 atrace (frameworks/native/cmds/atrace) 使用 ftrace 來捕獲核心事件; 官網簡單的介紹地址:https://source.android.google.cn/devices/tech/debug/ftrace
抓取方法
抓取資訊方式有以下三種
1.systrace.py 2.AndroidStudio Systrace工具 3.自定義trace
1.systrace.py
使用python命令以及systrace.py工具 systrace.py工具位置在 sdk/platform-tools/systrace;
python systrace.py [options] [categories]
複製程式碼
示例: 呼叫systrace來記錄10秒鐘內的裝置程式,包括圖形程式,並生成mynewtrace.html報告 具體命令如下
python systrace.py --time=10 -o mynewtrace.html gfx
複製程式碼
引數資訊
options參數列
options | description |
---|---|
-o < FILE > | 輸出的目標檔案 |
-t N, –time=N | 執行時間,預設5s |
-b N, –buf-size=N | buffer大小(單位kB),用於限制trace總大小,預設無上限 |
-k < KFUNCS >,–ktrace=< KFUNCS > | 追蹤kernel函式,用逗號分隔 |
-a < APP_NAME >,–app=< APP_NAME > | 追蹤應用包名,用逗號分隔 |
–from-file=< FROM_FILE > | 從檔案中建立互動的systrace |
-e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > | 指定裝置 |
-l, –list-categories | 列舉可用的tags |
-h , --help | 顯示幫助資訊 |
-l,--list-categories | 列出可用於連線裝置的跟蹤categories類別 |
-o file | 將HTML跟蹤報告寫入指定的檔案。 如果您不指定此選項,systrace會將您的報告儲存到systrace.py所在的同一目錄中,並將其命名為trace.html。 |
-t N ,--time=N | 跟蹤裝置活動N秒。 如果不指定此選項,systrace將提示您通過按命令列中的Enter鍵結束跟蹤。 |
-b N ,--buf-size=N | 使用N千位元組的跟蹤緩衝區大小。 通過此選項,可以限制跟蹤期間收集的資料的總大小。 |
-k functions,--ktrace=functions | 跟蹤中指定的特定核心函式的活動,以逗號分隔的列表 |
-a app-name,--app=app-name | 跟蹤指定應用,為逗號分隔列表。 |
--from-file=file-path | 從檔案(例如包含原始跟蹤資料的TXT檔案)建立互動式HTML報告,而不是執行實時跟蹤。 |
-e device-serial,--serial=device-serial | 跟蹤指定的裝置序列號標識的特定連線裝置 |
catagories參數列
category | description |
---|---|
gfx | Graphics |
input | Input |
view | View System |
webview | WebView |
wm | Window Manager |
am | Activity Manager |
sm | Sync Manager |
audio | Audio |
video | Video |
camera | Camera |
hal | Hardware Modules |
app | Application |
res | Resource Loading |
dalvik | Dalvik VM |
rs | RenderScript |
bionic | Bionic C Library |
power | Power Management |
sched | CPU Scheduling |
irq IRQ | Events |
freq | CPU Frequency |
idle | CPU Idle |
disk | Disk I/O |
mmc | eMMC commands |
load | CPU Load |
sync | Synchronization |
workq | Kernel Workqueues |
memreclaim | Kernel Memory Reclaim |
regulators | Voltage and Current Regulators |
2.AndroidStudio Systrace工具
開啟AndroidStudio,連線好裝置,開啟DDMS , 點選 Tools——>Android——>Android device monitor
點選systrace按鈕,彈出資訊配置框,確認後,會記錄Trace duration 5秒鐘內的裝置程式,並生成一個名為trace.html報告
此處資訊對應上面的命令參數列,請自行參照
注意:Enable Application Trace from :若是需要自定義trace資訊,必須選擇對應的應用程式,否則不會被捕獲到
3.自定義trace
使用者可以自己新增自定義的trace塊,來捕獲指定trace的資訊 Android 4.3 (API level 18) 以及更高版本可以使用
Android
Trace.beginSection();
Trace.endSection();
複製程式碼
程式碼示例
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
...
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Trace.beginSection("MyAdapter.onCreateViewHolder");
MyViewHolder myViewHolder;
try {
myViewHolder = MyViewHolder.newInstance(parent);
} finally {
// In 'try...catch' statements, always call endSection()
// in a 'finally' block to ensure it is invoked even when an exception
// is thrown.
Trace.endSection();
}
return myViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Trace.beginSection("MyAdapter.onBindViewHolder");
try {
try {
Trace.beginSection("MyAdapter.queryDatabase");
RowItem rowItem = queryDatabase(position);
mDataset.add(rowItem);
} finally {
Trace.endSection();
}
holder.bind(mDataset.get(position));
} finally {
Trace.endSection();
}
}
...
}
複製程式碼
native
#include <android/trace.h>
ATrace_beginSection();
ATrace_endSection();
複製程式碼
建立一個便利的物件/巨集結構來跟蹤程式碼塊
#define ATRACE_NAME(name) ScopedTrace ___tracer(name)
// ATRACE_CALL is an ATRACE_NAME that uses the current function name.
#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
class ScopedTrace {
public:inline ScopedTrace(const char *name) {
ATrace_beginSection(name);
}
inline ~ScopedTrace() {
ATrace_endSection();
}
};
void myExpensiveFunction() {
ATRACE_CALL();
... // trace-worthy work here
}
複製程式碼
快捷鍵
檢視Systrace生成的trace.html,瀏覽器開啟介面如下:
(圖源來自官網)分析trace.html圖形資訊之前,先了解下快捷鍵 點選瀏覽器介面上右上角“?”,可以檢視到各個快捷鍵提示
快捷鍵 | 作用 |
---|---|
w | 放大,[+shift]速度更快 |
s | 縮小,[+shift]速度更快 |
a | 左移,[+shift]速度更快 |
d | 右移,[+shift]速度更快 |
f | 放大當前選定區域 |
m | 標記當前選定區域 |
v | 高亮VSync |
g | 切換是否顯示60hz的網格線 |
0 | 恢復trace到初始態,這裡是數字0而非字母o |
h | 切換是否顯示詳情 |
/ | 搜尋關鍵字 |
enter | 顯示搜尋結果,可通過← →定位搜尋結果 |
` | 顯示/隱藏指令碼控制檯 |
? | 顯示幫助功能 |
分析trace.html
(圖源來自官網)
顏色塊 每塊顏色佔據的長度即為該系統或者自定義trace等執行所佔據的時間長度
Alerts 含有三角狀的圓圈圖示,對應出現警告的位置,點選可以在右邊欄Alerts檢視具體警告內容; 警告會告訴你可能丟幀或者卡頓等的原因
Frame 含有F字母的圓圈圖示,對應每一幀開始的位置,不同顏色有不同意義; 綠色表示正常,當顏色為橙色或者紅色時,意味著這一幀超過16.6ms(即發現丟幀);
Kernel (上圖為四核CPU)顯示每個CPU各自執行的系統方法或自定義trace塊,以及佔據的時間長度
SurfaceFlinger surfaceFilnger,程式id為118,顯示系統方法以及佔據的時間長度
com.android.janktown 應用程式,程式id為13409,顯示應用程式內各個執行緒等資訊 每個執行緒有顏色表示各自不同的狀態
- 灰色:正在休眠。
- 藍色:可執行(它可以執行,但是排程程式尚未選擇讓它執行)。
- 綠色:正在執行(排程程式認為它正在執行)。
- 紅色:不可中斷休眠(通常在核心中處於休眠鎖定狀態)。可以指示 I/O 負載,在除錯效能問題時非常有用。
- 橙色:由於 I/O 負載而不可中斷休眠。
分析卡頓或掉幀
Systrace可以直觀的看到掉幀引起的介面卡頓 如下圖
(圖源來自官網)
點選F,使用快捷鍵f放大該幀,可以選擇m高亮該選區,檢視該幀的所有系統trace塊執行時間
(圖源來自官網)檢視下面皮膚的Frame裡的資訊
ListView recycling takiing too mush time per frame.Ensure your Adapter#getView() binds data efficiently
複製程式碼
主要問題是在ListView回收和重新繫結中花費了太多時間。
Alerts選項卡可以檢視每個警報以及裝置觸發每個警報的次數
如果你在UI執行緒上看到了太多的工作,你需要找出哪些方法消耗了太多的CPU時間。 一種方法是新增跟蹤標記即自定義trace資訊到您認為會導致這些瓶頸的方法; 另一種由於不確定哪些方法可能導致UI執行緒出現瓶頸,可以使用Android Studio的內建CPU分析器,或生成跟蹤日誌並使用Traceview來進行檢視。
其他
systrace 具體落實到專案如何進行分析,又要多廢一番心思,如何才能把這工具發揮好它的功能,就看大家了,如果有什麼心得,歡迎分享和告之 ~~o(>_<)o ~~以下連線為蒐羅到的使用的例子,可以借鑑參考
Reanative-systrace
https://reactnative.cn/docs/0.36/android-ui-performance.html
http://mlazy.club/react-native-animation-performance-tool-systrace.html
android效能分析之Systrace的使用(轉) https://blog.csdn.net/lamp_zy/article/details/53375521
手把手教你使用Systrace(一)
https://zhuanlan.zhihu.com/p/27331842
手把手教你使用Systrace(二)——鎖優化
https://zhuanlan.zhihu.com/p/27535205
主要參考
http://maoao530.github.io/2017/02/06/systrace/
http://gityuan.com/2016/01/17/systrace/
本人公眾號首發且還有其他文章和漫畫
會不定期更新!
感謝您的喜歡
請多多關注和支援!
❤️