Android 使用 TraceView 分析卡頓問題

背景

發現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 功能可以用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章