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开发者提供一些帮助。谢谢!
版权声明:本文为博主原创文章!
欢迎关注我的公众号,不定期推送优质的文章,
微信扫一扫下方二维码即可关注。