Android性能优化–Systrace工具,移动网页开发工具
| –walt | WALT trace options | 測(cè)量手機(jī)和計(jì)算機(jī)上物理傳感器和輸出的延遲 |
獲取報(bào)告
無(wú)時(shí)間限制,需要enter鍵開(kāi)始
./systrace.py -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
加時(shí)間參數(shù)
./systrace.py -o trace.html -t 12 sched freq idle am wm gfx view binder_driver hal dalvik camera input res
完成后使用chrome打開(kāi)得到的文件即可
獲取報(bào)告的命令執(zhí)行,file路徑為報(bào)告文件路徑
Android9以上版本也可以通過(guò)開(kāi)發(fā)者模式獲取
次方式不推薦使用
打開(kāi)系統(tǒng)跟蹤
開(kāi)啟記錄
停止記錄
分享記錄文件
通過(guò)消息或通過(guò)ADB共享跟蹤時(shí),報(bào)告本身駐留在.ctrace文件中。使用此文件,可以生成跟蹤的HTML報(bào)告。為此,請(qǐng)?jiān)诮K端窗口中運(yùn)行以下命令:
cd / path-to-traces-on-my-dev-machine && \
systrace –from-file trace-file-name .ctrace
但是需要systrace命令行程序
報(bào)告分析
====
Systrace生成包含一系列部分的輸出HTML文件。該報(bào)告列出了每個(gè)進(jìn)程的線程。如果給定線程呈現(xiàn)UI幀,則報(bào)告還指示沿時(shí)間線的呈現(xiàn)幀。當(dāng)在報(bào)告中從左向右移動(dòng)時(shí),時(shí)間會(huì)向前傳遞。
報(bào)告從上到下包含以下部分
- UI交互活動(dòng)
第一部分包含表示應(yīng)用或游戲中特定用戶(hù)交互的條形圖,例如點(diǎn)擊設(shè)備屏幕。這些相互作用充當(dāng)有用的時(shí)間標(biāo)記
UI交互活動(dòng)
- CPU活動(dòng)
顯示了表示每個(gè)CPU中的線程活動(dòng)的條形圖。條形圖顯示所有應(yīng)用程序(包括您的應(yīng)用程序或游戲)的CPU活動(dòng)。
折疊的CPU活動(dòng)部分的示例
折疊圖
CPU活動(dòng)部分是可擴(kuò)展的,允許您查看每個(gè)CPU的時(shí)鐘頻率
CPU活動(dòng)(展開(kāi)視圖),顯示Systrace報(bào)告中的CPU時(shí)鐘頻率
- 系統(tǒng)事件
直方圖顯示特定的系統(tǒng)級(jí)事件,例如紋理計(jì)數(shù)和特定對(duì)象的總大小。
系統(tǒng)級(jí)事件
值得仔細(xì)檢查的直方圖是標(biāo)記為SurfaceView的直方圖。計(jì)數(shù)表示已傳遞到顯示管道并等待在設(shè)備屏幕上顯示的組合幀緩沖區(qū)的數(shù)量。由于大多數(shù)設(shè)備都是雙緩沖或三緩沖,因此該計(jì)數(shù)幾乎總是0,1或2。
描述Surface Flinger過(guò)程的其他直方圖,包括VSync事件和UI線程交換工作,如下圖
Systrace報(bào)告中的Surface Flinger示例圖
- 顯示框架
顯示框架
這一部分,通常是報(bào)告中最多的部分,描繪了一條彩色線條,后面是成堆的條形圖。這些形狀表示已創(chuàng)建的特定線程的狀態(tài)和幀堆棧。
UI線程或應(yīng)用程序或游戲通常運(yùn)行的主線程始終顯示為第一個(gè)線程。
幀堆棧信息
每堆條形圖上方的多色線表示特定線程隨時(shí)間變化的狀態(tài)集。該行的每個(gè)部分可以包含以下顏色之一:
綠色:Running
線程正在完成與進(jìn)程相關(guān)的工作或正在響應(yīng)中斷。
藍(lán)色:Runnable
線程可以運(yùn)行但當(dāng)前沒(méi)有安排。
白色:Sleeping
線程沒(méi)有工作要做,可能是因?yàn)榫€程在互斥鎖上被阻塞。
橙色:Uninterruptable sleep(不間斷的睡眠)
線程在I / O上被阻塞或等待磁盤(pán)操作完成。
紫色:Interruptable sleep(可以中斷睡眠)
線程在另一個(gè)內(nèi)核操作(通常是內(nèi)存管理)上被阻塞。
- 報(bào)告分析操作快捷鍵
| key | 描述 |
| — | — |
| W | 放大時(shí)間軸 |
| A | 在跟蹤時(shí)間線上左移 |
| S | 縮小時(shí)間軸 |
| D | 在跟蹤時(shí)間軸上向右平移 |
| E | 將跟蹤時(shí)間軸置于當(dāng)前鼠標(biāo)位置的中心 |
| M | 選中當(dāng)前幀 |
| 1 | 將當(dāng)前活動(dòng)的選擇模型更改為“選擇”模式。對(duì)應(yīng)于鼠標(biāo)選擇器工具欄中顯示的第一個(gè)按鈕 |
| 2 | 將當(dāng)前活動(dòng)的選擇模型更改為“平移”模式。對(duì)應(yīng)于鼠標(biāo)選擇器工具欄中顯示的第二個(gè)按鈕 |
| 3 | 將當(dāng)前活動(dòng)的選擇模型更改為“縮放”模式。對(duì)應(yīng)于鼠標(biāo)選擇器工具欄中顯示的第3個(gè)按鈕 |
| 4 | 將當(dāng)前活動(dòng)的選擇模型更改為“計(jì)時(shí)”模式。對(duì)應(yīng)于鼠標(biāo)選擇器工具欄中顯示的第4個(gè)按鈕 |
| G | 在當(dāng)前所選任務(wù)的開(kāi)頭顯示網(wǎng)格 |
| Shift + G | 在當(dāng)前所選任務(wù)的末尾顯示網(wǎng)格 |
| 左鍵 | 在當(dāng)前選定的時(shí)間軸上選擇上一個(gè)事件 |
| 右鍵 | 選擇當(dāng)前所選時(shí)間軸上的下一個(gè)事件 |
自定義systrace數(shù)據(jù)獲取
===============
以上數(shù)據(jù)默認(rèn)僅在系統(tǒng)級(jí)別向顯示有關(guān)進(jìn)程的信息,因此有時(shí)很難知道應(yīng)用程序或游戲的哪些方法在給定時(shí)間相對(duì)于系統(tǒng)事件執(zhí)行。
Android平臺(tái)提供了一個(gè)trace API,可以使用它來(lái)標(biāo)記特定的代碼段。如果捕獲應(yīng)用程序“debug”版本的新系統(tǒng)跟蹤并包含該-a選項(xiàng),如下面的代碼段所示,這些自定義事件將顯示在Systrace報(bào)告中:
python systrace.py -a com.zerone.qrcode -b 16384 -o my_systrace_report.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
java 層code
堆棧的每個(gè)級(jí)別代表為應(yīng)用或游戲定義beginSection()的自定義跟蹤事件的調(diào)用或開(kāi)始
- Trace.beginSection(String sectionName)和?Trace.endSection()需要成對(duì)出現(xiàn)
- 為保證每個(gè)?Trace.beginSection(String sectionName)?都會(huì)有對(duì)應(yīng)的?Trace.endSection(),建議使用?try {……} finally {……}
- 如果在?Trace.endSection()之前有多個(gè)?Trace.beginSection(String sectionName),Trace.endSection()會(huì)匹配離它最近的一個(gè)未匹配過(guò)的?Trace.beginSection(String sectionName)
- Trace.beginSection(String sectionName)和?Trace.endSection()需要在同一線程中
public class MyAdapter extends RecyclerView.Adapter {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Trace.beginSection(“MyAdapter.onCreateViewHolder”);
MyViewHolder myViewHolder;
try {
myViewHolder = MyViewHolder.newInstance(parent);
} finally {
//在try和catch語(yǔ)句中,總是在a中調(diào)用“endSection()”
//“終于”阻止。這樣,即使在a時(shí)也調(diào)用該方法
//發(fā)生異常。
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);
dataset.add(rowItem);
} finally {
Trace.endSection();
}
holder.bind(dataset.get(position));
} finally {
Trace.endSection();
}
}
}
Native層code
Android 6.0(API級(jí)別23)及更高版本支持native trace API,trace.h將跟蹤事件寫(xiě)入系統(tǒng)緩沖區(qū),然后使用Systrace進(jìn)行分析。此API的常見(jiàn)用例包括觀察特定代碼塊執(zhí)行的時(shí)間以及將代碼塊與不良系統(tǒng)行為相關(guān)聯(lián)的時(shí)間。
要定義應(yīng)用或游戲中本機(jī)代碼中發(fā)生的自定義事件,請(qǐng)完成以下步驟:
1、定義用于捕獲游戲中自定義事件的ATrace函數(shù)的函數(shù)指針,如以下代碼段所示:
#include <android/trace.h>
#include <dlfcn.h>
總結(jié)
以上是生活随笔為你收集整理的Android性能优化–Systrace工具,移动网页开发工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Eclipse:Eclipse插件开发全
- 下一篇: 深入理解Android Java虚拟机A