Android TraceView
TraceView是一个分析代码执行时间的图形化工具,使用它可以帮助我们调试应用以及分析应用性能
如何使用TraceView
- 通过Android Device Monitor。进入Android Device Monitor之后,打开DDMS,选择你的应用进程,然后点击“Start Method Profiling”按钮开始,再次点击按钮TraceView工作结束。DDMS会自动加载TraceView图。
- 通过添加Trace code。在你的应用代码块的开始和结束分别添加android.os.Debug.startMethodTracing(String traceName)
以及android.os.Debug.stopMethodTracing(),当运行结束后,就会有一个traceName.trace文件在/sdcard目录中生成。然后用Android Device Monitor打开traceName.trace文件即可。注意:需要在应用中添加WRITE_EXTERNAL_STORAGE权限
Debug.startMethodTracing("perfTrace");
mProgressBar = (ProgressBar) findViewById(R.id.id_progressbar);
mHideHandler = new Handler() {
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
if (msg.what == MSG_HIDE)
mProgressBar.setVisibility(View.GONE);
Debug.stopMethodTracing();
}
};
分析TraceView
TraceView图解析
这是我们通过上文中的代码得到的TraceView图,当我们点击Name列中的方法名时,
会出现该方法的Parents以及Children。
- Parents表示调用这个方法的方法,也就是父方法
- Children表示这个方法中调用的其他方法,也就是子方法
重点关注红色框中的时间含义 - Incl Cpu Time %:
该方法的执行时间(self + Children)占Trace代码段的执行之间的比重。 - Incl Cpu Time:该方法的执行时间(self + Children),单位ms
- Excl Cpu Time %:该方法self执行时间占Trace代码段的执行之间的比重
- Excl Cpu Time:该方法self执行时间
- Incl Real Time %:该方法的执行经历的墙上时间(self + Children)占Trace代码段的经历的墙上时间的比重
- Incl Real Time:该方法的执行经历的墙上时间(self + Children)占Trace代码段的执行之间的比重。
- Excl Real Time %:该方法的执行经历的墙上时间(self)占Trace代码段的经历的墙上时间的比重
- Excl Real Time:该方法的执行经历的墙上时间(self),不包括子函数的经历时间
- Calls + Recur Calls/Total:方法的调用次数+递归调用次数
- Cpu Time/Call:方法平均每次执行所消耗的Cpu时间 = Incl Cpu Time / Calls
- Real Time/Call:方法平均每次执行所经历的墙上时间 = Incl Real Time / Calls
我们在分析方法执行时,应重点关注方法执行的相对耗时(也就是比重),以及方法调用次数等。方法的绝对执行时间受手机性能影响,只作参考。通常我们通过TraceView得到的只是Java层的方法执行情况,还有一个startNativeTracing,只能在模拟器上使用,但是功能更为强大,可以Trace kernel执行等。
TraceView文件生成html
在TraceView图中,我们不能搜索函数,为了便于分析问题,我们可以利用sdk/platform-toos/dmtracedump工具将traceView得到的*.trace文件转化为html文件
使用如下命令
D:\android_debug\Traceview>dmtracedump -h perfTrace.trace > perfTrace.html
得到的html图,可以用chrome或者猎豹等浏览器打开
TraceView文件导出函数调用图
更为强大的是我们可以利用dmtracedump工具生成函数调用图,
不过需要安装Graphviz(帮助生成函数调用图),安装方法很简单,Google下Graphviz即可,安装以后添加环境变量。这样我们就可以用dmtracedump工具生成函数调用图了。
D:\android_debug\Traceview>dmtracedump -g perfTrace.png perfTrace.trace
小结
使用TraceView不仅可以分析应用性能问题,还可以帮助我们学习代码的workflow等。