这是一个普遍的误解,使用基本的布局结构是最高效率的布局。然而,每个你加入你的应用程序的组件和布局都需要初始化,布局,和绘制。例如,使用嵌套的LinearLayout实例能导致一个过深的视图结构。而且,嵌入几个使用laytou_wight参数的LinearLyaout实例,由于每个孩子需要被测量两次导致特别昂贵的开销。当布局是一个反复的填充的时候,这个特别重要,例如当被使用在一个ListView或者GridView中时。
在这个课程当中,你将会学习使用Hierarchyt Viewer和Layotopt来检查和优化你的布局。
检查你的布局
——————————————————————————————————————————————————————————————
Android SDK工具包含了一个被称为Hierarchy Viewer的工具,它允许你在你的应用程序运行的时候分析你的布局。使用这个工具帮助你发现在你的布局性能里面的瓶颈。
Hierachy Viewer允许你选择在一个连接的设备或者模拟器运行进程,然后显示这个布局树。在每个模块的交通灯代表了它的测量值,布局和绘制性能,帮助你确定潜在的问题。
例如,Figure 1显示了一个布局,它被用做在一个ListView中的现象。这个布局在左边显示了一个小的位图,和在右边堆放了两个文本项。它是尤其的重要由于这个布局将会被填充到多个选项—如这个—被优化性能执行效率将会成倍增加。
这个hierarchyviewer工具在<sdk>/tools/目录下提供,当被打开的时候,这个Hierarchy Viewer显示了一列有效设备和它正在运行的组件。点击Load View Hierarchy来查看这个被选择组件的布局结构。例如,Figure 2显示了Figure 1中列表项的布局。
在Figure 2中,你能看见一个有一些问题的显示文本的三级结构。点击这个选项,显示过程每个阶段使用的时间(Figure 3)。这样哪个选项花费最长时间的测量,布局,和渲染,和哪里你应该花费时间来优化,就变得清晰了。
使用这个布局渲染整个列表项使用的时间是:
测量:0.977ms
布局:0.167ms
绘制:2.717ms
修正你的布局
——————————————————————————————————————————————————————————————
因为嵌入的LinearLayout使这个布局性能过于缓慢,这个性能可能通过压扁这个布局来改善—使这个布局扁且宽,而不是窄且深。RelativeLayout可以作为这样布局的的根节点。所以,当这个设计转变成使用RelativeLayout,你能看见这个布局成为一个2级的结构。检查这个新的布局如下:
现在渲染一个列表项花费:
测量:0.598ms
布局:0.110ms
绘制:2.146ms
可能看起来是一个很小的提升,但是这个时间是成倍的,因为这个布局被用于在一个列表的每个选项。
由于在LinearLayout设计的时候使用了layout_weight属性,大多数时间是不同的,它能减慢测量的速度。这仅仅是每个布局如何被合适的使用,和你应该考虑使用layout_weight是必要的的一个例子。
使用Lint
——————————————————————————————————————————————————————————————
运行Lint工具,在你的布局文件中搜索可能的视图结构最佳化是好的方式。Lint已经替代了Layoutopt工具,并且有更多更强大的功能。Lint规则的一些例子如下:
使用复合图片 — 一个包含一个ImageView和一个TextView的LinearLayout作为一个复合图片能被高效的处理。
合并根框架 — 如果一个FrameLayout是一个布局的根,没有提供背景或者填充等,它能被一个更高效的merge标记来替代。
无用的叶子 — 一个没有孩子或者没有背景的布局通常被移除(因为它是不可见的),为了一个更均匀的和更高效的布局结构。
无效的父母 — 一个布局有孩子,它没有兄弟,它不是一个ScrollView或者一个根布局,并且没有一个背景,可以被移除,并且它的孩子直接放入这个父母中,为了一个均匀且高效的布局结构。
深布局 — 拥有过多嵌套不利于性能的布局。 考虑使用均匀的布局,如RelativeLayout或者Gridlayout来提升性能。这个默认的最大深度为10。
Lint的其它的好处是它被整合到Eclipse的Android Development Tools(ADT 16+)。每当你输出一个APK的时候Lint自动运行,编辑和保存一个XML文件,或者使用这个布局编辑器。为了手动打开Lint,点击在Eclipse工具栏的Lint按钮。
当在Eclipse中被使用的时候,Lint有自动固定一些问题的能力,为别人提供建议和直接跳到出错的代码检查。如果你没有使用Eclipse开发,Lint也能通过命令行运行。更多关于Lint的信息可以在tools.android.com中。