背景
發(fā)現(xiàn)App的啟動(dòng)速度比較慢,但是到底慢在哪里,需要調(diào)查!
使用 TraceView 來分析
TraceView 是 Android SDK 內(nèi)置的一款工具,在 tools 目錄下。它可以加載 .trace 文件,通過圖形化的方式來分析方法的調(diào)用時(shí)間,調(diào)用次數(shù)等等。
怎么生成 .trace 文件?
1. 通過代碼生成
在需要分析的開始位置添加以下代碼
// 文件保存到 Sdcard 根目錄下,"/sdcard/StartTime.trace"
Debug.startMethodTracing("StartTime");
在需要分析的結(jié)束位置添加以下代碼
Debug.stopMethodTracing();
當(dāng)然,別忘了添加權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 通過 Android Studio 生成
代碼的方式是生成到手機(jī)里面,而 Android Studio 的方式可以直接生成到電腦里面。
Android Studio 的 Monitors 的 CPU 有個(gè)按鈕,見下圖

按鈕會(huì)在 App 啟動(dòng)的時(shí)候點(diǎn)亮,單擊一下表示開始追蹤,再單擊一下表示停止追蹤。(缺點(diǎn)是難以精確控制開始和結(jié)束)
停止追蹤后會(huì)生成 .trace 文件,如下圖所示

該文件也會(huì)直接在 Android Studio 里面打開,如下圖所示

鼠標(biāo)停留在某一個(gè)黃條上,會(huì)顯示具體的開始時(shí)間,結(jié)束時(shí)間,以及自己占用和調(diào)用其他方法占用的時(shí)間比例。

怎么打開 .trace 文件?
1. 上文提到的直接在 Android Studio 里面打開(建議使用下面的方法,使用更方便)
2. DDMS 里面打開
打開 Android Studio 的 Android Device Monitor

然后在 DDMS 中打開生成好的 .trace 文件

DDMS 會(huì)自動(dòng)啟動(dòng) TraceView 顯示內(nèi)容

下半部分有三個(gè)關(guān)鍵指標(biāo):
- Cpu Time/Call :該方法平均占用 CPU 的時(shí)間
- Real Time/Call :平均執(zhí)行時(shí)間,包括切換、阻塞的時(shí)間,>= Cpu Time
- Calls + Recur Calls/Total :調(diào)用、遞歸次數(shù)\
點(diǎn)擊下面的任意一個(gè)方法,可以看到它的詳細(xì)信息:
- Parents:選中方法的調(diào)用處
- Children:選中方法調(diào)用的方法
查找問題的幾個(gè)手法
- 哪些線程執(zhí)行時(shí)間長(zhǎng)? 和主線程的交錯(cuò)時(shí)間?
- 哪些方法執(zhí)行時(shí)間長(zhǎng)?
- Cpu Time/Call 從高到低排序,看 CPU 時(shí)間
- 看顏色哪些方法長(zhǎng)
- 方法被調(diào)用次數(shù)高?
- Calls + Recur Calls/Total 從高到低排序
上圖中發(fā)現(xiàn)主線程中以一段顏色比較長(zhǎng),鼠標(biāo)停留上去

發(fā)現(xiàn)是 Dagger 的初始化畫的時(shí)間較長(zhǎng),由于在啟動(dòng)的時(shí)候用到了 Dagger 的 Inject,雖然只用到了一個(gè)類,但是其他不相干的類也還是一起初始化了??磥硪紤]優(yōu)化 Dagger 的 Inject 方式了。
點(diǎn)擊那段顏色,下半部分還能顯示具體 Dagger 初始化了哪些類

可以看到 Dagger 初始化了很多類,雖然只用到了一個(gè)類。
3. 直接用 Android SDK 的 TraceView 打開
第二種方法的 Find 功能用不了,這個(gè) Bug Google 一直沒有解決。但是 Android SDK 的 TraceView 的 Find 功能是可以用的。
直接打開 traceview.bat 可能打不開,可以 cd 到 Android SDK 的 tools 目錄然后用命令行打開
traceview C:\Users\tianjf\Desktop\starttime.trace
雖然提示 deprecated,但是 Find 功能可以用了。