Android的UI分析利器——Hierarchy Viewer

简介

Android的SDK工具包中为我们提供了一个帮助我们更好地检视和设计用户界面(UI)的工具——Hierarchy Viewer。
Hierarchy Viewer能够以可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助我们优化布局设计。
官方说法如下:

Sometimes your application’s layout can slow down your application.
To help debug issues in your layout, the Android SDK provides the Hierarchy Viewer.

打开方式

Eclipse

1
Window > Open Perspective > Other

在弹出的对话框中选择

1
Hierarchy Viewer

Android Studio

1
2
Tools > Android > Android Device Monitor
Window > Open Perspective

在弹出的对话框中选择

1
Hierarchy Viewer

SDK Tools

在Android的SDK下的tools目录,单击下面这个文件

1
monitor.bat

注意

  1. tools目录下有一个文件
    1
    hierarchyviewer.bat

这个是早期的Hierarchy Viewer工具,现在已经废弃
这个工具与当前的Hierarchy Viewer实现的功能是一样的,但是界面有很大区别,坑爹的是,当前网上关于Hierarchy Viewer的资料几乎都以这个早期的工具为原型讲解,包括谷歌官方文档Optimizing Your UI
这导致看网上相关内容时,会发现跟自己的界面完全不同,无所适从!
我们本篇的内容是以最新的Hierarchy Viewer来讲解的。

  1. 只有开发版的Android上才可以使用Hierarchy Viewer,所以,把你的手机root先!
    官网是这么说的:

    To preserve security, Hierarchy Viewer can only connect to devices running a developer version of the Android system

使用

为了方便使用,这里建了一个小工程,使用了非常简单的layout,一个TextView,一个ProgressBar组成的LinearLayout,跟LinearLayout平级的是一个ImageView,最外层是RelativeLayout。
UIDemo

Windows

首先进入视线的是Windows视图,显示了当前的窗口,可以看到,当前运行的应用的Activity会显示在Windows视图上面。
双击我们的Activity或者点击LoadViewHierarchy按钮,就会开始遍历我们的View结构,生成我们所需要的View信息了。

Tree View

我们知道,Android的View是以树结构组织的,每一个View可以有子View,也可以有父View。Tree View界面就为我们直观的展示了当前Activity的View树结构。
TreeView
我们可以通过左下角的Filter by class or id:输入框来检索我们需要查看的View,它会将匹配到的View在图中高亮。
右下角可以控制当前展示的界面的大小,当然也可以通过鼠标滚轮控制。
TreeView界面的右上角有一排工具:
TreeViewTools
从左到右依次是:

  • Save the tree view as a PNG image - 把当前视图保存为图片
  • Capture the window layers as a photoshop document - 保存为PhotoShop可以打开的psd文件(用 Photoshop的文档图来理解应用是怎么创建的是很有用的)
  • Reload the view hierarchy - 重新加载
  • Display the selected view image in a separate window - 弹出一个新的窗口显示当前选中的视图
  • Invalidate the layout for the current window
  • Request the view to layout
  • Request the view to output its displaylist to logcat
  • Obtain layout times for tree rooted as selected node - 获取选中视图的布局时间

这里重点看最后一个。选择一个View,点击这个Tool按钮,系统就会重新绘制一遍这个View(包括其子View),然后计算出绘制的时间,而这个就是我们看UI性能的最重要的参数了。
这里,我们选择了终极父View——DecorView,就是整棵树的根View,然后点击了Obtain layout times按钮,得到的效果如下:
TreeViewLayoutTime
这个时候,点击任何一个你感兴趣的View,就能看到这个View绘制的性能数据了。数据主要包括了Measure、Layout、Draw的时间。这边盗用一下官网提供的图:
TreeViewNode
三个圆点分别代表了Measure、Layout、Draw所占的时间相对于树中其他View的速度。

  • 绿色:该阶段比其他50%的控件都快
  • 黄色:该阶段比其他50%的控件都慢
  • 红色:该阶段最慢

根据这个性能数据,我们就能看出不同的阶段,哪个View耗时最多,根据这个就可以去排查UI性能问题了。

Tree Overview

展示整棵View树,如果View过于复杂,我们就会迷失在Tree View中,这个时候,就需要根据Tree Overview来自我定位了。
TreeOverview

Layout View

展示了我们的Activity的UI图,当然,只是展示了一个一个View的框架。直接在Tree View中找到我们的View不是一件易事,特别是View树非常复杂的时候,这个时候,就可以先在LayoutView界面中找到我们的View,至少是父View,点击一下,Tree View就自动定位到了我们查看的View了。
LayoutView

View Properties

选定特定的View后,就能通过View Properties去查看它的具体属性值了,什么width,height,什么margin,padding的,都不在话下。
ViewProperties

参考

Optimizing Your UI