(二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258)

Android性能优化系列---Improving Layout Performance(一)


Layouts是Android应用里直接影响用户体验的一个关键部分。如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢。Android SDK提供了工具帮助你分析你的Layouts的性能问题。结合这个工具同时查看本文,你能实现滑动流畅、占用内存最小的用户界面。

Use the <merge> Tag

某些时候,自定义可重用的布局包含了过多的层级标签,比如我们需要在LinearLayout里面嵌入一个重用的组件,而恰恰这个自定义的可重用的组件根节点也是LinearLayout,这样就多了一层没有用的嵌套,无疑这样只会拖慢程序速度。而这个时候如果我们使用merge根标签就可以避免那样的问题。例如:

 <merge xmlns:android="http://schemas.android.com/apk/res/android">
             <Button
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/add"/>
             <Button
                   android:layout_width="fill_parent"
                   android:layout_height="wrap_content"
                   android:text="@string/delete"/>
       </merge>  

这样的话,使用<include>包含上面的布局的时候,系统会自动忽略merge层级,而把两个button直接放置与include平级

 Optimizing Layout Hierarchies

一个复杂的web页面可能需要很长的时间才能加载出来,同样的,你的Layout层次如果太复杂也可能引起性能问题。在这课里你讲看到通过SDK工具怎么样发现你的Layout的问题和性能瓶颈

Re-using Layouts with <include/>

如果你的应用UI在许多地方都存在重复的Layout结构。这课将告诉你如何产生有效的可复用的Layout,然后在合适的UI布局里include入它们。

Loading Views On Demand

除了简单地在一个Layout里include另一个布局组件外,有时候,你也可以在Activity启动起来后,仅仅当该layout 组件需要时才让其可见。这将告诉你怎么按需加载你的Layout的部分而提高的Layout的初始化能。

Making ListView Scrolling Smooth

如果你的app里需要一个ListVIew实例,而该ListView里的每一个Item拥有复杂的或者重量级的data,ListView的滑动性能可能是一个问题。这课也将给你一些优化页面滚动性能的建议。

Optimizing Layout Hierarchies

通常有个错误的概率:使用最基本的布局结构能产生最有效的Layouts。然而,每一个加到你application里的Widget和Layout都需要初始化、布局和绘制。例如:使用嵌套的LinearLayout能导致非常深的视图层次。更进一步的,嵌套若干个使用layout_weight参数的LinearLayout将极大影响性能,因为每个子视图需要测量大小两次。当布局被重复渲染的时候这是特别重要的。例如当使用ListView和GridView时。

本文你讲学到使用Hierarchy Viewer 和 Layoutopt工具检测和优化你的Layout

Inspect Your Layout

Android SDK工具集里有个名叫Hierarchy Viewer的工具。该工具能分析你的App运行时的Layout。用该工具你能发现你的Layout性能的瓶颈。

选择你的手机或者模拟器里运行的某个进程,然后通过该工具展示布局树。在每一个布局块里,信号灯代表了它的测量、布局和绘制的性能,帮助你分析潜在的问题。

例如,图一表明了一个ListView里的一个Item的布局。这个布局的左边展示一个简单的bitmap image,右边是两个TextView。像这个布局文件,可能被渲染多次。因此,优化布局性能就显得尤为重要。


 图一:Conceptual layout for an item in a ListView.

HierarchyViewer工具在<sdk>/tools/目录下。打开该工具,会显示有效设备列表和某个设备正在运行的组件。点击“Load View Hierarchy”查看这被选中的app的布局层次。

例如,图2,显示了上图一的布局。


 Figure 2. Layout hierarchy for the layout in figure 1, using nested instances ofLinearLayout.


 Figure 3. Clicking a hierarchy node shows its performance times.

在图2,你能看到这个布局有3级层次结构。点击图2里的某个条目会告诉你每个阶段(测量、布局和绘制)处理所耗费的时间(见图3)。哪个条目花费了最多的测量、布局和绘制时间将变的一目了然。你也知道了在哪花时间优化。

渲染出该布局list里一个完整的item所需时间为:

Measure:0.977ms

Layout:0.167ms

Draw:2.717ms

修正你的布局

因为上面的布局性能较慢归因与嵌套的LinearLayout,那么,我们可以是Layout变的宽而浅,而不是窄而深来优化布局。上面的布局我们可以使用RelativeLayout来替代LinearLayout。这样,该布局层次就变成了2级通过HierarchyViewer查看,你发现这新的布局变成了:


 Figure 4. Layout hierarchy for the layout in figure 1, using RelativeLayout.

现在展现一个item花费:

Measure:0.598ms

Layout:0.110ms

Draw:2.146ms

看上去可能只有那么一点点改善。但是在一个list里有多个Item,这些节省的时间累积起来效果就较明显了。大多数情况下,布局渲染时间差别较大的原因是在LinaerLayout里使用了layout_weight.这将会增加Measure的时间。这仅仅是一个合理的使用和优化Layout的例子,你应该仔细的考虑是否有必要使用layout weight。

Use Lint

使用Lint工具可以查看你的view 层级哪些地方可以优化。Lint已取代了Layoutopt 工具,它比Layoutopt提供了更多的功能。Lint使用的例子如下:

1.使用compound drawables - 一个包含了ImageView与TextView的LinearLayout可以被当作一个compound drawable来处理

2.使用merge根框架 - 如果FramLayout仅仅是一个纯粹的(没有设置背景,间距等)布局根元素,我们可以使用merge标签来当作根标签

3.无用的分支 - 如果一个layout并没有任何子组件,那么可以被移除,这样可以提高效率

4.无用的父控件 - 如果一个layout只有子控件,没有兄弟控件,并且不是一个ScrollView或者根节点,而且没有设置背景,那么我们可以移除这个父控件,直接把子控件提升为父控件

5.深层次的layout - 尽量减少内嵌的层级,考虑使用更多平级的组件 RelativeLayout or GridLayout来提升布局性能,默认最大的深度是10

Lint被集成进 Android Development Tools for Eclipse (ADT 16+)。Eclipse会自动运行Lint的工具,并给出相应的提醒,不管是在导出APK,编辑,保存XML还是在使用layout编辑器的时候。如果想强制运行,请参看上面的图标,点击运行。

如果没有eclipse开发环境,也可以在命令行中执行。

时间: 2024-10-17 18:05:42

(二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258)的相关文章

(三)Android性能优化系列---Improving Layout Performance(二)转载自:http://xhmj12.iteye.com/blog/2064342

Loading Views On Demand 有时你的布局可能需要一些复杂却又很少被用到的视图.无论他们是item详情.进度指示器,或撤销的消息,你都可以在需要时加载这些视图,来减少内存使用量并加快渲染速度. Define a ViewStub ViewStub是一个没有尺寸大小并且不会在布局中嵌套或渲染任何东西的轻量级的视图.因此在视图层次展现或隐藏它的代价非常小.每一个ViewStub仅仅需要包含android:layout属性来展现指定的布局. 以下ViewStub是一个半透明的进度条.

Android性能优化系列之apk瘦身

Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好,包最小的),所以apk的瘦身优化也很重要,本篇博客将讲述apk瘦身的相关内容. 包体分析 在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包 可以看到占用空间的主要是代码.图

[Android 性能优化系列]内存之终极篇--降低你的内存消耗

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/articles/memory.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 建议大家在看本文之前先去我的博客看看 [Android 性能优化系列]内存之基础篇--Andr

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

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/improving-layouts/optimizing-layout.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 性能优化之布局篇: [Android 性能优化系列]布

[Android 性能优化系列]布局篇之通过&lt;include&gt;复用布局

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/improving-layouts/reusing-layouts.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 性能优化布局篇: [Android 性能优化系列]布局篇之

Android性能优化系列之App启动优化

Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问题,本篇博客就将介绍App启动优化的相关知识. 应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时.后台没有该应用的进程.这时系统会又一次创建一个新的进程分配给该应用.这个启动方式就是冷启动. 冷启动由于系统会又一次创建一个新的进程分配给它.所以会先创建和初始化A

[Android 性能优化系列]布局篇之动态加载布局

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/improving-layouts/loading-ondemand.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 性能优化布局篇: [Android 性能优化系列]布局篇

[Android 性能优化系列]内存之基础篇--Android怎样管理内存

大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/articles/memory.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 以下是本次的正文: ################ 随机訪问存储器(Ram) 无论在哪种软件

Android性能优化系列---管理你的app内存

 文章出处:http://developer.android.com/training/articles/memory.html#YourApp Random-access memory(RAM)在任何软件开发环境都是稀有资源,在移动操作系统物理内存有限的情况下将显得更加珍贵.虽然Android的Dalvik虚拟机优化了内存回收机制,但我们也要关注你的app的内存分配合和释放 为了垃圾回收器能回收你系统的内存,你应该避免引起内存泄露(通常由全局成员hold了对象引用),而且要在合适的时间点(如生