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下載地址
https://download.csdn.net/download/chinadragon10/10839204
結束
希望分享Traceview工具的正確使用方式可以爲Android開發者提供一些幫助。謝謝!
版權聲明:本文爲博主原創文章!