10.5 使用TraceView工具优化App性能" class="reference-link">10.5 使用TraceView工具优化App性能
TraceView是一个Android下的可视化性能调查工具,它用来分析TraceView日志。
10.5.1 生成TraceView日志的两种方法" class="reference-link">10.5.1 生成TraceView日志的两种方法
生成TraceView日志有两种方法,一个是利用Debug类帮助我们生成日志文件,另一个是利用Android Device Monitor工具辅助生成日志文件。
10.5.1.1 通过代码生成精确范围的TraceView日志
使用Debug类的方法开启TraceView监听。通过调用Debug.startMethodTracing()方法开启监听,通过调用Debug.stopMethodTracing()方法结束监听,我们可以使用这两个方法来包围要监听的代码块,例如在onCreate()方法里调用startMethodTracing()方法来开始监听,在onDestroy()方法方法里使用stopMethodTracing()方法来结束监听。TraceView的日志将会保存到“/sdcard/ dmtrace.trace”目录下,因此,需要在Mainifest文件中增加如下所示的权限。
- <uses-permission
- android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
当然,除了使用默认的输出日志名,也可以自定义路径和日志名。
当要监听的内容执行完毕后,通过ADB命令将日志文件导出到本地,命令如下所示。
- adb pull /sdcard/trace_log.trace /local/LOG/
10.5.1.2 通过Android Device Monitor生成TraceView日志
打开Android Studio的Android Device Monitor工具,选择要调试的进程,点击工具栏中的“start method profiling”按钮,如图10.15a所示。
图10.15a TraceView菜单
点击后会弹出提示,选择监听的模式,如图10.16所示。
图10.16 选择监听的模式
TraceView提供了以下两种监听方式。
- 整体监听
跟踪每个方法执行的全部过程,这种方式资源消耗较大。
- 抽样监听
按照指定的频率来进行抽样调查,这种方式需要执行较长时间来获取较准确的样本数据。
执行一段时间后,再次点击图10.15中的“start method profiling”按钮即可结束监听。
10.5.2 打开TraceView日志" class="reference-link">10.5.2 打开TraceView日志
对于导出的TraceView日志文件,可以使用SDK中的“sdk\tools\traceview.bat”工具来打开。或者在ADM工具中,在“File”菜单下,选择“Open File…”选项打开TraceView日志文件,如图10.17所示。
图10.17 打开TraceView日志
10.5.3 分析TraceView日志" class="reference-link">10.5.3 分析TraceView日志
TraceView的分析界面分为两部分,上面是用于显示方法执行时间的时间轴区域,下面是显示详细信息的profile区域。
10.5.3.1 时间轴区域
时间轴区域如图10.18所示。
图10.18 时间轴
时间轴区域显示了不同线程在不同的时间段内的执行情况,在时间轴中,每一行都代表了一个独立的线程。
使用鼠标滚轮可以放大时间轴,如图10.19所示。
图10.19 放大时间轴
如图10.19中所示,不同的色块代表了不同的执行方法,色块的长度,代表了方法所执行的时间。
10.5.3.2 Profile区域
Profile区域内显示了你选择的色块所代表的方法在该色块所处的时间段内的性能分析。如图10.20所示。
图10.20 Profile区域
在Profile区域中主要显示以下的信息。
- Incl CPU Time——某方法占用CPU的时间。
- Excl CPU Time——某方法本身(不包括子方法)占用CPU的时间。
- Incl Real Time——某方法真正执行的时间。
- Excl Real Time——某方法本身(不包括子方法)真正执行的时间。
- Calls+RecurCalls——调用次数+递归回调的次数。
每个时间都包含两列,一个是实际的时间,另一个是百分比。分析的时候,通常从Incl CPU Time和Calls+RecurCalls开始进行分析,对占用时间长的方法进行重点分析,如果占用时间长且Calls+RecurCalls次数少,那么就可以列为怀疑对象了。
