文集目錄
ps:喜歡的點(diǎn)贊哦 android性能跟蹤分析工具系列 - 目錄
話說前2篇都是介紹查看app 每幀的渲染,根據(jù)不同任務(wù)耗時離來查找問題身冀,那么我們現(xiàn)在可以發(fā)現(xiàn) app 卡頓是由哪個任務(wù)區(qū)域造成的,然后呢我們興致勃勃的去查看代碼珍促,一看尼瑪這么多方法了,具體是哪幾個方法造成的呢猪叙,還是別的原因仁卷? 怎么辦現(xiàn)在卡在這里了,哈哈锦积,沒關(guān)系,現(xiàn)在我來介紹神器 TraceView丰介,這個工具可以查看方法的具體耗時和資源消耗。哈哈是不是感覺順下來了带膀,我寫文章都是按著解決問題的順序?qū)懙摹?/p>
先來看看這個 TraceView 長啥樣:
如何使用TraceView
- 代碼方式:
首先選擇跟蹤范圍橙垢,在想要根據(jù)的代碼片段之間使用以下兩句代碼
Debug.startMethodTracing(“hello”);
.......
Debug.stopMethodTracing();
生成的traceview文件會自動放在SDCARD上,沒有SDCARD卡會出現(xiàn)異常点额,所以使用這種方式需要確保應(yīng)用的AndroidMainfest.xml中的SD卡的讀寫權(quán)限是打開的舔株,其中hello是traceview文件的名字载慈,是然后用adb導(dǎo)出traceview文件。
adb pull sdcard/hello.trace C:\Users\wangjing\Desktop
然后啟動Android Device Monitor-->File-->openFile,打開traceview文件即可办铡。
- 可視化操作方式
打開 Android devices trace 琳要,之前介紹過了
然后點(diǎn)這里,開始計(jì)時童叠,TraceView 工具也是根據(jù)時間段來分析的
我們就可以開始我們的操作了课幕,完事后我們還是按這個鍵,結(jié)束采集乍惊,最后就會生成一張分析圖表了
如何使用
做一個測試大家就知道怎么回事了,我在A 界面放一個按鈕润绎,啟動B 頁面,B 頁面的 onCreate 方法中進(jìn)行一個耗時操作呢蛤,這里我極端一點(diǎn),打印日志一百萬次
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
printmMethod();
}
private void printmMethod() {
for (int i = 0; i < 1000000; i++) {
Log.d("TrackView-", "test:" + (i + 1) + "次");
}
printmMethod2();
}
private void printmMethod2() {
for (int i = 0; i < 200000; i++) {
Log.d("TrackView-", "test:" + (i + 1) + "次");
}
Toast.makeText(this, "打印結(jié)束", Toast.LENGTH_SHORT).show();
}
哈哈顾稀,我這寫的極端了坝撑,為了結(jié)果明顯一點(diǎn)粮揉,我們現(xiàn)在可以阻塞 UI 線程呢,界面的顯示之后在我們的阻塞任務(wù)之后才能顯示扶认,看 TraceView 獲取的數(shù)據(jù)圖
可以看到上面的 main 線程里面一條常常的黑色,有顏色就表示有響應(yīng)的方法在跑狱从,因?yàn)槲覀冏枞氖?UI 線程膨蛮,所以這里我們看 main 線程就行啦
在下面的方法列表里敞葛,我們可以找找 B 頁面的 onCreate 方法,默認(rèn)是按右邊第一條數(shù)據(jù)的從大到小排列的惹谐,右邊的數(shù)據(jù)列表是可以拖拽的,按我們自己的喜好來
點(diǎn)擊 onCreate 方法我們可以看到內(nèi)部的實(shí)現(xiàn)
- parents 是 onCreate 方法的上一級氨肌,就是誰調(diào)用了 onCreate 方法
- children 是 onCreate 方法內(nèi)部調(diào)用的子方法怎囚,一般我們都是看這里的。
好了桩了,重點(diǎn)就是看看右邊的右邊的數(shù)據(jù)列表都能顯示什么數(shù)據(jù),我先解析一下幾個字段:
- incl :
數(shù)據(jù) = 該方法自身 + 該方法的所有子方法 - excl:
數(shù)據(jù) = 該方法自身井誉, 注意不包含該方法的所有子方法 - cpu time:
是該方法耗費(fèi)的CPU 時間 - Real time:
是該方法耗費(fèi)的實(shí)際時間整胃,Real time > cpu time,因?yàn)?cpu 的特性屁使,cpu 在一個計(jì)算時間段內(nèi)是在不停輪流執(zhí)行并發(fā)任務(wù)的。
知道了這幾個字段就好辦了蛮寂,下面是所有數(shù)據(jù)的含義解釋:
一般我們都是看方法占用的實(shí)際時間和次數(shù),注意點(diǎn)擊行用的數(shù)據(jù)字段是能夠排序的哦及老。
結(jié)合上面的例子,我們可以看到 onCreate 自身沒有耗費(fèi)時間骄恶,都是里面我們打印的方法在耗費(fèi)時間匕垫,也就是卡頓的元兇。這里我們一般都是做延遲加載,在頁面顯示出來之后再執(zhí)行打印方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
printmMethod();
}
});
}
ps:TraceView 工具一般也就是這么用斟叼,有 NB 人使用代碼方式的,這樣范圍更精準(zhǔn)犁柜,尤其適合裝逼用,哈哈馋缅。