一、TraceView工具如何使用

TraceView有4种启动/关闭分析方式:

(1) 第一种使用方法演示

1、 选择跟踪范围

在想要根据的代码片段之间使用以下两句代码

Debug.startMethodTracing("love_world_");Debug.stopMethodTracing();

例如,onCreate与onStart方法之间方法跟踪
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Debug.startMethodTracing("Love_World_");}@Overrideprotected void onStart() {super.onStart();Debug.stopMethodTracing();}}




2、添加SD卡访问权限

          


如果不添加,执行项目会出现以下异常
java.lang.RuntimeException:Unable to open trace file '/mnt/sdcard/Love_World_.trace': Permission denied

如果手机没有SD卡也会出现同样的问题

3、 导出traceview文件

1  首先执行项目,查看trace文件是否生成
进入shell模式

adb shell

查看是否已经生成这个文件
ls sdcard/Love_World_.trace

Ctrl + C 退出adb shell模式

2 导出trace文件
adb pull sdcard/Love_World_.trace


4、 打开trace文件


打开trace文件需要Android提供的traceview.bat工具,工具所在目录:sdk\tools\traceview.bat, 有两种方式执行:
1) 在命令行中切换到此目录
2) 将此目录添加到系统环境变量中

//  cmd在calc.trace所在目录执行traceview C:\Users\YourName\Desktop\Love_World_.trace

其中“C:\Users\YourName\Desktop\” 表示trace所在你系统中的目录,此工具需要输入trace文件的绝对路径才行


在新版本的SDK 会有以下提示:

The standalone version of traceview is deprecated.Please use Android Device Monitor (tools/monitor) instead.

所以建议使用tools/monitor 启动后跟Eclipse DDMS界面差不多,然后File -> Open File -> 选择trace文件

5、异常处理

1 异常处理
'C:\Windows\system32\java.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。SWT folder '' does not exist.Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.

配置Java环境变量,把java bin 添加到系统环境变量PATH中



2 异常信息
The standalone version of traceview is deprecated.Please use Android Device Monitor (tools/monitor) instead.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.(DmTraceReader.java:87)        at com.android.traceview.MainWindow.main(MainWindow.java:286)

通常是trace文件有异常,再重新生成并导出试试

3. 没有SD卡会出现异常

Unable to open trace file '/sdcard/Love_World_.trace': Permission denied Caused by: java.lang.RuntimeException: Unable to open trace file '/sdcard/Love_World_.trace': Permission denied

生成的trace系统自动放在SDCARD上,没有sd卡所以会出现这种异常


(2)  第二种使用方法演示

Eclipse -> DDMS -> Start Method Profiling


二者的区别,第一种方式更精确到方法,不方便的地方是自己需要添加方法并且要导出文件,第二种方式的优缺点刚好相反。


(3) 任意时间点启动与关闭trace

启动:am profile start
关闭:am profile stop


填写进程名,例如AndroidManifest.xml中声明的包名,通常都是主进程名


例如:  
adb shell am profile com.example start ./mnt/sdcard/test.trace


adb shell am profile com.example stop


(4)  启动指定Activity并进行trace

am start -n /. --start-profiler
例如:
adb shell am start -n com.example/com.example.MainActivity --start-profiler ./mnt/sdcard/test.trace


细节详见官方文档:

http://developer.android.com/tools/help/shell.html


二、 TraceView工具面板介绍

有两方面用途: 

1  查看跟踪代码的执行时间,分析哪些是耗时操作  

2  可以用于跟踪方法的调用,尤其是Android Framework层的方法调用关系


获取方法的调用顺序

1. 在traceview中搜索响应的方法名不能使用大写字母

2. 搜索出的方法会自动展开,其中包含Parents 和 Children 两组信息

3. 点击Parents下的方法名,直接跳转到调用当前的方法处。Children相反




Traceview 面板分上下两部分
上面是时间轴面板 (Timeline Panel)
     左侧显示的是线程信息
     右侧黑色部分是显示执行时间段、白色是线程暂停时间段,
     右侧鼠标放在上面会出现时间线纵轴,在顶部会显示当前时间线所执行的具体函数信息
下面是分析面板(Profile Panel) -   每一列内容

Inclusive time  - 函数本身运行花费时间 + 函数调用其他函数时间

Exclusive time - 函数本身运行花费时间。
Calls + RecurCall/Total 调用 + 重复调用次数 / 函数总调用次数

Cpu Time/Call 总的Cpu时间与总的调用次数之比

1-1  Profile 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/Call

CPU Time/Call类似,只不过统计单位换成了真实时间




三、如何进行具体的分析

有两个问题需要解决:


1. 如何定位到所关心的地方? 

上面只是介绍了如何使用TraceView且有两种用法,但是有时使用第一种方式范围又不太精确,使用第二种添加代码的方式,可能有些地方又监听不到。这种情况可以尝试把开始或者结束放到延迟线程中,延迟一段时间在执行开始或者结束。


2. 如何查找出哪些地方比较耗时?

TraceView罗列出了是所有监听到的方法,当然也包括Android系统很多方法的耗时,如何在这么多方法里面查找到自己关心的? 可以通过TraceView 底部的find 来查找,通常Android app都是有包名的,可以先针对某些关心的列排序后,在通过包名进行一个个查找,这些就省去自己筛选出自己app 方法耗时排行的时间。


四、 相关资料:

Android系统性能调优工具介绍 (还有具体如何使用进行性能分析的例子,非常棒) Profiling with Traceview and dmtracedump Android 编程下的 TraceView 简介及其案例实战  (含例子)

念茜 : Android代码调试工具 traceview 和 dmtracedump的波折演绎 


原文地址: http://blog.csdn.net/love_world_/article/details/8223805



2014-07-07  更新第二种使用方式与参考资料 2014-07-10 更新一些细节与三、如何进行具体分析

更多相关文章

  1. android 10.0 以上隐藏方法无法调用 #Accessing hidden method
  2. Android(安卓)AsyncTask 浅析(源代码取自 API level 23)
  3. android常用的API接口调用
  4. StageFright框架流程解读
  5. 应用程序启动速度优化
  6. ubuntu右键添加打开终端的快捷菜单
  7. 深入分析Android(安卓)Binder 驱动
  8. android onNewIntent
  9. TextView设置autoLink

随机推荐

  1. Android(安卓)studio 上传Android(安卓)l
  2. Android(安卓)ApiDemos示例解析(73):Grap
  3. Android(安卓)- 资源(resource)
  4. Android(安卓)studio aar文件的打包过程
  5. Android原生音量控制实例详解
  6. ContentProvider 详解
  7. [Android]View响应屏幕触摸事件
  8. Android各框架的总结及选型
  9. ym——Android之常用Tools【介绍及使用】
  10. [置顶] android 深入理解AnsyncTask