Android 包含一些设备上的开发者选项,可帮助您直观地了解应用在渲染其 UI 时可能遇到的问题,例如执行不必要的渲染工作,或执行长时间的线程和 GPU 操作。本页介绍如何调试 GPU 过度绘制和分析 GPU 渲染。
要详细了解设备上的开发者选项(包括如何启用它们),请阅读配置设备上的开发者选项。
分析 GPU 渲染速度
“GPU 渲染配置文件”工具以滚动直方图的形式显示 UI 窗口渲染帧所需时间的视觉表示,其基准为每帧 16.67 毫秒。
在性能较低的 GPU 上,可用的填充率(GPU 填充帧缓冲区的速度)可能很低。随着绘制帧所需的像素数量增加,GPU 处理新命令可能需要更长时间,并要求系统其他部分等待直到其完成。此分析工具可帮助您识别 GPU 何时在尝试绘制像素时不堪重负,或何时受到严重过度绘制的困扰。
启用分析器
开始之前,请确保您使用的设备运行 Android 4.1 (API level 16) 或更高版本,并且已启用开发者选项。要在使用应用时开始分析设备 GPU 渲染,请按以下步骤操作:
- 在您的设备上,转到设置,然后点按开发者选项。
- 在监控部分,选择GPU 渲染配置文件或HWUI 渲染配置文件,具体取决于设备上运行的 Android 版本。
- 在“GPU 渲染配置文件”对话框中,选择屏幕条形图以在设备屏幕上叠加图表。
- 打开您要分析的应用。
检查输出
在图 1 所示的 GPU 渲染配置文件放大图中,您可以看到彩色部分,与 Android 6.0 (API level 23) 上的显示效果相同。
图 1. 放大的 GPU 渲染配置文件图。
以下是关于输出的几点注意事项:
- 对于每个可见应用,该工具都会显示一个图表。
- 水平轴上的每个垂直条形代表一个帧,每个垂直条形的高度代表渲染该帧所需的时间(以毫秒为单位)。
- 水平绿线代表 16.67 毫秒。为了达到每秒 60 帧,每个帧的垂直条形需要保持在此线以下。任何时候条形超出此线,动画可能会出现暂停。
- 该工具通过使相应条形更宽、透明度更低来突出显示超出 16.67 毫秒阈值的帧。
- 每个条形都有彩色组件,这些组件映射到渲染管道中的一个阶段。组件的数量因设备的 API 级别而异。
下表提供了使用运行 Android 6.0 及更高版本的设备时,分析器输出中垂直条形每个部分的说明。
条形组件 | 渲染阶段 | 描述 |
---|---|---|
交换缓冲区 | 表示 CPU 等待 GPU 完成工作的时间。如果此条形很高,则表示应用在 GPU 上执行了过多工作。 | |
命令发出 | 表示 Android 2D 渲染器向 OpenGL 发出命令以绘制和重新绘制显示列表所花费的时间。此条形的高度与每个显示列表执行所需时间的总和成正比——显示列表越多,红色条形越高。 | |
同步与上传 | 表示将位图信息上传到 GPU 所需的时间。较大的部分表示应用加载大量图形花费了大量时间。 | |
绘制 | 表示用于创建和更新视图显示列表的时间。如果此条形部分很高,则可能存在大量自定义视图绘制或 onDraw 方法中的大量工作。 | |
测量/布局 | 表示在视图层次结构中执行 onLayout 和 onMeasure 回调所花费的时间。较大的部分表示视图层次结构处理时间较长。 | |
输入处理与动画 | 表示评估该帧运行的所有动画器以及处理所有输入回调所花费的时间。如果此部分较大,可能表明自定义动画器或输入回调花费了过多时间进行处理。滚动期间的视图绑定,例如 RecyclerView.Adapter.onBindViewHolder() ,通常也发生在此部分,并且是此部分中更常见的减速来源。 |
|
其他时间/垂直同步延迟 | 表示应用在两个连续帧之间执行操作所花费的时间。它可能表明 UI 线程中发生了过多的处理,这些处理可以分流到不同的线程。 |
表 1. Android 6.0 及更高版本中的组件条形。
Android 4.0 (API level 14) 到 5.0 (API level 21) 之间的版本具有蓝色、紫色、红色和橙色段。Android 4.0 以下的版本仅包含蓝色、红色和橙色组件。下表显示了 Android 4.0 和 5.0 中的组件条形。
条形组件 | 渲染阶段 | 描述 |
---|---|---|
处理 | 表示 CPU 等待 GPU 完成工作的时间。如果此条形很高,则表示应用在 GPU 上执行了过多工作。 | |
执行 | 表示 Android 2D 渲染器向 OpenGL 发出命令以绘制和重新绘制显示列表所花费的时间。此条形的高度与每个显示列表执行所需时间的总和成正比——显示列表越多,红色条形越高。 | |
XFer | 表示将位图信息上传到 GPU 所需的时间。较大的部分表示应用加载大量图形花费了大量时间。此部分在运行 Android 4.0 或更低版本的设备上不可见。 | |
更新 | 表示用于创建和更新视图显示列表的时间。如果此条形部分很高,则可能存在大量自定义视图绘制或 onDraw 方法中的大量工作。 |
表 2. Android 4.0 和 5.0 中的组件条形。
有关如何解释分析工具提供的信息的更多信息,请阅读使用 GPU 渲染配置文件进行分析。
注意:虽然此工具名为“GPU 渲染配置文件”,但所有受监控的进程实际上都发生在 CPU 中。渲染是通过向 GPU 提交命令进行的,GPU 异步渲染屏幕。在某些情况下,GPU 可能有太多工作要做,您的 CPU 将不得不等待才能提交新命令。发生这种情况时,您会看到橙色和红色条形出现峰值,并且命令提交将阻塞,直到 GPU 命令队列中有更多空间。
可视化 GPU 过度绘制
开发者选项中的另一个功能可帮助您通过 UI 颜色编码来识别过度绘制。过度绘制发生在您的应用在同一帧内多次绘制同一像素时。因此,此可视化显示了您的应用可能在执行不必要的渲染工作,这可能会导致性能问题,因为 GPU 需要额外努力来渲染用户不可见的像素。因此,您应该尽可能修复过度绘制事件。
如果您尚未这样做,请启用开发者选项。然后,要在设备上可视化过度绘制,请按以下步骤操作:
- 在您的设备上,转到设置,然后点按开发者选项。
- 向下滚动到硬件加速渲染部分,然后选择调试 GPU 过度绘制。
- 在调试 GPU 过度绘制对话框中,选择显示过度绘制区域。
Android 按如下方式对 UI 元素进行着色以识别过度绘制量:
- 真实颜色:无过度绘制
蓝色:过度绘制 1 次
绿色:过度绘制 2 次
粉色:过度绘制 3 次
红色:过度绘制 4 次或更多

图 2. 应用正常显示时(左)和启用 GPU 过度绘制时(右)的显示效果
请注意,这些颜色是半透明的,因此您在屏幕上看到的具体颜色取决于 UI 的内容。
既然您已经能够识别布局中过度绘制发生的位置,请阅读如何减少过度绘制。
请记住,有些过度绘制是不可避免的。在调整应用用户界面时,请尝试获得主要显示真实颜色或仅 1X 过度绘制(蓝色)的可视化效果。

图 3. 具有大量过度绘制(左)和极少过度绘制(右)的应用示例