2.2.2 TraceView
TraceView是AndroidSDK自带的工具,用来分析函数调用过程,可以对Android的应用程序以及Framework层的代码进行性能分析。它是一个图形化的工具,最终会产生一个图表,用于对性能分析进行说明,可以分析到应用具体每一个方法的执行时间,使用可以非常直观简单,分析性能问题很方便。
1. 使用方法
在使用TraceVeiw分析问题之前需要得到一个*.trace的文件,然后通过TraceView来分析trace文件的信息,trace文件的获取有两种方式:
(1)在DDMS中使用
1)连接设备。
2)打开应用。
3)打开DDMS(若在Android Studio中则先打开Android Device Monitor)。
4)单击Strart Method Prof iling按钮,如图2-14所示。
图2-14 在DDMS中打开TraceView
5)在应用中操作需要监控的点,比如进入一个Activity或者滑动一个列表,完成后单击Stop Method Prof iling按钮,如图2-15所示。
图2-15 结束一次TraceView
6)结束会自动跳转到TraceView视图。
这种方法使用方便,但监控范围不够精确,如果需要精确监控某一个路径,就需要使用下一个方法:在代码中加入调试语句保存Trace文件。
(2)代码中加入调试语句保存trace文件
有时在开发过程中不好复现的问题,需要在关键的路径上获取TraceView数据,在测试时复现此问题后直接拿到Trace文件查看对应的数据。这时可以在代码中使用TraceView工具并生成对应的trace文件。在android.os.Debug类中提供了相应的方法,过程很简单步骤如下:
1)在需要开始监控的地方调用startMethodTracing()。
2)在需要结束监控的地方调用stopMethodTracing()。
3)系统会在SD卡中创建<trace-name>.trace文件。
4)使用traceveiw打开该文件进行分析。
调用代码如下:
//start tracing to "/sdcard/ui_performance.trace" Debug.startMethodTracing("ui_performance"); // ... //stop tracing Debug.stopMethodTracing();
在应用程序中调用startMethodTracing()时,系统会在指定的路径上创建一个名为<trace_f ilename>.trace文件。这个文件包含了方法名跟踪数据,以及与线程和方法名的映射表。然后系统开始缓存应用产生的跟踪数据,直到应用程序调用stopMethodTracing()结束,此时将其缓冲的数据写入输出文件中。如果系统达到最大缓存大小时,还没有调用stopMethodTracing(),系统会停止跟踪并发送一个通知。
在Android 4.4及更高版本中,可以通过基于采样的方法分析耗时情况,因为减少了分析Trace文件的次数,降低了IO读写,所以可以减少Trace工具在运行时对性能的影响,同时对分析结果也不会有很大的偏差。通过调用startMethodTracing()方法,就可以指定具体的采样间隔,定期采集样本数据分析。
注意
在代码中使用此方法保存TraceView数据,不要忘记在应用中打开write to external storage权限(WRITE_EXTERNAL_STORAGE)。
2.TraceView视图说明
Traceview视图分两部分,上半部分为时间片面板(Timeline Panel),下半部分为分析面板(Prof ile Panel)。
时间片面板如图2-16所示。
图2-16 时间片面板
□ X轴表示时间消耗,单位为毫秒(ms), Y轴表示各个线程,每个线程中的不同方法使用了不同的颜色来表示,颜色占用面积越宽,表示该方法占用CPU时间越长。
□ 时间片面板可以放大/缩小,也可以指定区域放到最大,方便查看具体的过程,一般优先选择放大耗时严重的区域。
分析面板(Prof ile Panel)如图2-17所示。
图2-17 分析面板
分析面板看起来并不复杂,但需要理解各列数据的意义,每一列表示的意义如表2-1所示。
表2-1 分析面板参数意义
使用TraceView查看耗时,主要关注Calls + Recur Calls / Total和Cpu Time / Call这两个值,也就是关注调用次数多和耗时久的方法,然后优化这些方法的逻辑和调用次数,减少耗时。
注意
RealTime与cputime区别为:因为RealTime包括了CPU的上下文切换、阻塞、GC等,所以RealTime方法的实际执行时间要比CPU Time稍微长一点。