这是一个普遍的误解,使用基本的布局结构是最高效率的布局。然而,每个你加入你的应用程序的组件和布局 都需要初始化,布局,和绘制。例如,使用嵌套的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可以作为这样布局的的根节点。所以,当这个设计转变成使用RelativeLay out,你能看见这个布局成为一个2级的结构。检查这个新的布局如下:
现在渲染一个列表项花费:
-
测量:0.598ms
-
布局:0.110ms
-
绘制:2.146ms
可能看起来是一个很小的提升,但是这个时间是成倍的,因为这个布局被用于在一个列表的每个选项。
由于在LinearLayout设计的时候使用了layout_weight属性,大多数时间是不同的,它能减慢测量的速度。这 仅仅是每个布局如何被合适的使用,和你应该考虑使用layout_weight是必要的的一个例子。
使用Lint
—————————— ——— ——— ——— ——— ——— ——— ——— ——— ——— —————————————————————————
运行Lint工具, 在你的布局文件中搜索可能的视图结构最佳化是好的方式。Lint已经替代了Layoutopt工具,并 且有更多更强大的功能。Lint规则的一些例子如下:
-
使用复合图片 — 一个包含一个ImageView和一个TextView的LinearLayout作为一个复合图片能被高效的 处 理。
-
合并根框架 — 如果一个FrameLayout是一个布局的根,没有提供背景或者填充等,它能被一个更高效的 m erge标记来替代。
-
无用的叶子 — 一个没有孩子或者没有背景的布局通常被移除(因为它是不可见的),为了一个更均匀的 和 更高效的布局结构。
-
无效的父母 — 一个布局有孩子,它没有兄弟,它不是一个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中。