本指南介绍如何浏览和解读 Systrace 报告。要解读 Perfetto 报告,请参阅 Trace Processor 文档。
典型报告的元素
Systrace 生成一个输出 HTML 文件,其中包含一系列部分。该报告列出每个进程的线程。如果给定线程渲染 UI 帧,则报告还会在时间线上指示渲染的帧。当您在报告中从左到右移动时,时间会向前推移。
从上到下,报告包含以下部分。
用户交互
第一部分包含表示应用或游戏中特定用户交互的条形,例如点击设备屏幕。这些交互用作有用的时间标记。
CPU 活动
下一部分显示表示每个 CPU 中线程活动的条形。这些条形显示所有应用(包括您的应用或游戏)的 CPU 活动。
CPU 活动部分是可展开的,允许您查看每个 CPU 的时钟频率。图 1 显示了已折叠的 CPU 活动部分的示例,图 2 显示了显示时钟频率的展开版本
系统事件
此部分中的直方图显示特定的系统级事件,例如纹理计数和特定对象的总大小。
值得仔细检查的一个直方图是标有 SurfaceView 的直方图。计数表示已传递到显示管线并等待显示在设备屏幕上的合成帧缓冲区的数量。由于大多数设备是双缓冲或三缓冲的,因此此计数几乎总是 0、1 或 2。
图 3 中显示了其他描述 Surface Flinger 进程的直方图,包括 VSync 事件和 UI 线程交换工作
显示帧
本节通常是报告中最长的一部分,它显示了一条多色线条,后面跟着一堆条形图。这些形状表示特定线程(已创建)的状态和帧栈。栈的每一层都表示对 beginSection()
的调用,或者表示您为应用或游戏定义的 自定义跟踪事件 的开始。
每个条形图堆栈上方的多色线条表示特定线程随时间推移的状态集。线条的每个片段可以包含以下颜色之一
- 绿色:运行中
- 线程正在完成与某个进程相关的工作或响应中断。
- 蓝色:可运行
- 线程可供运行,但当前未调度。
- 白色:睡眠
- 线程没有工作要做,可能是因为线程被互斥锁阻塞。
- 橙色:不可中断睡眠
- 线程被 I/O 阻塞或等待磁盘操作完成。
- 紫色:可中断睡眠
- 线程被另一个内核操作阻塞,通常是内存管理。
键盘快捷键
下表列出了在查看 Systrace 报告时可用的键盘快捷键
键 | 描述 | |
---|---|---|
W | 放大跟踪时间线。 | |
A | 在跟踪时间线上向左平移。 | |
S | 缩小跟踪时间线。 | |
D | 在跟踪时间线上向右平移。 | |
E | 将跟踪时间线居中到当前鼠标位置。 | |
M | 设置当前选择的框架。 | |
1 | 将当前活动的选择模式更改为“选择”模式。对应于鼠标选择器工具栏中出现的第一个按钮(参见右侧的图像)。 | |
2 | 将当前活动的选择模式更改为“平移”模式。对应于鼠标选择器工具栏中出现的第二个按钮(参见右侧的图像)。 | |
3 | 将当前活动的选择模式更改为“缩放”模式。对应于鼠标选择器工具栏中出现的第三个按钮(参见右侧的图像)。 | |
4 | 将当前活动的选择模式更改为“定时”模式。对应于鼠标选择器工具栏中出现的第四个按钮(参见右侧的图像)。 | |
G | 在当前选定任务的开始处显示网格。 | |
Shift + G | 在当前选定任务的结束处显示网格。 | |
左箭头 | 选择当前选定时间线上之前的事件。 | |
右箭头 | 选择当前选定时间线上的下一个事件。 |
调查性能问题
与 Systrace 报告交互时,您可以检查录制期间设备的 CPU 使用情况。有关 HTML 报告导航的帮助,请参阅 键盘快捷键 部分,或点击报告右上角的?按钮。
以下部分说明如何检查报告中的信息以查找和解决性能问题。
识别性能问题
在浏览 Systrace 报告时,您可以通过执行以下一项或多项操作更轻松地识别性能问题
- 通过在时间间隔周围绘制矩形来选择感兴趣的时间间隔。
- 使用标尺工具标记或突出显示问题区域。
- 通过点击查看选项 > 突出显示 VSync 来显示每个显示刷新操作。
检查 UI 帧和警报
如图 4 所示,Systrace 报告列出了渲染 UI 帧的每个进程,并在时间线上指示每个渲染的帧。在保持稳定的每秒 60 帧所需的 16.6 毫秒内渲染的帧用绿色帧圆圈表示。渲染时间超过 16.6 毫秒的帧用黄色或红色帧圆圈表示。
点击帧圆圈会突出显示它并提供有关系统为渲染该帧所做的工作的其他信息,包括警报。该报告还向您显示系统在渲染该帧时正在执行的方法。您可以调查这些方法以确定 UI 卡顿的潜在原因。
选择缓慢的帧后,您可能会在报告的底部窗格中看到一个警报。图 5 中显示的警报指出,该帧的主要问题是花费了过多的时间在 ListView
的回收和重新绑定上。跟踪中有关事件的链接提供了有关系统在此期间正在执行的操作的更多信息。
要查看工具在跟踪中发现的每个警报,以及设备触发每个警报的次数,请点击窗口最右侧的警报选项卡,如图 6 所示。警报面板可帮助您查看跟踪中出现哪些问题以及它们多久会造成卡顿。您可以将此面板视为要修复的错误列表。通常,在一个区域进行少量更改或改进就可以消除一整套警报。
如果您发现 UI 线程上执行了过多的工作,请使用以下方法之一来帮助确定哪些方法消耗了过多的 CPU 时间
- 如果您对哪些方法可能导致瓶颈有想法,请向这些方法添加跟踪标记。要了解更多信息,请参阅有关如何在代码中 定义自定义事件 的指南。
- 如果您不确定 UI 瓶颈的来源,请使用 Android Studio 中提供的 CPU 分析器。您可以 生成跟踪日志,然后使用 CPU 分析器导入和检查它们。