首页 > 代码库 > [Android 性能优化系列]布局篇之减少你的界面层级

[Android 性能优化系列]布局篇之减少你的界面层级

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢

转载请标明出处(http://blog.csdn.net/kifile),再次感谢


原文地址:http://developer.android.com/training/improving-layouts/optimizing-layout.html

在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家

性能优化之布局篇:

[Android 性能优化系列]布局篇之通过<include>复用布局

题外话:

复杂的布局,既会提高我们的设计难度,也会降低我们的代码效率,因此,不放多使用一下相对布局什么的。


下面是本次的正文:

################

大家写布局文件的时候都会认为只要使用基本布局能够到达高效的结果,其实这是错的。你要知道你添加到你应用中的每一个控件和布局文件都需要经过初始化,排列位置和绘制三个过程。比如说,使用嵌套的线性布局可能导致你的布局层级变得十分冗余。此外,如果在嵌套的线性布局中使用了 layout_weight 参数的话,那么他的每一个子 view 都需要被重新测量两次。特别是当他们被用在 ListView 和 GridView 中时,他们会被反复的测量。

在本文中,你将学习到如何使用 Hierarchy Viewer 以及 Layoutopt 来检测和优化你的布局。

检查你的布局

在 Android SDK 里有一个叫做 HierarchyViewer 的工具,它可以帮助你在应用正在运行的时候分析你的布局。使用这个工具,能够帮助你发现布局性能方面的瓶颈。

HierarchyViewer 可以让你从当前连接到电脑上的设备或者模拟器上选择一个进程,然后展示他的布局树。并且他能够将每个控件在measure,layout 和 draw 的时候所花费的时间都显示出来,从而帮助你发现问题

举例说,图1展示了一个用作 ListView item 的布局,这个布局的左侧是一张图片,右侧是两层文本,你应该清楚在 ListView 中这个布局将被多次初始化


Hierarchyviewer工具存放的位置在<sdk>/tools 下,当它被打开以后,在 HierarchyViewer 会显示一个当前设备列表,以及所有正在运行的组件。点击Load View Hierarchy 可以查看选中组件的布局层级。比如说,图2就显示了图1中所说的布局


在图2中,你可以看见这里有三层布局,点击每一个元素,会和图3一样显示他显示到界面过程中每一步所消耗的时间。这使得我们能够清楚的了解在测量,布局以及渲染阶段你所花费的时间,你也会清楚,你应该从哪儿下手去优化他。


上图中显示的时间是,测量0.977ms ,布局 0.167ms,绘制2.717ms


修正你的布局

从上面的布局信息中,我们可以发现,嵌套的线性布局降低了我们的布局效率,因此我们可以通过将布局扁平化来提升性能。一个线性布局也可以制作成类似于上面的布局,因此,我们可以将布局转变为使用线性布局,这样一来布局就变成两层了,检查布局之后会发现他是这样子的


现在渲染一个 item 所花费的时间为 测量0.598ms,布局0.110ms,绘制2.146ms

或许看起来这个没有多大提升,但是你要知道这个 Item会在 listView 中被多次使用,反复绘制.

其实大多数绘制时间差异是因为我们在线性布局中使用了 layout_weight,他会降低对布局的测量速度,当然这只是你应该谨慎使用布局权重的原因之一。


使用 Lint

通常你可以在你的布局文件中通过使用 Lint 来查找可能的布局优化。Lint 现在已经代替了 Layoutopt,而且更有效率,下面是 Lint 的一些规则

1.尽量使用复合图片,一个线性布局中如果包含一个 ImageView 和一个 TextView,那么你可以使用复合图片来替换

2.去掉不需要的根节点,如果一个 FrameLayout 是整个布局的根节点,并且他没有提供背景,留白之类的东西,那么我们可以使用 merge 标签来让他变得更有效

3.减少布局中的枝叶,如果一个布局没有子 View 或者背景,那么他可以被移除掉(况且他本身就是不可见的)来让布局更有效

4.减少父母层级,如果一个布局没有兄弟,并且他不是 ScrollView 或者根 View,并且也没有背景,那么他就可以直接被移除掉,他的孩子可以直接被移到他父母的层级下

5.避免过深的布局层级,多次嵌套的布局文件不利于性能。你可以考虑通过相对布局或者网格布局来提升性能,默认的最深布局深度是10。

Lint 工具目前已经被合并到了 Android 开发工具里了,他能够在你对项目代码做出更改之后自动运行。你可以通过 Eclipse 工具栏上的按钮来开闭他


当使用 Eclipse 的时候,Lint 能够自动修复一些问题,并提供一些建议,你还可以直接通过点击代码跳转到对应的布局文件中。如果你没有使用 Eclipse 作为开发环境,那你也可以通过命令行使用Lint ,更多的帮助信息,你可以参看tools.android.com

[Android 性能优化系列]布局篇之减少你的界面层级