前言
在开发应用时,你需要检查应用的交互是平滑流畅的。Systrace工具可以帮助你收集设备上运行的所有进程的时间信息,并生成一个详细的HTML报告。它显示了给定时间内CPU的使用情况以及每个进程和线程在做什么。它还自动分析了捕获的跟踪信息,并高亮显示它所观察到的性能问题,同时提供了如何修复问题的建议。Systrace工具特别适合用来分析UI的性能。
前提条件
使用Systrace工具有几个前提条件:
- Android SDK Tools版本不低于20。
- Android设备的系统版本不低于4.1。
- 如果使用命令行运行,计算机需要安装Python。
准备工作
使用Systrace工具之前,需要做一些准备工作:
- 将设备连接到计算机。
- 开启设备的 开发者选项、USB调试 和 USB安装。
- 在设备上运行待跟踪的应用。
使用Systrace
Systrace工具可以从图形用户界面运行,也可以从命令行运行。
使用图形用户界面运行
Systrace工具内置在Android Device Monitor中。启动Android Device Monitor有两种方法:
- 在Android Studio中,点击 Tools > Android > Android Device Monitor。
- 进入Android SDK根目录下的 tools 目录,运行 monitor 程序。
如下图所示:
确保你的设备和应用显示在Devices选项卡中。在 Devices 选项卡中,选中你的设备,然后点击Systrace按钮 ,打开Systrace工具的配置对话框。如下图所示:
Systrace工具的配置对话框的各个设置项的说明如下表所示:
设置项 | 说明 |
---|---|
Destination File | trace文件的保存位置 |
Trace duration (seconds) | trace的时长 |
Trace Buffer Size (kb) | trace的缓存大小 |
Enable Application Traces from | 使能应用等级的trace |
Commonly Used Tags | 常用的trace选项 |
Advanced Options | 高级的trace选项 |
注意: 当你在应用代码中使用Trace类添加自己的跟踪标记时,Enable Application Traces from设置项需要设置为你的应用包名。即使你没有在应用代码中添加自己的跟踪标记,你也应该设置Enable Application Traces from设置项的值为你的应用包名。因为默认情况下,许多库(比如RecyclerView)的代码里添加了可以提供有用信息的跟踪标记。
最后,点击OK,Systrace工具开始跟踪。开始跟踪之后,在应用需要跟踪的页面进行交互操作。
使用命令行运行
使用命令行运行Systrace工具必须先安装Python,并将其添加到系统的PATH环境变量中。
使用命令行运行Systrace工具的语法如下所示:
$ python systrace.py [options] [category1] [category2] ... [categoryN]
对于Android 4.3及以上版本的设备和Android 4.2及以下版本的设备,Systrace工具有不同的命令行选项,具体内容可以参考官网。
Android 4.3及以上版本的设备
在Android 4.3及以上版本的设备上使用Systrace工具时,你可以省略跟踪类别标签来获得默认值,或者你可以手动指定包含的标签。示例如下所示:
$ cd android-sdk/platform-tools/systrace
$ python systrace.py -o trace.html --time=10 --app=com.github.cyc.study sched gfx view wm
Android 4.2及以下版本的设备
在Android 4.2及以下版本的设备上使用Systrace工具需要两个步骤。你必须首先设置要捕获的跟踪标签,然后运行跟踪。示例如下所示:
$ cd android-sdk/platform-tools/systrace
$ python systrace.py --set-tags gfx,view,wm
$ adb shell stop
$ adb shell start
$ python systrace.py -o trace.html --time=10
Trace应用代码
Android系统默认添加的跟踪标记无法跟踪应用的所有行为。你可以根据需要在应用代码里添加自定义的标记。在Android 4.3 (API level 18) 及以上版本中,你可以使用 Trace 类在应用代码中添加标记。
使用 Trace.beginSection() 静态方法来标记一次跟踪的开始,使用 Trace.endSection() 静态方法来标记一次跟踪的结束。示例代码如下所示:
private void doTask() {
if (Build.VERSION.SDK_INT >= 18) {
Trace.beginSection("MainActivity.doTask()");
}
// 模拟执行任务
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 18) {
Trace.endSection();
}
}
注意:
- Trace.endSection()方法结束的是最近一次调用的Trace.beginSection()方法。因此,要确保开始和结束的方法调用是正确匹配的。
- Trace.beginSection()和Trace.endSection()方法必须在同一个线程中调用。
- 在try…catch语句中,必须在finally块中调用Trace.endSection()方法,以确保即使抛出异常也会调用结束方法。
- 在使用Systrace工具之前需要使能应用等级的trace,否则Systrace工具无法跟踪在应用代码里添加的自定义标记。
分析Trace报告
Systrace工具跟踪结束之后会在指定目录下生成一个详细的HTML报告文件。该文件需要使用Google Chrome浏览器打开。打开之后,如下图所示:
Trace报告的X轴表示时间,Y轴以进程进行分组,进程组内是各个线程。每个应用进程包含了每个线程所包含的所有跟踪标记,包括基于启用跟踪类别的高级跟踪事件的层次结构。
Trace报告可以进行一些简单的交互,比如放大、缩小、平移和拖动等。下表列出了几个常用的快捷键:
快捷键 | 描述 |
---|---|
w | 放大时间轴 |
s | 缩小时间轴 |
a | 右移时间轴 |
d | 左移时间轴 |
查看帧
每个应用都显示了一排表示渲染帧的圆形,圆形的颜色通常是绿色的。颜色为黄色或者红色的圆形表示该帧超过了维持平滑流畅的60帧每秒所需的16.6毫秒的运行时间限制。如下图所示:
点击一个圆形会高亮显示它,此时可以只关注系统为该帧所做的工作。在Android 5.0 (API level 21) 及以上版本的设备上,这个工作是由UI线程和Render线程完成的。在以前的版本中,创建一个帧的所有工作都是在UI线程上完成的。
我们还可以单击一个帧的各个组件,看看它们分别运行了多长时间。有一些事件,比如performTraversals,当你选中它时下方会描述系统在该方法中做了什么。
查看警报
Systrace工具对跟踪中的事件进行自动分析,并将许多性能问题作为警报,警报中会提供如何修复问题的建议。当你选中一个慢帧时,下方会显示一个警报。如下图所示:
你还可以通过单击窗口右方的 Alerts 选项卡来查看Trace报告的所有警报。这样做会展开Alerts面板,在那里你可以看到Systrace工具在跟踪中发现的每一个警报,以及警报的总数。如下图所示:
总结
Systrace工具可以帮助你收集设备上运行的所有进程的时间信息,并生成一个详细的HTML报告。它显示了给定时间内CPU的使用情况以及每个进程和线程在做什么。它还自动分析了捕获的跟踪信息,并高亮显示它所观察到的性能问题,同时提供了如何修复问题的建议。Systrace工具特别适合用来分析UI的性能。
参考
- https://developer.android.com/studio/profile/systrace.html
- https://developer.android.com/studio/profile/systrace-walkthru.html
- https://developer.android.com/studio/profile/systrace-commandline.html