0%

Android开发:提高布局性能-优化布局层次

翻自:http://developer.android.com/training/improving-layouts/optimizing-layout.html 使用基本布局构建产生最高效的布局,是一个常见的错误想法。然而,每个你加到应用里的控件和布局都需要初始化,排列,绘画。比如,使用嵌套的LinearLayout会导致层次很深。此外,嵌套多个LinearLayout,使用layout_weight,因为每个child都需要测量两次而代价昂贵。这在layout被反复inflate时特别重要,像在ListView或GridView里使用时. 本节,你会学习到如何用Hierarchy Viewer和Layoutopt检验并优化布局。

检视你的布局

Android SDK工具里包含了一个叫Hierarchy Viewer的工具,它能在应用运行时分析布局。使用这个工具可以帮助你发现布局性能的瓶颈。 Hierarchy Viewer通过让你选择一个在连接的设备或模拟器上的进程来工作,然后显示布局树。每一个块上的红绿灯展示了测量,布局,绘画的性能,帮你鉴别潜在问题。 如,下图显示了一个ListView里的item的布局。这个布局在左边显示了一个小图片,右边两个堆放的text.这里特别重要,因为布局会被多次inflate,优化了一个,就会得到多倍的性能提升。
Layout listitem
图1
Hierarchy Viewer在/tools/下(可以从DDMS里启动,要求连接的设备已经root,否则看不到层次图),打开后,Hierarchy Viewer列出当前当前运行的可用设备。点击Load View Hierarchy可以查看选择组件的布局层次。如图2,展示了图1说的list item.
Hierarchy linearlayout
图2
Hierarchy layouttimes
图3
图2里,你可以看到三层布局会有些问题。在item上点击,会显示每个阶段处理时间(图3)。可以很清楚地看到这个item花了多少时间测量,布局,绘画,你该在哪里花时间去优化。 使用这个布局表现一个完整的list item,花费的时间: 测量: 0.977ms 布局: 0.167ms 绘画: 2.717ms

修正你的布局

因为上面的嵌套LinearLayout影响了性能,可以通过RelativeLayout减少层次来提高性能。
Hierarchy relativelayout
使用RelativeLayout修改后,只有两层。 修改后花费的时间: 测量: 0.598ms 布局: 0.110ms 绘画: 2.146ms 可以看到有一些小提升,但list里有多个item,所以优化减少的时候会是加N倍的。 由于使用LinearLayout的layout_weight,大多数时间是不一样的,这会降低测量的速度。这只是一个如何合理使用Layout的案例,必要的时候,你要小心考虑是否用layout weight

使用Lint

在布局文件上开启Lint工具扫描可以优化的地方是个很好的实践。Lint替换了Layoutopt工具,并且功能更强。一些Lint规则如下:

  • 使用compound drawables–包含ImageView和TextView的LinearLayout可以使用compound drawable实现,这样更高效。
  • 合并根Frame–如果FrameLayout是布局的根节点,并且不提供背景,padding等,可以用merge标签替换,略微高效
  • 无用的叶子–一个无背景,无下级元素的layout,通常可以删除(因为不可见)
  • 无用的父级–只有一个子元素的layout,如果不是ScrollView或根节点,并且没有背景,可以直接删除,把子元素移到外面一层
  • 深层布局–太多嵌套带来低性能,考虑使用更平级(层次少)的布局,像RelativeLayout或GridLayout来提高性能。最多不能超过10层

注:compound drawables指设置TextView的android:drawableLeft等 Lint的另一个好处是整合进了Eclipse的插件ADT里,当你导出apk,使用Layout Editor编辑保存xml文件时时,lint会自动运行。需要手动强制运行lint,可以按eclipse工具栏里的按钮:
Lint icon 在eclipse里使用时,lint有自动修复一些问题的能力,为其他问题提供建议,直接跳到问题代码处。如果你不用eclipse,lint也可以在命令行运行。更多关于lint的信息,访问 tools.android.com