前言
Traceview是一个用来查看应用执行日志的图形化工具。通过它,我们可以直观地查看应用代码是如何随时间执行的,以及每个方法的执行时间和调用堆栈等信息。Traceview工具可以帮助我们跟踪应用代码中的性能问题。
生成Trace日志
要使用Traceview工具,你需要生成包含你想要分析的跟踪信息的日志文件。生成跟踪日志有两种方法:
- 使用 DDMS 生成跟踪日志。这种方法的优点是不需要修改应用代码。缺点是不能精确地控制何时开始和停止进行日志记录。当你无法修改应用代码,或者不需要精确地控制何时开始和停止进行日志记录时,这种方法是非常有用的。
- 使用 Debug类 生成跟踪日志。这种方法需要你在应用代码中调用Debug.startMethodTracing()和Debug.stopMethodTracing()方法来开始和停止将跟踪日志记录到SD卡中。这种方法可以非常精确地控制何时开始和停止进行日志记录。
使用DDMS生成
在使用DDMS生成跟踪日志之前,需要做一些准备工作:
- 将设备连接到计算机。
- 开启设备的 开发者选项、USB调试 和 USB安装。
- 在设备上运行待跟踪的应用。
然后,启动Android Device Monitor。有两种方法:
- 在Android Studio中,点击 Tools > Android > Android Device Monitor。
- 进入Android SDK根目录下的 tools 目录,运行 monitor 程序。
如下图所示:
确保你的设备和应用显示在Devices选项卡中。在 Devices 选项卡中,选中你的应用,然后点击启动方法跟踪按钮 ,打开方法跟踪配置对话框。如下图所示:
方法跟踪配置对话框中有两种选项:
- Sample based profiling 以指定的频率记录跟踪日志。这种模式下的开销与采样频率成正比。
- Trace based profiling 实时跟踪每个方法的进入和退出,捕获所有方法的执行。这种模式下的开销很大。
选择合适的方法跟踪模式之后,点击OK,开始记录跟踪日志。开始记录跟踪日志之后,在应用需要跟踪的地方执行交互操作。
最后,在 Devices 选项卡中,点击停止方法跟踪按钮 ,停止记录跟踪日志。稍等片刻,Android Device Monitor将自动加载生成的跟踪日志到Traceview工具中。
使用Debug类生成
要创建跟踪日志文件,你需要调用Debug.startMethodTracing()静态方法。你可以为系统生成的跟踪日志文件指定一个名字。要停止跟踪,你需要调用Debug.stopMethodTracing()静态方法。例如,你可以在Activity的onCreate()方法中调用startMethodTracing()方法,在onDestroy()方法中调用stopMethodTracing()方法。示例代码如下所示:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// start tracing to "/sdcard/MainActivity.trace"
Debug.startMethodTracing("MainActivity");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onDestroy() {
super.onDestroy();
// stop tracing
Debug.stopMethodTracing();
}
}
注意: 应用必须具有写外部存储的权限。
启用方法跟踪会对应用代码的运行造成一定的影响,所以不要试图从跟踪日志中得到绝对的时间信息。当与其它的跟踪日志对比时,时间才是有用的。所以,你可以对比先前的跟踪日志来判断更改是否使得代码运行的更快或者更慢。
在Android 4.4及以上版本中,你可以使用基于采样的跟踪模式来减少运行时性能影响。要启用采样跟踪,你需要调用Debug.startMethodTracingSampling()静态方法并指定合适的采样间隔。然后,系统将定期收集跟踪日志,直到调用Debug.stopMethodTracing()静态方法停止跟踪。
在应用生成跟踪日志文件之后,你需要将该文件复制到计算机中。你可以使用 adb pull 命令来复制文件。示例如下所示:
adb pull /sdcard/MainActivity.trace ./
最后,在Android Device Monitor中,点击 File > Open File… 来加载跟踪日志文件。
使用Traceview
Traceview工具加载跟踪日志文件完毕之后如下图所示:
可以看到,Traceview工具有两个面板:
- Timeline面板 显示每个线程和方法的执行。
- Profile面板 提供方法调用花费的时间的概要。
Timeline面板
Timeline面板可视化了你的代码如何随时间执行。如下图所示:
Timeline面板的X轴表示时间,Y轴表示线程:
- 每行显示一个线程的执行。
- 时间轴上的每个栏表示一个方法。
- 栏的宽度表示该方法执行的时间。
- 不同的方法使用不同的颜色来表示。
Timeline面板有几个常用的操作:
- 在线程的时间轴上按住鼠标选中一块区域将放大该区域。
- 在最上方的时间轴上按住鼠标拖动将缩小时间轴。
- 在最上方的时间轴上双击将缩小时间轴到最初的状态。
Profile面板
Profile面板显示了所有方法的列表。如下图所示:
Profile面板提供了方法调用花费的时间的概要:
- 选择一个方法可以查看它的父方法和子方法,以及它们的调用时间。
- 选中的方法同时也会在Timeline面板中高亮显示,反之亦然。
- 默认情况下,所有方法以Inclusive Cpu Time的降序进行排列。
- 点击列标签可以按照该列的升序或者降序来排列所有方法。
Profile面板的列的具体说明如下表所示:
列 | 说明 |
---|---|
Name | 方法名 |
Inclusive Time | 方法调用自身花费的时间加上所有子方法调用花费的时间 |
Exclusive Time | 方法调用自身花费的时间,不包括子方法调用花费的时间 |
Calls+RecurCalls/Total | 方法调用的次数+递归调用的次数/总的方法调用次数 |
Time/Call | 单次方法调用花费的平均时间 |
分析性能问题
根据Traceview工具显示的方法调用时间和调用次数,我们可以分析应用的性能问题。常用的分析思路如下:
- 根据方法调用时间百分比的降序,我们可以跟踪那些执行时间百分比较大的方法,分析是否有性能问题。例如,跟踪页面的测量、布局、绘制相关的方法调用时间百分比,分析UI是否有性能问题。
- 结合单次方法调用花费的时间的降序和方法调用时间百分比,我们可以跟踪那些单次执行时间百分比较大的方法,分析是否有性能问题。
- 结合方法调用次数的降序和方法调用时间百分比,我们可以跟踪那些单次执行时间不长但是频繁执行导致执行时间百分比较大的方法,分析是否有性能问题。
- 发现执行时间异常的方法之后,还要跟踪是方法调用自身花费的时间异常,还是某一个子方法调用花费的时间异常,以此一步步地定位到有性能问题的方法。
总结
Traceview是一个用来查看应用执行日志的图形化工具。通过它,我们可以直观地查看应用代码是如何随时间执行的,以及每个方法的执行时间和调用堆栈等信息。Traceview工具可以帮助我们跟踪应用代码中的性能问题。
参考
- https://developer.android.com/studio/profile/traceview.html
- https://developer.android.com/studio/profile/traceview-walkthru.html