(转载)性能优化之布局优化


来源:http://www.trinea.cn/android/layout-performance/html

本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge)、去除没必要要的嵌套和View节点、减小没必要要的infalte及其余Layout方面可调优势,顺带说起布局调优相关工具(hierarchy viewer和lint)java

 

性能优化专题已完成五部分:android

性能优化总纲——性能问题及性能调优方式
性能优化第三篇——Java(Android)代码优化
性能优化第二篇——布局优化
性能优化第一篇——数据库性能优化数据库

性能优化实例 缓存

 

一、抽象布局标签 安全

(1) <include>标签
include标签经常使用于将布局中的公共部分提取出来供其余layout共用,以实现布局模块化,这在布局编写方便提供了大大的便利。
下面以在一个布局main.xml中用include引入另外一个布局foot.xml为例。main.mxl代码以下:性能优化

 

(2) <viewstub>标签
viewstub标签同include标签同样能够用来引入一个外部布局,不一样的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
viewstub经常使用来引入那些默认不会显示,只在特殊状况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。
下面以在一个布局main.xml中加入网络错误时的提示页面network_error.xml为例。main.mxl代码以下:ide

在java中经过(ViewStub)findViewById(id)找到ViewStub,经过stub.inflate()展开ViewStub,而后获得子View,以下:

在上面showNetError()中展开了ViewStub,同时咱们对networkErrorView进行了保存,这样下次不用继续inflate。这就是后面第三部分提到的减小没必要要的infalte。

viewstub标签大部分属性同include标签相似。

 上面展开ViewStub部分代码

 

(3) <merge>标签
在使用了include后可能致使布局嵌套过多,多余没必要要的layout节点,从而致使解析变慢,没必要要的节点和嵌套可经过hierarchy viewer(下面布局调优工具中有具体介绍)或设置->开发者选项->显示布局边界查看。

 

merge标签可用于两种典型状况:
a.  布局顶结点是FrameLayout且不须要设置background或padding等属性,能够用merge代替,由于Activity内容试图的parent view就是个FrameLayout,因此能够用merge消除只剩一个。
b.  某布局做为子布局被其余布局include时,使用merge看成该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点所有合并到主布局中。

以(1) <include>标签的示例为例,用hierarchy viewer查看main.xml布局以下图:

android include
能够发现多了一层不必的RelativeLayout,将foot.xml中RelativeLayout改成merge,以下:

运行后再次用hierarchy viewer查看main.xml布局以下图:

android include2

这样就不会有多余的RelativeLayout节点了。

 

二、去除没必要要的嵌套和View节点
(1) 首次不须要使用的节点设置为GONE或使用viewstub
(2) 使用RelativeLayout代替LinearLayout
大约在Android4.0以前,新建工程的默认main.xml中顶节点是LinearLayout,而在以后已经改成RelativeLayout,由于RelativeLayout性能更优,且能够简单实现LinearLayout嵌套才能实现的布局。
4.0及以上Android版本可经过设置->开发者选项->显示布局边界打开页面布局显示,看看是否有没必要要的节点和嵌套。4.0如下版本可经过hierarchy viewer查看。

 

三、减小没必要要的infalte
(1) 对于inflate的布局能够直接缓存,用所有变量代替局部变量,避免下次需再次inflate
如上面ViewStub示例中的

 

(2) ListView提供了item缓存,adapter getView的标准写法,以下:

关于ListView缓存原理可见Android ListView缓存机制

 

四、其余点
(1) 用SurfaceView或TextureView代替普通View
SurfaceView或TextureView能够经过将绘图操做移动到另外一个单独线程上提升性能。
普通View的绘制过程都是在主线程(UI线程)中完成,若是某些绘图操做影响性能就很差优化了,这时咱们能够考虑使用SurfaceView和TextureView,他们的绘图操做发生在UI线程以外的另外一个线程上。
由于SurfaceView在常规视图系统以外,因此没法像常规试图同样移动、缩放或旋转一个SurfaceView。TextureView是Android4.0引入的,除了与SurfaceView同样在单独线程绘制外,还能够像常规视图同样被改变。

 

(2) 使用RenderJavascript
RenderScript是Adnroid3.0引进的用来在Android上写高性能代码的一种语言,语法给予C语言的C99标准,他的结构是独立的,因此不须要为不一样的CPU或者GPU定制代码代码。

 

(3) 使用OpenGL绘图
Android支持使用OpenGL API的高性能绘图,这是Android可用的最高级的绘图机制,在游戏类对性能要求较高的应用中获得普遍使用。
Android 4.3最大的改变,就是支持OpenGL ES 3.0。相比2.0,3.0有更多的缓冲区对象、增长了新的着色语言、增长多纹理支持等等,将为Android游戏带来更出色的视觉体验。

 

(4) 尽可能为全部分辨率建立资源

减小没必要要的硬件缩放,这会下降UI的绘制速度,可借助Android asset studio

 

五、布局调优工具
(1) hierarchy viewer
hierarchy viewer能够方便的查看Activity的布局,各个View的属性、measure、layout、draw的时间,若是耗时较多会用红色标记,不然显示绿色。
hierarchy viewer.bat位于<sdk>/tools/目录下。使用可见:Using Hierarchy Viewer , 示例图以下:

android hierarechy viewer

 标注: hierarchy viewer目前在发布的商业版上处于安全考虑已经不可用:

To preserve security, Hierarchy Viewer can only connect to devices running a developer version of the Android system

  可参考http://lxfgrace.iteye.com/blog/1821869方案,just try

 

(2) layoutopt
layoutopt是一个能够提供layout及其层级优化提示的命令行,在sdk16之后已经被lint取代,在Windows->Show View->Other->Android->Lint Warnings查看lint优化提示,lint具体介绍可见Improving Your Code with lint

 

来源:http://www.trinea.cn/android/layout-performance/

相关文章
相关标签/搜索