关于性能优化的一些总结:
写在前面的话:
Android Studio提供的Android Lint是一款静态分析工具,它负责对项目源代码加以分析。它能够检测出应用程序中的潜在漏洞以及其它可能被编译器所忽略的其它代码问题。
建议养成重复使用Android Studio Lint工具的好习惯。
使用方法:
Android Studio的“Analyze”菜单 —->“Inspect Code…” —–>确定即可开始分析
View绘制、渲染优化
渲染操作通常依赖于两个核心组件:CPU与GPU。CPU负责包括Measure,Layout,Record,Execute的计算操作,GPU负责Rasterization(栅格化)操作。CPU负责把UI组件计算成Polygons,Texture纹理,然后交给GPU进行栅格化渲染。为了能够使得App流畅,我们需要在每帧16ms以内处理完所有的CPU与GPU的计算,绘制,渲染等等操作。
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次。这样就会浪费大量的CPU以及GPU资源。为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。
我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,观察UI上的Overdraw情况。蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。
对于那些过于复杂的自定义的View(通常重写了onDraw方法),但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。这个API可以很好的帮助那些有多组重叠组件的自定义View来控制显示的区域。
除了clipRect方法之外,我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。
以上内容学习自:http://hukai.me/android-performance-render/
一些总结:
尽量减少布局的嵌套层次。如果能用RelativeLayout实现的布局,就尽量不用LinearLayout去做,因为LinearLayout一般会嵌套更多的层次。
在可以使用merge的情况下,用merge去合并布局,这样可以减少布局嵌套的层次。
在适宜的情况下使用ViewStub,ViewStub类似一种延迟加载技术,程序初始化的时候只有ViewStub会被初始化,而不会去加载它上面的布局,这样可以提高初始化速度(这和单纯地把View设置为View.GONE或View.VISIBLE是有本质区别的)。程序启动以后,在用到它时,可以通过ViewStub.inflate()方法将相应布局加载到内存,渲染到画面。
多去用导入共通的代码是个好习惯。include类似于C语言中的#include(它是一个预编译指令,在程序编译成二进制文件之前,会把#include的内容拷贝到#include的位置)。
代码优化
一些总结:
默认情况下遍历集合使用增强型for循环效率最好,而遍历ArrayList时就还是使用传统的循环效率好。
使用SparseArray和ArrayMap代替HashMap(参考文章:Android内存优化(使用SparseArray和ArrayMap代替HashMap))