Android API 25及以下设备App报内存越界异常,如何优化大图展示?
大图加载OOM问题优化方案
API 25及更低版本出现OOM而高版本正常的核心原因是:Android 8.0(API 26)开始Bitmap的像素内存调整为Native堆分配,Java堆内存压力大幅降低,而API 25及以下版本Bitmap像素内存全部占用Java堆配额,很容易触达上限崩溃。以下是不需要手动调整所有图片尺寸、也不会明显拖慢运行速度的最优方案:
1. 接入成熟图片加载框架自动适配
这是性价比最高的方案,不需要修改原图片资源,框架会自动完成所有适配逻辑:
- 选用Glide、Fresco这类工业级图片加载框架,框架会自动根据当前展示控件的尺寸、设备的内存参数对大图做下采样,仅加载刚好适配展示所需的像素数据进内存,比手动实现的采样逻辑效率更高,同时自带的多级缓存机制也不会拖慢加载速度。
- 以Glide为例,仅需要常规调用即可自动完成适配,无需额外配置:
Glide.with(context).load(图片资源/本地路径/网络地址).into(targetImageView);
2. 针对低版本系统做专属内存优化
- 在AndroidManifest.xml的
<application>节点中添加android:largeHeap="true"配置,可提升应用的Java堆上限,大幅降低低版本设备的OOM概率,该配置对高版本系统无负面影响。 - 全局配置图片解码格式为
RGB_565,针对不需要透明度的图片,该格式比默认的ARGB_8888少占用50%的内存,大部分展示场景下视觉差异可以忽略,可直接在图片加载框架中全局配置,不需要修改每个加载逻辑。
3. 本地资源分类存放
如果报错的是本地drawable资源,不需要修改图片本身,只需将大图按分辨率放到对应drawable-xxx文件夹下,系统会自动根据当前设备的分辨率匹配对应资源并做适配缩放,避免低分辨率设备直接加载超高分辨率的原始大图。
内容的提问来源于stack exchange,提问作者Antoine Massart
相关产品推荐
相关产品推荐

