位图内存用量

位图通常是应用中最耗内存的对象。解码和缩放操作通常位于帧渲染的关键路径上。通过减少卡顿、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 被销毁后保留的位图。请参阅管理应用内存