使用层级查看器分析您的布局

层级查看器已弃用。如果您使用的是 Android Studio 3.1 或更高版本,您应该改用 布局检查器 来检查应用程序的视图层次结构在运行时的状态。要分析应用程序布局的渲染速度,请使用 Window.OnFrameMetricsAvailableListener,如 这篇博文 中所述。

层级查看器是 Android 设备监控器 中内置的工具,它允许您测量布局中每个视图的布局速度。它可以帮助您找到由视图层次结构的结构引起的性能瓶颈。

注意:层级查看器不再开发。要在运行时检查视图层次结构中的属性,您应该改用 Android Studio 中的 布局检查器。但是,布局检查器目前不提供有关布局性能的分析详细信息。

此页面介绍了层级查看器,并逐步介绍了如何分析您的布局。

开始准备

如果您使用的是 Android 模拟器,您可以跳过此部分。否则,您需要按以下步骤设置您的设备。

注意:您的设备必须运行 Android 4.1 或更高版本。

  1. 在您的设备上启用 开发者选项
  2. 在您的开发机器上设置环境变量 ANDROID_HVPROTO=ddm

    此变量告诉层级查看器使用 ddm 协议连接到设备,该协议与 DDMS 协议相同。需要注意的是,主机上只能有一个进程连接到设备,因此您必须终止任何其他 DDMS 会话才能运行层级查看器。

启动层级查看器

图 1. Android 设备监控器

  1. 将您的设备连接到您的计算机。如果设备上显示提示您 允许 USB 调试? 的对话框,请点击 确定
  2. 在 Android Studio 中打开您的项目,构建并在设备上运行它。
  3. 启动 Android 设备监控器。Android Studio 可能会显示 禁用 adb 集成 对话框,因为一次只能通过 adb 连接到设备的一个进程,而 Android 设备监控器正在请求连接。因此,请点击

    图 1 说明了 Android 设备监控器最初显示的内容。

  4. 在菜单栏中,选择 窗口 > 打开透视图,然后点击 层级视图

    您应该看到类似于图 2 中显示的排列。如果不是,请 select 窗口 > 重置透视图 返回默认布局。

  5. 在左侧 窗口 选项卡中双击您的应用程序的包名称。这将在窗格中填充应用程序的视图层次结构。

熟悉这些工具

图 2. 层级查看器窗格。

层级查看器提供以下窗格(如图 2 所示)

  • 树形视图(中心):显示视图层次结构的树形视图。您可以使用鼠标和底部缩放控件拖动和缩放树。每个节点表示其 View 类名称和 ID 名称。
  • 树形概述(右上角):提供应用程序完整视图层次结构的鸟瞰图。移动灰色矩形可更改 树形视图 中可见的视口。
  • 布局视图(右下角):显示布局的线框视图。当前选定视图的轮廓为红色,其父视图为浅红色。

    点击此处的一个视图也会在 树形视图 中选中它,反之亦然。

视图层次结构是布局的快照,因此不会自动更新。要更新层次结构视图,请点击 重新加载视图层次结构

要使视图失效(在下次布局更新期间请求系统调用 onDraw()),请在层次结构中选择一个视图,然后点击 使布局失效 (这等效于在视图上调用 invalidate())。要请求视图(和任何子视图)实际进行布局,请点击 请求布局

如果导航到其他应用程序,则必须从左侧窗格的 窗口 选项卡中选择该应用程序才能查看其视图层次结构。

要查看有关视图的详细信息,包括其测量、布局和绘制时间(如图 3 所示),请点击 树形视图 中的视图。双击视图以查看其放大的图像。

图 3. 视图节点显示的部分内容。

要查看视图的属性,请点击左侧窗格中的 视图属性 选项卡,如图 4 所示。

图 4. 视图属性 选项卡的位置。

要将布局的分层屏幕截图保存到 Adobe Photoshop (PSD) 文件,请点击工具栏中的 捕获窗口图层 。每个视图都将保存为其自己的图层,因此您可以通过隐藏和调整每个视图来轻松创建新的模拟。

分析您的布局

图 5. 分析后的视图层次结构。

现在您已经熟悉了该工具,您可以使用它来分析视图层次结构并解释结果。

  1. 树形视图布局视图 中,点击您要分析其子视图的视图节点。
  2. 要开始分析,请点击 获取布局时间 ,位于 树形视图 顶部的。

    对于大型视图层次结构,分析可能需要几秒钟。

选定节点的每个子视图都会获得三个点,这些点可以是绿色、黄色或红色。

  • 左边的点表示渲染管道的 绘制过程
  • 中间的点表示 布局阶段
  • 右边的点表示 执行阶段

图 6. 彩色点与
渲染管道的关系。

这些点大致对应于处理管道的测量、布局和绘制阶段。点的颜色表示该节点相对于本地族中所有其他分析节点的相对性能。

  • 绿色表示该视图的渲染速度比至少一半的其他视图快。
  • 黄色表示该视图的渲染速度比其他视图的下半部分快。
  • 红色表示该视图属于渲染速度最慢的视图的一半。

解读结果

层级视图测量每个节点的性能相对于同级视图,因此配置文件中始终存在红色节点(除非所有视图的性能都相同),这并不一定意味着红色节点的性能很差(只是它在本地视图组中是最慢的视图)。

层级视图会对您的布局进行光栅化以获取时间信息。光栅化是指将高级基元(例如圆形或矢量字体)转换为屏幕上的像素的过程。通常,光栅化由您设备上的 GPU 完成,但在软件光栅化的情况下,渲染是在 CPU 上使用普通软件完成的。这意味着报告的绝对时间彼此之间是正确的,但会膨胀并且会根据您设备和开发机器上的整体和不断变化的 CPU 工作负载而变化。因此,它并不反映设备上的实际性能速度,您应该进行多次分析以了解平均测量值。

在任何应用程序性能意外缓慢的情况下,红色节点都是一个潜在问题。在相对设置中,始终存在最慢的节点;只要确保它是您预期的节点即可。以下示例说明了如何解释红点。

  • 在叶节点或只有少数子节点的视图组中查找红点。这可能表明存在问题。您的应用程序可能并不缓慢,或者它可能在您的设备上并不缓慢,但您需要了解为什么该点是红色的。SystraceTraceview 可以为您提供更多信息。
  • 如果您有一个包含许多子节点的视图组以及红色测量阶段,请查看子节点以了解它们的性能。
  • 具有黄色甚至红色点的视图在设备上可能并未运行缓慢。这就是实际数字有帮助的地方。SystraceTraceview 可以为您提供更多信息。
  • 如果层级结构的根视图具有红色测量阶段、红色布局阶段和黄色绘制阶段,则这在某种程度上是典型的,因为它是所有其他视图的父视图,并且只有在子视图完成时才能完成其布局。
  • 如果包含 20 多个视图的树中的叶节点具有红色绘制阶段,则确实存在问题。检查您的 onDraw() 方法以查看其中是否存在不应该存在的代码。

有关更多布局提示,请参阅 改进布局性能