Android 使用 TraceView 分析卡頓問題

背景

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容