背景
發現App的啓動速度比較慢,但是到底慢在哪裏,需要調查!
使用 TraceView 來分析
TraceView 是 Android SDK 內置的一款工具,在 tools 目錄下。它可以加載 .trace 文件,通過圖形化的方式來分析方法的調用時間,調用次數等等。
怎麼生成 .trace 文件?
1. 通過代碼生成
在需要分析的開始位置添加以下代碼
// 文件保存到 Sdcard 根目錄下,"/sdcard/StartTime.trace"
Debug.startMethodTracing("StartTime");
在需要分析的結束位置添加以下代碼
Debug.stopMethodTracing();
當然,別忘了添加權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 通過 Android Studio 生成
代碼的方式是生成到手機裏面,而 Android Studio 的方式可以直接生成到電腦裏面。
Android Studio 的 Monitors 的 CPU 有個按鈕,見下圖
按鈕會在 App 啓動的時候點亮,單擊一下表示開始追蹤,再單擊一下表示停止追蹤。(缺點是難以精確控制開始和結束)
停止追蹤後會生成 .trace 文件,如下圖所示
該文件也會直接在 Android Studio 裏面打開,如下圖所示
鼠標停留在某一個黃條上,會顯示具體的開始時間,結束時間,以及自己佔用和調用其他方法佔用的時間比例。
怎麼打開 .trace 文件?
1. 上文提到的直接在 Android Studio 裏面打開(建議使用下面的方法,使用更方便)
2. DDMS 裏面打開
打開 Android Studio 的 Android Device Monitor
然後在 DDMS 中打開生成好的 .trace 文件
DDMS 會自動啓動 TraceView 顯示內容
下半部分有三個關鍵指標:
- Cpu Time/Call :該方法平均佔用 CPU 的時間
- Real Time/Call :平均執行時間,包括切換、阻塞的時間,>= Cpu Time
- Calls + Recur Calls/Total :調用、遞歸次數\
點擊下面的任意一個方法,可以看到它的詳細信息:
- Parents:選中方法的調用處
- Children:選中方法調用的方法
查找問題的幾個手法
- 哪些線程執行時間長? 和主線程的交錯時間?
- 哪些方法執行時間長?
- Cpu Time/Call 從高到低排序,看 CPU 時間
- 看顏色哪些方法長
- 方法被調用次數高?
- Calls + Recur Calls/Total 從高到低排序
上圖中發現主線程中以一段顏色比較長,鼠標停留上去
發現是 Dagger 的初始化畫的時間較長,由於在啓動的時候用到了 Dagger 的 Inject,雖然只用到了一個類,但是其他不相干的類也還是一起初始化了。看來要考慮優化 Dagger 的 Inject 方式了。
點擊那段顏色,下半部分還能顯示具體 Dagger 初始化了哪些類
可以看到 Dagger 初始化了很多類,雖然只用到了一個類。
3. 直接用 Android SDK 的 TraceView 打開
第二種方法的 Find 功能用不了,這個 Bug Google 一直沒有解決。但是 Android SDK 的 TraceView 的 Find 功能是可以用的。
直接打開 traceview.bat 可能打不開,可以 cd 到 Android SDK 的 tools 目錄然後用命令行打開
traceview C:\Users\tianjf\Desktop\starttime.trace
雖然提示 deprecated,但是 Find 功能可以用了。