从自己看到的各种blog和资料中,关于Android的性能优化总结了一下,Android的性能优化主要从两部分来做:
1:渲染优化
2:内存优化
渲染优化部分:
首先理解一点相关的内容:
Android系统每隔16ms要求当前页面重新绘制一次。因为这样才能达到60fps,用户不会感觉到画面卡顿。
那么我们要尽可能使我们的绘制时间在16ms以内。
如果你想深入一下,可以看一下这个系列:https://juejin.im/entry/58aa61d7b123db00671b4cb4。
这里只是简单说一下常用的优化方式
1:优化方式有选择合适的布局,避免多层布局嵌套。
比如在复杂页面的时候,我们使用RelativeLayout作为根布局,多写一点属性设置;而不是用多个LinearLayout嵌套
比如使用约束布局。
比如对<include>的使用来复用layout;使用<ViewStub>来延迟加载;使用<merge>来减少布局层次:
<include>我们经常用就不介绍了。
<ViweStub>的使用请看https://www.jianshu.com/p/175096cd89ac
注意点:
1:指定layout,初始不会加载,调用inflate或者setVisiable为Visiable的时候加载,inflate方法会返回一个View,这个view就是替代了viewstub的View
2:加载后这个viewstub被指定的layout替换掉,这时候viewstub被移除,所以直接使用viewstub.setvisiable(GONE)是无效的
<merge>的使用请看:http://blog.csdn.net/a740169405/article/details/50473909
配合include使用
如果include的layout是以普通viewGroup作为根标签的话,那么include之后,布局树中是存在这个viewGroup的;
如果merge作为根标签的话,那么include之后,布局树中是没有merge这层的,直接接的内部的view
merge不是ViewGroup,在xml文件中对它设置的属性都是无效的
注意,我们在merge为根的xml文件中,可以直接用到include所在的ViewGroup的属性,比如RelayiveLayout。
<merge>作为根标签的layout
<include>指定layout为<merge>的layout
2:尽可能避免过度绘制
过度绘制指在一个像素点上绘制了多次。比如根布局有背景色,内部ListView有背景色,它的Item还有自己的背景色。这就属于过度绘制。
这个可以使用手机的开发者工具中自带的过度绘制调试来查看过度绘制的区域。
打开这个功能后,打开app会发现有各种颜色的区域,有白蓝绿红四种。尽量使其是白色或者蓝色,接受绿色。而红色不可避免的时候,使其范围小于屏幕的1/4
这一部分需要我们自己去处理了
3:使用canvas.clipRect来指定绘制区域
简单描述就是使用canvas.clipRect在canvas上指定一块区域,这样在绘制的时候只会对这片区域进行绘制。也就是减少了绘制范围来达到减少绘制时间的效果
https://www.jianshu.com/p/cc893397dc9f
内存优化
内存优化部分主要针对内存泄漏和Bitmap
Android studio 3.0可以使用Android profliter来查找造成内存泄漏的对象。使用方式可以参考这位大神写的
https://blog.csdn.net/double2hao/article/details/78784758
关于Bitmap的优化:
其实常用的也就是Bitmap缩放避免OOM;设置缓存大小,使不过分占用资源。
比如:
1:我们在使用完Bitmap后要记得释放资源
2:选择合适的解码方式,比如:ARGB888是32位的,而RGB565是16位的,那么当我们不需要透明度的时候,可以考虑使用RGB565
3:设置缓存大小。我们可以通过LruCache或者Glide来设置图片缓存的大小。这样图片不会占用过多的内存资源