无论是哪本讲解布局优化的参考书,它们都不得不提到Hierarchy Viewer。不过,通常情况下,Hierarchy( 英['haɪərɑːkɪ])Viewer无法在真机上进行使用,它只能在工厂的Demo机和模拟器上使用,即非加密过的设备。Google的大神——Romain Guy提供了一个开源项目View Server,通过这个程序可以让普通的手机也能使用Hierarchy Viewer,有兴趣的朋友可以前去了解一下,传送门:点击前往
下面在模拟器中使用这个工具,如图进入ADM:
![9125154-1dfc12348540df51.png](https://i-blog.csdnimg.cn/blog_migrate/268a876281807fe3b923e9b0918e01d4.webp?x-image-process=image/format,png)
进入ADM界面之后,如下图点击右上角DDMS左侧按钮,弹出对话框,再点击Hierarchy Viewer,然后OK,即可打开Hierarchy Viewer界面:
![9125154-d06b09a80fe2a82c.png](https://i-blog.csdnimg.cn/blog_migrate/4076cb783f0d6bf0adb97ffe98fcc650.webp?x-image-process=image/format,png)
Hierarchy Viewer界面:
![9125154-edd64f2f52b7871c.png](https://i-blog.csdnimg.cn/blog_migrate/2239497b11f836c9c04cfcd7503075c6.webp?x-image-process=image/format,png)
可以双击Windows栏下对应进程进行调试,注意右上角两个按钮分别是“refresh”和“load”的功能键:
![9125154-e9ba046d45fd4943.png](https://i-blog.csdnimg.cn/blog_migrate/2efc1f4aecabe66a3e24a52698310f2c.webp?x-image-process=image/format,png)
为了测试这个工具,我们写了一个非常冗余的布局文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.performanceoptimizationtest.HierarchyViewerTest">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hierarchyviewer"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
如此可以发现,只用三层LinearLayout嵌套,只装载了一个Button,很显然这些LinearLayout都是冗余的。下面利用工具进行分析:
![9125154-b26b9ca714b2e129.png](https://i-blog.csdnimg.cn/blog_migrate/c5075b5199cadc0f88cb83c7a705eb45.webp?x-image-process=image/format,png)
通常情况下,重点关注!!! ID为content的FrameLayout分支,这也是setContentView()所设置的内容,如图:
![9125154-475ce56abda701c4.png](https://i-blog.csdnimg.cn/blog_migrate/2a325decae5166c9b86c84b6e79cfe7f.webp?x-image-process=image/format,png)
在这里可以看见三层LinearLayout,而且这三层LinearLayout都没有任何分支。这说明了这些LinearLayout都是可以直接去掉的,这与我们的分析是一样的。
当点击其中一个View的时候,可以显示该View的绘制情况。不过,第一次点击的时候,各种显示时间都将是N/A,需要点击下图中的按钮重新进行计算,才能获取绘制信息:(!!!!!!!有时候会获取失败,这个时候只能关掉模拟器和ADM,重新打开试试了)
![9125154-946b00e7085b0fe3.png](https://i-blog.csdnimg.cn/blog_migrate/e4ceeb84f780a85f53d7331724f71b96.webp?x-image-process=image/format,png)
此时就可以知道每个View所绘制的时长,并且系统在下方也给出了三个不同颜色的小圆点,用来表示绘制的效率,绿、黄、红分别代表好、中、差三种不同的绘制效率。
![9125154-493c33281fc863a0.png](https://i-blog.csdnimg.cn/blog_migrate/03761dbfea748ead19b9a1f96df2eaef.webp?x-image-process=image/format,png)
![9125154-8d719a468b1fb7ad.png](https://i-blog.csdnimg.cn/blog_migrate/6db20849689aa86d0602cd7864873b91.webp?x-image-process=image/format,png)
通过Hierarchy Viewer工具,就可以很快地在视图树中找到冗余的布局,从而有目的地优化布局。同时,Hierarchy Viewer工具还可显示很多有用的信息,如下如:
![9125154-9a6c8e00ce13bdae.png](https://i-blog.csdnimg.cn/blog_migrate/9fe2462bcc7bb9b30142d522fa56003f.webp?x-image-process=image/format,png)
总之,Hierarchy Viewer是进行布局优化的一个非常有用的工具,大家可以在官方API文档或者各大平台中了解更多详细的过程。