Android 效能分析工具之TraceView
TraceView簡介
- Traceview本身是一個資料分析工具, Android 平臺將Traceview作為 Android SDK內建的一個工具,主要用於載入 Android 應用程式所生成的trace檔案並且分析trace檔案採集到的資料裡面每個方法(函式)在不同執行緒裡呼叫次數、消耗的時間等等。
- Trace檔案裡資料的採集則需要使用 Android SDK 中的 Debug 類或者利用 DDMS 工具
- Traceview在Android SDK的tools目錄裡,如下圖:
配置環境
-
步驟一:在系統變數裡新建ANDROID_HOME
-
步驟二:在系統變數的Path裡新增 %ANDROID_HOME%\tools
使用程式碼生成 trace 檔案
- 在需要分析程式碼的開始位置新增以下程式碼
//檔案預設儲存到 sdcard 根目錄下,"/sdcard/testTraceView.trace"
Debug.startMethodTracing("testTraceView");
複製程式碼
其中testTraceView引數是自定義,其實就是生成的TraceView檔案的檔名,例如testTraceView.trace
- 在需要分析的結束位置新增以下程式碼
Debug.stopMethodTracing();
複製程式碼
需要新增的許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
複製程式碼
報錯示例
- 沒有獲取到許可權
E/art: Unable to open trace file '/sdcard/testTrace.trace': Permission denied
複製程式碼
2.開啟testTrace.trace檔案時報錯 ,因為沒有執行Debug.stopMethodTracing();
Failed to read the trace filejava.io.IOException: Key section does not have an *end marker
at com.android.traceview.DmTraceReader.parseKeys(DmTraceReader.java:420)
at com.android.traceview.DmTraceReader.generateTrees(DmTraceReader.java:91)
at com.android.traceview.DmTraceReader.<init>(DmTraceReader.java:87)
at com.android.traceview.MainWindow.main(MainWindow.java:286)
複製程式碼
開啟testTrace.trace檔案時報錯的重要提示:Key section does not have an *end marker at com.android.traceview,說明沒有新增或者執行Debug.stopMethodTracing();
檢視是否生成trace檔案
進入到shell模式執行下面的指令語句 在doc命令視窗或者AndroidStudio裡Terminal視窗裡執行adb shell,下圖本人寫的demo在AndroidStudio裡Terminal視窗檢視的截圖:
注意:如果Debug.startMethodTracing("testTraceView");startMethodTracing裡的引數只填寫testTraceView,則上面的截圖步驟只需要執行1、2兩步就可看到testTraceView.trace檔案 需要知道本人為什麼執行3、4兩步,請看本人demo裡的startMethodTracing裡的引數
匯出trace檔案
進入到shell模式執行下面的指令語句 adb pull /sdcard/testTraceView.trace E:\folder命令將testTraceView.trace匯出到指定到E盤folder目錄。
本人demo裡需要執行的命令是: adb pull /sdcard/TraceView/MainActivity_2018-12-07_20_29_02.trace E:\folder
開啟trace檔案
進入到shell模式執行下面的指令語句 traceview E:\folder\testTraceView.trace
TraceView介面介紹
Traceview 介面分上下兩部分 上面是時間軸皮膚 (Timeline Panel)- 左側顯示的是執行緒資訊
- 右側不同顏色代表不同方法(函式),同一個顏色越長代表該方法執行的時間越久
- 右側滑鼠放在上面會出現時間線縱軸,在頂部會顯示當前時間線所執行的具體函式資訊
- 空白表示這個時間段內沒有執行內容
下面是分析皮膚
列名 | 描述 |
---|---|
Name | 該執行緒執行過程中所呼叫的函式名 |
Incl Cpu Time | 某函式佔用的CPU時間,包含內部呼叫其它函式的CPU時間 |
Excl Cpu Time | 某函式佔用的CPU時間,但不含內部呼叫其它函式所佔用的CPU時間 |
Incl Real Time | 某函式執行的真實時間(以毫秒為單位),內含呼叫其它函式所佔用的真實時間 |
Excl Real Time | 某函式執行的真實時間(以毫秒為單位),不含呼叫其它函式所佔用的真實時 |
Call+Recur Calls/Total | 某函式被呼叫次數以及遞迴呼叫佔總呼叫次數的百分比 |
Cpu Time/Call | 某函式呼叫CPU時間與呼叫次數的比。相當於該函式平均執行時間 |
Real Time | 同CPU Time/Call類似,只不過統計單位換成了真實時間 |
注意:每一個Time列還對應有一個用時間百分比來統計的列(如Incl Cpu Time列對應還有一個列名為Incl Cpu Time %的列,表示以時間百分比來統計的Incl Cpu Time)
資料分析示例
demo下載地址
download.csdn.net/download/ch…
結束
希望分享Traceview工具的正確使用方式可以為Android開發者提供一些幫助。謝謝!
版權宣告:本文為博主原創文章!