背景介绍
最近负责的Gallery模块测试时频繁报出使用一段时间后就发生Crash,通过Log查看发现是OOM引发,本篇文档记录解决该问题的分析过程。
Log分析
该OOM问题测试没有找到复现步骤,只是报出使用一段时间就会发生OOM这个非常宽泛的现象,没有复现步骤,没有确定时间节点。查看Log每次发生OOM的代码调用栈也不尽相同。贴出出现OOM的几段Log。
通过上面的几段Log,看出都是在申请一个较大的内存空间时,系统memory空间不够了,导致发生了OOM,这里都是在对图片进行操作,因此申请了较大的内存空间。
至此有一个大概的查找方向:问题出现的时机是在Gallery创建大的Bitmap对象,了解过Gallery业务流程很容易就会怀疑这个过程多半发生在PhotoPage界面,也就是浏览大图界面,但深入了解发现Gallery已经对这块进行了处理,并不是大图有多大,就一次性创建多大的Bitmap对象,而是将一个大图分成多个区域加载进来,具体可以查看Gallery代码中LocalImage类中的requestLargeImage方法,它利用的是BitmapRegionDecoder技巧,分块多次加载大图,这里不赘述。在排查Log发现问题发生在refocus操作几率大,测试也印证了该点。这里refocus是MTK平台针对Gallery做的一个新功能,它能对景深图片进行重聚焦/调整图片光圈值。排查重点放在refocus操作上。