本指南介绍了如何浏览和解读 Systrace 报告。要解读 Perfetto 报告,请参阅 Trace Processor 文档。
典型报告的元素
Systrace 生成一个输出 HTML 文件,其中包含一系列部分。该报告列出了每个进程的线程。如果给定的线程渲染 UI 帧,则报告还会在时间线上指示渲染的帧。随着您在报告中从左到右移动,时间将向前推移。
从上到下,报告包含以下部分。
用户交互
第一部分包含表示应用或游戏中特定用户交互的条形,例如点击设备屏幕。这些交互用作有用的时间标记。
CPU 活动
下一部分显示表示每个 CPU 中线程活动的条形。这些条形显示了所有应用(包括您的应用或游戏)的 CPU 活动。
CPU 活动部分是可扩展的,允许您查看每个 CPU 的时钟频率。图 1 显示了一个折叠的 CPU 活动部分示例,图 2 显示了一个展开的版本,其中显示了时钟频率
系统事件
此部分中的直方图显示特定的系统级事件,例如纹理计数和特定对象的总大小。
一个值得仔细检查的直方图是标有SurfaceView的那个。计数代表已传递到显示管道并等待显示在设备屏幕上的合成帧缓冲区的数量。由于大多数设备都是双缓冲或三缓冲的,因此此计数几乎总是 0、1 或 2。
其他描述 Surface Flinger 进程的直方图,包括 VSync 事件和 UI 线程交换工作,如图 3 所示。
显示帧
此部分通常是报告中最长的一部分,它描述了一条彩色线条,后面跟着一组条形图。这些形状代表特定线程(已创建)的状态和帧栈。栈的每一层都代表对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 Profiler。您可以生成跟踪日志,然后使用 CPU Profiler 导入和检查它们。