(二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258) - 小菜美妞成长中

标签: android 性能优化 系列 | 发表时间:2014-12-11 18:26 | 作者:小菜美妞成长中
出处:

        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 of LinearLayout.


  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开发环境,也可以在命令行中执行。


本文链接: (二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258),转载请注明。

相关 [android 性能优化 系列] 推荐:

Android 性能优化

- - CSDN博客综合推荐文章
如果应用程序需要使用Service来执行后台任务的话,只有当任务正在执行的时候才应该让Service运行起来. 当启动一个Service时,系统会倾向于将这个Service所依赖的进程进行保留,系统可以在LRUcache当中缓存的进程数量也会减少,导致切换程序的时候耗费更多性能. 我们可以使用IntentService,当后台任务执行结束后会自动停止,避免了Service的内存泄漏.

Android性能优化典范

- - 移动开发 - ITeye博客
2015新年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App. 课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议. 主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.

(二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258) - 小菜美妞成长中

- - 博客园_首页
Android性能优化系列---Improving Layout Performance(一).         Layouts是Android应用里直接影响用户体验的一个关键部分. 如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢. Android SDK提供了工具帮助你分析你的Layouts的性能问题.

Android性能优化-线程性能优化

- - CSDN博客推荐文章
熟练使用Android上的线程可以帮助你提高应用程序的性能. 本篇文章讨论了使用线程的几个方面:使用UI或主线程; 应用程序生命周期和线程优先级之间的关系; 以及平台提供的帮助管理线程复杂性的方法. 在每一部分,本篇都描述了潜在的陷阱以及如何避免它们的策略. 当用户启动你的应用程序时,Android会创建一个新的  Linux process 以及一个执行线程.

系统性能优化系列

- - IT瘾-tuicool
之前组内一位大佬分享了一些关于系统性能优化方面的干货,这里我将它整理成文并且加入自己平时常用的一些工具和技巧. 由于关于系统性能优化涉及的内容非常多,我会分几篇文章来分享. 这次分享下 定位系统层面问题的常用方法. Throughout 吞吐量 (系统每秒钟可以处理的请求数). Latency 延迟 (系统处理一个请求的延迟).

Android开发性能优化简介

- - CSDN博客推荐文章
       随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序. 以上理由,足以需要开发人员更加专心去实现和优化你的代码了. 选择合适的算法和数据结构永远是开发人员最先应该考虑的事情.

Android性能优化之渲染篇

- - 移动开发 - ITeye博客
关注微信号:javalearns   随时随地学Java. Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化性能,这些课程是Google之前在Youtube上发布的Android性能优化典范专题课程的细化与补充. 下面是渲染篇章的学习笔记,部分内容和前面的性能优化典范有重合,欢迎大家一起学习交流.

Google《Android性能优化》学习笔记

- - 外刊IT评论
现在有不少App为了达到很华丽的视觉效果,会需要在界面上层叠很多的视图组件,但是这会很容易引起性能问题. 如何平衡Design与Performance就很需要智慧了. 大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有办法把这一帧的任务执行完毕,就会发生丢帧的现象. 丢帧越多,用户感受到的卡顿情况就越严重.

Android性能优化之内存泄漏

- - CSDN博客推荐文章
  内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存. 那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么以来便出现了内存泄漏的情况. 在应用中内出现一次两次的内存泄漏获取不会出现什么影响,但是在应用长时间使用以后,若是存在大量的Activity无法被GC回收的话,最终会导致OOM的出现.

android性能优化实战理论篇

- - CSDN博客推荐文章
本文地址:http://blog.csdn.net/iamws/article/details/51636175.          通过之前前篇介绍的工具,我们知道了应该怎么样去获取要分析的数据,但是也仅仅局限在于怎么样获取数据,而没有深入数据分析,这一篇主要讲解的是UI刷新这块部分android理论知识,有了这些知识后,对于上面的数据该怎么分析,你就胸有成竹了.