使用Hierarchy Viewer进行UI性能优化

来源:互联网 发布:石头剪刀布 网络歌手 编辑:程序博客网 时间:2024/05/24 08:25

Hierarchy Viewer是随AndroidSDK发布的工具,位置在tools文件夹下,名为hierarchyviewer.bat。它是Android自带的非常有用而且使用简单的工具,可以帮助我们更好地检视和设计用户界面(UI)。

有兴趣的同学可以去阅读下原版的文档,附上国内的一个网址链接:http://www.android-doc.com/tools/debugging/debugging-ui.html#HierarchyViewer

1、Hierarchy Viewer的作用

(1)直观地获得UI布局设计结构和各种属性的信息,帮助我们优化布局设计
(2) 结合debug帮助观察特定的UI对象进行invalidate和requestLayout操作的过程

2、HierarchyViewer使用方法

(1)连接设备真机或者模拟器

(2)启动你要观察的应用

(3)打开Hierarchyviewer,点击hierarchyviewer文件即可。连接后如下图,这个图是在官方文档获取的
这里写图片描述

(4)双击最上面的,如下图的 Focused Window,这个是当前窗口,加载完毕后会显示当前界面层次结构。
这里写图片描述

(5)观察层次结构图,这个图有点大,可以拖动。View Hierarchy窗口显示了Activity的所有View对象,选中某个View还可以查看View的具体信息,最好选择工具中的Show Extras选项
这里写图片描述

(6)观察单个view,选择单个view后会出现如下图所示图形。这里会看到Measure、Layout、Draw的耗时,红色或黄色的点代表速度较慢的View对象。但是低性能并不表示一定有问题,特别像是ViewGroup对象,View的子节点越多,结构越复杂,性能越差。
这里写图片描述
对于Android的UI来说,invalidate和requestLayout是最重要的过程,Hierarchyviewer提供了帮助我们Debug特定的UI执行invalidate和requestLayout过程的途径,方法很简单,只要选择希望执行这两种操作的View点击按钮就可以。当然,我们需要在例如onMeasure()这样的方法中打上断点。这个功能对于UI组件是自定义的非常有用,可以帮助单独观察相关界面显示逻辑是否正确。

(7)Pixel Perfect View界面:点击界面左下角类似九宫格的按钮,就进入了Android称之为Pixel Perfect View的界面,这个界面里主要是从细节上观察UI效果:
这里写图片描述
左边是浏览视图,中间是全局的视图,右边是当前关注的地方的细节放大,是像素级别的,对于观察细节非常有用。
Refresh Rate用来控制View多久从模拟器或者真机上更新一次视图数据。
Zoom就是放大局部细节用的,细节显示在最右边的视图上。
Overlay比较有意思,主要用来测试在当前视图上加载新的图片后的效果,点击Load…选择图片后,可以控制在当前界面上显示的透明读,滑动0%~100%的控件即可。如果选择了Show in Loupe,右侧的放大视图也会将加载的图片的细节结合着透明度显示出来。不过目前这个Overlay做的比较简单,合成的图只能从界面的左下角为原点画出来,不能移动。

3、使用layoutopt,分析指定的布局,然后提出优化建议

layoutopt是android为我们提供的布局分析工具,要运行它,打开命令行进入sdk的tools目录,输入layoutopt加上你的布局目录命令行。运行后如图所示,框出的部分即为该工具分析布局后提出的建议,这里为建议替换标签
这里写图片描述
下面列出一些常会碰到的输出:

$ layoutopt samples/
samples/compound.xml
7:23 The root-level can be replaced with
11:21 This LinearLayout layout or its FrameLayout parent is useless
samples/simple.xml 提示未使用到该布局
7:7 The root-level can be replaced with
samples/too_deep.xml
-1:-1 This layout has too many nested layouts: 13 levels, it should have <= 10!
20:81 This LinearLayout layout or its LinearLayout parent is useless
24:79 This LinearLayout layout or its LinearLayout parent is useless
28:77 This LinearLayout layout or its LinearLayout parent is useless
32:75 This LinearLayout layout or its LinearLayout parent is useless
36:73 This LinearLayout layout or its LinearLayout parent is useless
40:71 This LinearLayout layout or its LinearLayout parent is useless
44:69 This LinearLayout layout or its LinearLayout parent is useless
48:67 This LinearLayout layout or its LinearLayout parent is useless
52:65 This LinearLayout layout or its LinearLayout parent is useless
56:63 This LinearLayout layout or its LinearLayout parent is useless
samples/too_many.xml
7:413 The root-level can be replaced with
-1:-1 This layout has too many views: 81 views, it should have <= 80!
samples/useless.xml 提示该布局中有太多的控件
7:19 The root-level can be replaced with
11:17 This LinearLayout layout or its FrameLayout parent is useless

4、使用HierarchyViewer碰到的一些问题

(1)hierarchyviewer unable to debug device
Android的官方文档上有说明:
To preserve security, Hierarchy Viewer can only connect to devices running a developer version of the Android system.
也就是说:Hierarchy Viewer只能连接Android开发版手机或是模拟器,只有ro.secure==0 && ro.debuggable==1的Android系统。
Hierarchy Viewer在连接手机时,手机会启动View Server与其进行socket通信。但在我们平常用的商业机上,是无法开启View Server的,Android源码实现这个限制的如下(目录:/frameworks/base/services/java/com/android/server/wm/WindowManageService.java):

public boolean startViewServer ( int port ) {    if ( isSystemSecure() ) {        return false ;    }    if ( !checkCallingPermission( Manifest.permission.DUMP, "startViewServer" ) ) {        return false ;    }}

如果要在自己的手机正常地使用Hierarchy Viewer,有三种方法:
a、直接刷一个开发版本的Android固件(一般只有在手机开发公司才可以)
b、如果只需要查看自己开发的应用的UI变化,可以用GitHub上的一个项目ViewServer
c、在Root的手机上开启ViewServer,使得HierachyViewer能够连接

5、layoutopt给出的建议

(1)Hardcoded string
出现警告的代码如下所示:

<Button        android:id="@+id/button1"        android:layout_width="118dp"         android:layout_height="wrap_content"        android:text="下一步" />"

虽然可以正常运行,但是这不是一个好习惯,应该在res/values/strings.xml中设置:

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="message">下一步</string></resources>

引用的时候使用
android:text=”@string/message”

0 0