层级查看器已弃用。如果您使用的是 Android Studio 3.1 或更高版本,您应该改用 布局检查器 来检查应用程序的视图层次结构在运行时的状态。要分析应用程序布局的渲染速度,请使用 Window.OnFrameMetricsAvailableListener,如 这篇博文 中所述。
层级查看器是 Android 设备监控器 中内置的工具,它允许您测量布局中每个视图的布局速度。它可以帮助您找到由视图层次结构的结构引起的性能瓶颈。
注意:层级查看器不再开发。要在运行时检查视图层次结构中的属性,您应该改用 Android Studio 中的 布局检查器。但是,布局检查器目前不提供有关布局性能的分析详细信息。
此页面介绍了层级查看器,并逐步介绍了如何分析您的布局。
开始准备
如果您使用的是 Android 模拟器,您可以跳过此部分。否则,您需要按以下步骤设置您的设备。
注意:您的设备必须运行 Android 4.1 或更高版本。
- 在您的设备上启用 开发者选项。
- 在您的开发机器上设置环境变量
ANDROID_HVPROTO=ddm
。此变量告诉层级查看器使用
ddm
协议连接到设备,该协议与 DDMS 协议相同。需要注意的是,主机上只能有一个进程连接到设备,因此您必须终止任何其他 DDMS 会话才能运行层级查看器。
启动层级查看器
- 将您的设备连接到您的计算机。如果设备上显示提示您 允许 USB 调试? 的对话框,请点击 确定。
- 在 Android Studio 中打开您的项目,构建并在设备上运行它。
- 启动 Android 设备监控器。Android Studio 可能会显示 禁用 adb 集成 对话框,因为一次只能通过 adb 连接到设备的一个进程,而 Android 设备监控器正在请求连接。因此,请点击 是。
图 1 说明了 Android 设备监控器最初显示的内容。
- 在菜单栏中,选择 窗口 > 打开透视图,然后点击 层级视图。
您应该看到类似于图 2 中显示的排列。如果不是,请 select 窗口 > 重置透视图 返回默认布局。
- 在左侧 窗口 选项卡中双击您的应用程序的包名称。这将在窗格中填充应用程序的视图层次结构。
熟悉这些工具
层级查看器提供以下窗格(如图 2 所示)
- 树形视图(中心):显示视图层次结构的树形视图。您可以使用鼠标和底部缩放控件拖动和缩放树。每个节点表示其
View
类名称和 ID 名称。 - 树形概述(右上角):提供应用程序完整视图层次结构的鸟瞰图。移动灰色矩形可更改 树形视图 中可见的视口。
- 布局视图(右下角):显示布局的线框视图。当前选定视图的轮廓为红色,其父视图为浅红色。
点击此处的一个视图也会在 树形视图 中选中它,反之亦然。
视图层次结构是布局的快照,因此不会自动更新。要更新层次结构视图,请点击 重新加载视图层次结构 。
要使视图失效(在下次布局更新期间请求系统调用 onDraw()
),请在层次结构中选择一个视图,然后点击 使布局失效 (这等效于在视图上调用 invalidate()
)。要请求视图(和任何子视图)实际进行布局,请点击 请求布局 。
如果导航到其他应用程序,则必须从左侧窗格的 窗口 选项卡中选择该应用程序才能查看其视图层次结构。
要查看有关视图的详细信息,包括其测量、布局和绘制时间(如图 3 所示),请点击 树形视图 中的视图。双击视图以查看其放大的图像。
要查看视图的属性,请点击左侧窗格中的 视图属性 选项卡,如图 4 所示。
要将布局的分层屏幕截图保存到 Adobe Photoshop (PSD) 文件,请点击工具栏中的 捕获窗口图层 。每个视图都将保存为其自己的图层,因此您可以通过隐藏和调整每个视图来轻松创建新的模拟。
分析您的布局
现在您已经熟悉了该工具,您可以使用它来分析视图层次结构并解释结果。
- 在 树形视图 或 布局视图 中,点击您要分析其子视图的视图节点。
- 要开始分析,请点击 获取布局时间 ,位于 树形视图 顶部的。
对于大型视图层次结构,分析可能需要几秒钟。
选定节点的每个子视图都会获得三个点,这些点可以是绿色、黄色或红色。
- 左边的点表示渲染管道的 绘制过程。
- 中间的点表示 布局阶段。
- 右边的点表示 执行阶段。
这些点大致对应于处理管道的测量、布局和绘制阶段。点的颜色表示该节点相对于本地族中所有其他分析节点的相对性能。
- 绿色表示该视图的渲染速度比至少一半的其他视图快。
- 黄色表示该视图的渲染速度比其他视图的下半部分快。
- 红色表示该视图属于渲染速度最慢的视图的一半。
解读结果
层级视图测量每个节点的性能相对于同级视图,因此配置文件中始终存在红色节点(除非所有视图的性能都相同),这并不一定意味着红色节点的性能很差(只是它在本地视图组中是最慢的视图)。
层级视图会对您的布局进行光栅化以获取时间信息。光栅化是指将高级基元(例如圆形或矢量字体)转换为屏幕上的像素的过程。通常,光栅化由您设备上的 GPU 完成,但在软件光栅化的情况下,渲染是在 CPU 上使用普通软件完成的。这意味着报告的绝对时间彼此之间是正确的,但会膨胀并且会根据您设备和开发机器上的整体和不断变化的 CPU 工作负载而变化。因此,它并不反映设备上的实际性能速度,您应该进行多次分析以了解平均测量值。
在任何应用程序性能意外缓慢的情况下,红色节点都是一个潜在问题。在相对设置中,始终存在最慢的节点;只要确保它是您预期的节点即可。以下示例说明了如何解释红点。
- 在叶节点或只有少数子节点的视图组中查找红点。这可能表明存在问题。您的应用程序可能并不缓慢,或者它可能在您的设备上并不缓慢,但您需要了解为什么该点是红色的。Systrace 或 Traceview 可以为您提供更多信息。
- 如果您有一个包含许多子节点的视图组以及红色测量阶段,请查看子节点以了解它们的性能。
- 具有黄色甚至红色点的视图在设备上可能并未运行缓慢。这就是实际数字有帮助的地方。Systrace 或 Traceview 可以为您提供更多信息。
- 如果层级结构的根视图具有红色测量阶段、红色布局阶段和黄色绘制阶段,则这在某种程度上是典型的,因为它是所有其他视图的父视图,并且只有在子视图完成时才能完成其布局。
- 如果包含 20 多个视图的树中的叶节点具有红色绘制阶段,则确实存在问题。检查您的
onDraw()
方法以查看其中是否存在不应该存在的代码。
有关更多布局提示,请参阅 改进布局性能。