Android应用性能优化最佳实践
上QQ阅读APP看书,第一时间看更新

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稍微长一点。