[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中所说的布局

[Android 性能优化系列]降低你的界面布局层次结构的一部分

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

[Android 性能优化系列]降低你的界面布局层次结构的一部分

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


修正你的布局

从上面的布局信息中。我们能够发现,嵌套的线性布局减少了我们的布局效率。因此我们能够通过将布局扁平化来提升性能。

一个线性布局也能够制作成类似于上面的布局,因此,我们能够将布局转变为使用线性布局,这样一来布局就变成两层了。检查布局之后会发现他是这样子的

[Android 性能优化系列]降低你的界面布局层次结构的一部分

如今渲染一个 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 工具栏上的button来开闭他

[Android 性能优化系列]降低你的界面布局层次结构的一部分

当使用 Eclipse 的时候。Lint 能够自己主动修复一些问题,并提供一些建议,你还能够直接通过点击代码跳转到相应的布局文件里。

假设你没有使用 Eclipse 作为开发环境,那你也能够通过命令行使用Lint ,很多其它的帮助信息。你能够參看tools.android.com

你可能感兴趣的:(android)