在開發(fā)應用時,需要確保UI交互順滑爆存,有60fps的幀率蛉顽。如果出現(xiàn)了丟幀現(xiàn)象,解決問題的第一步是弄清楚系統(tǒng)都做了什么先较。
Systrace工具可以收集和檢查所有進程的時序信息携冤,展示什么地方在占用CPU,以及每個進程和線程每個時間段在做什么闲勺。它也會檢查捕獲到的trace信息曾棕,高亮顯示發(fā)現(xiàn)的問題。
概述
Systrace幫助你分析應用如何在Android設備上運行菜循。它將系統(tǒng)線程和應用線程的執(zhí)行放在同一時間線上翘地。要使用Systrace分析應用,你首先需要收集trace日志。
圖1展示了捕獲到的5s時長的滑動一個性能不太好的app的trace信息衙耕。默認會顯示一個縮小的視圖昧穿。橫坐標是時間,縱坐標是分組進程信息橙喘,進程內部按照線程分組时鸵。
分組的順序是Kernel,SurfaceFlinger厅瞎,接下來是各個應用饰潜,以包名為標簽。每個應用程序進程包含每個線程所包含的所有trace標記和簸,包括基于啟用trace類別的高級trace事件的層次結構彭雾。
生成trace
生成trace有兩個條件:
- Android系統(tǒng)最低為4.1(API 16)
- 有root權限
生成trace可以使用命令行或者從IDE啟動。
命令行生成trace
命令行的方式在4.2和4.3系統(tǒng)上是不同的锁保。
在Android 4.3(API 18)及以上系統(tǒng)生成trace
步驟:
- 確保連接了設備并開啟了debug模式
- 運行trace薯酝,比如:
$ cd android-sdk/platform-tools/systrace $ python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
- 在設備上執(zhí)行你想觀察的動作。
詳細的參數(shù)信息身诺,參照https://developer.android.google.cn/studio/profile/systrace-commandline.html#options-4.3
在Android 4.2(API 17)及以上系統(tǒng)生成trace
見https://developer.android.google.cn/studio/profile/systrace-commandline.html#options-pre-4.3
Android Studio生成trace
- 連接設備
- 在Android Studio中打開應用蜜托,并在設備中運行。
- 在Android Studio中打開Android Device Monitor:Tools -> Android -> Android Device Monitor霉赡,
圖2 -
然后選中DDMS標簽橄务。點擊左側你要追蹤的應用,然后點擊Systrace按鈕:
圖3 -
在彈出的窗口中穴亏,配置你的設置:
圖4- Destination File:trace文件的保存位置
- Trace duaration:默認5s蜂挪,推薦30s。
- Trace Buffer Size:trace大小
- Enable Application Traces from:選擇你的應用
- Select tags to enable:至少選擇一個追蹤標記嗓化。
- 點擊OK開啟trace
- 操作你的應用
- trace結束后棠涮,會自動返回到Android Device Monitor。
trace分析
生成trace后刺覆,使用瀏覽器打開trace文件严肪。
幀檢測
以下圖為例:
每個渲染幀的應用都會展示一行幀的圓圈(F圓圈),典型的是綠色的谦屑。黃色和紅色的圓圈表示該幀的渲染時間超過了16.6s驳糯。
你可以用鼠標點選每一幀來高亮顯示該幀,或者點選幀內的元素氢橙,最下面的窗口會顯示一些詳細信息酝枢。
查看警告
Systrace會自動分析trace,并高亮性能問題作為警告悍手,對處理方式提出建議帘睦。
如上圖所示袍患,在你選擇了一個耗時較長的幀后,一個警告會顯示出來竣付。查看警告的描述诡延,對查找問題很有幫助。上述表示Adapter的getView方法可能做了太多的工作卑笨。
你也可以點擊右側的Alerts標簽來查看trace中所有的警告:
快捷鍵
鍵 | 描述 |
---|---|
w | 放大 |
s | 縮小 |
a | 左移 |
d | 右移 |
e | 定位到中間位置 |
g | 顯示網格線 |
← | 選擇上一個 |
→ | 選擇下一個 |
trace代碼
框架定義的trace標記并不適用所有的情況孕暇,所以你可能需要添加你自己的標記。在Android 4.3(API18)以上的系統(tǒng)赤兴,你可以使用Trace類的方法來添加標記。這可以幫助你弄清楚應用的線程在每個時間段做了什么隧哮。
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 {
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();
}
}
…
}
注意:
- begin和end是成對出現(xiàn)的桶良。
- begin和end必須在同一線程內。
- try...catch塊中沮翔,確保end在finally中陨帆。
在測試應用性能時,應該打開應用級trace采蚀,即使你沒有自己添加標記疲牵。很多庫,比如RecyclerView榆鼠,包含了一些trace標記纲爸,可以提供很多有用的信息
**注:本文翻譯自Google官方文檔。