1. 背景
新项目中存在一个业务(相册:图片网格列表+日期分组收缩/展开)。
在上线后发生了大量的OOM,友盟崩溃率达到6.72%。
(测试过6万张图片、上万个视频的场景。)
机型主要是低版本手机(5.0~6.0.1)
问题定位:内存抖动、内存溢出;
所以赶紧开始bugfix。
2. 前后数据说明:
友盟crash:6.72% -> 0.5%
内存峰值:400多MB -> 200多MB
3. 内存优化:
具体采用每个方案后的内存变化,之前没有进行详细的记录。SDK有升级,也做了其它优化,还原回去要改很多东西,所以就不列举出来了。
3.1 图像解码格式
效果:降低一半,内存峰值从400多MB降低到200多MB
Glide.with(...)
.load(...)
.format(DecodeFormat.PREFER_RGB_565)
.into(...)
3.2 使用缩略图
因为是3列的网格列表,图片不用太清晰。
Glide.with(...)
.load(...)
.format(...)
.thumbnail(0.01f)
.into(...)
3.3 详情页不进行内存缓存
详情页,用户用完即走,因此在进行打开时,不需要进行内存缓存
Glide的skipMemoryCache(true)
3.4 详情页不进行磁盘缓存
原因同3.4
diskCacheStrategy(DiskCacheStrategy.NONE)
3.5 牺牲内存提高加载速度
android:largeHeap="true"
这个并不能降低内存使用。
但是可以给应用获得更多的内存分配,防止内存溢出。
3.6 限制内存分配大小,但会变慢
android:hardwareAccelerated="false"
虽然内存从230多降低到180多,但业务用时会增加很多,因此没有采用。
后面对业务用时进行了优化,不过已经没有oom问题了,就没有补上。
速度快点更好。
3.7 及时回收Bitmap
// 修改前
BitmapFactory.decodeFile(file.toString(), options)
// 修改后
BitmapFactory.decodeFile(file.toString(), options)?.recycle()
3.8 减少资源文件访问
存在一个逻辑(如3.7),需要获取图片文件的一些信息。
修改了这个逻辑,将这个操作放到详情页打开的时候去获取。
或者尽量不调用。
4. 结语
本来想写很多的。
不过之前没怎么记录文档,现在代码回退也要改很多。
所以简单记录分享下。