位图通常是应用中最耗内存的对象。解码和缩放操作通常位于帧渲染的关键路径上。通过减少卡顿、ANR 和与 OOM 相关的进程终止,优化位图内存使用量可显著提高界面响应速度、电池续航时间和整体稳定性。
导致位图内存用量过高的因素
从未使用的虚拟内存也可能包含在计算中。如果您发现位图内存用量出乎意料地高,请验证您是否分配了未使用的内存。
资源
在 Android Studio 中分析位图
Android Studio 位图性能分析
使用内存分析器实时检查内存分配情况、捕获堆转储并分析对象是否存在内存泄漏;此外,还可以使用堆分析器检测内存泄漏、识别重复的位图分配并直观呈现对象保留情况。
使用 LeakCanary 自动检测内存泄漏
集成 LeakCanary 库以自动检测应用中的内存泄漏。LeakCanary 提供自动堆分析,可识别本应进行垃圾回收但仍保留在内存中的对象,例如被已销毁的组件保留的位图。
位图性能文档
这些资源全面介绍了在不同 Android 组件中高效处理位图的最佳实践。
用于优化位图内存用量的开发者核对清单
如需优化位图内存效率,请遵循以下三项核心原则:减少、重复使用和回收。
- 减少:尽量减少加载或显示位图时的初始内存占用空间。
- 重用:实现缓存机制,以避免冗余的位图分配。
- 回收:主动释放资源,以便为活跃进程重新分配内存。
以下开发者清单可帮助您优化位图内存用量。
| 核心原则 | 领域 | 说明 |
|---|---|---|
| 减少 | 消除重复的位图 | 使用内存分析器分析堆转储,以检测冗余的位图分配。请参阅管理位图内存指南。 |
| 利用图像加载库 | 使用 Glide 和 Coil 等库,自动执行线程处理、缓存和高效解码。 | |
| 实现降采样 | 解码图片以匹配目标界面容器尺寸,而不是加载全分辨率素材资源。 | |
| 针对不透明图片使用 RGB_565 | 对于不透明的图片,通过从 ARGB_8888 切换到 16 位配置,将内存占用量减少 50%。 |
|
| 优先处理 VectorDrawable | 使用矢量来制作图标和基本图形,以确保缩放时清晰度高,且内存开销极低。 | |
| 优化服务器端图片传送 | 配置后端 API,以提供适合设备密度和界面容器尺寸的图片。 | |
| 消除透明边距 | 使用 InsetDrawable 或布局内边距(而非内置边距)来避免为“不可见”像素分配内存。请参阅设计内存性能出色的 Android 应用。 | |
| 重复使用 | 配置最佳缓存大小 | 根据设备 RAM 和屏幕分辨率量身定制内存和磁盘缓存限制。请参阅缓存位图。 |
| 回收 | 在后台清除资源 | 实现 TRIM_MEMORY_BACKGROUND 以清除缓存并提高进程在系统内存压力下的存活率。 |
| 在界面隐藏时释放资源 | 当应用对用户不再可见时,使用 TRIM_MEMORY_UI_HIDDEN 释放位图缓存。 |
|
| 监控内存泄漏 | 使用 LeakCanary 和内存分析器查找在 LifecycleOwner 被销毁后保留的位图。请参阅管理应用内存。 |