Los mapas de bits suelen ser los objetos que más memoria consumen en una app. Las operaciones de decodificación y escalamiento suelen estar en la ruta crítica para la renderización de fotogramas. La optimización del uso de memoria de mapas de bits proporciona mejoras significativas en la capacidad de respuesta de la IU, la duración de la batería y la estabilidad general, ya que reduce los bloqueos, los ANR y las finalizaciones de procesos relacionadas con errores de OOM.
Factores que contribuyen al alto uso de memoria de mapa de bits
En el cálculo, también se puede incluir la memoria virtual que nunca se usó. Si observas un uso de memoria de mapa de bits inesperadamente alto, verifica que no estés asignando memoria que no se usa.
Recursos
Cómo analizar mapas de bits en Android Studio
Generación de perfiles de Android Studio para mapas de bits
Usa el Generador de perfiles de memoria para inspeccionar las asignaciones de memoria en tiempo real, capturar volcados de montón y analizar objetos en busca de fugas de memoria. Además, usa el analizador de montón para detectar fugas de memoria, identificar asignaciones de mapas de bits duplicados y visualizar la retención de objetos.
Detección automática de fugas con LeakCanary
Integra la biblioteca de LeakCanary para automatizar la detección de fugas de memoria en tu app. LeakCanary proporciona análisis automáticos del montón, identifica objetos que deberían haberse recopilado como basura, pero que aún se conservan en la memoria, como mapas de bits retenidos por componentes destruidos.
Documentación sobre el rendimiento de mapas de bits
Estos recursos proporcionan orientación integral sobre las prácticas recomendadas para el procesamiento eficiente de mapas de bits en diferentes componentes de Android.
- Cómo administrar la memoria del mapa de bits
- Cómo optimizar imágenes de mapa de bits
- Administra la memoria de tu app
Lista de tareas para desarrolladores para optimizar el uso de memoria de mapa de bits
Para optimizar la eficiencia de la memoria del mapa de bits, sigue los tres principios básicos: reducir, reutilizar y reciclar.
- Reduce: Minimiza el espacio en memoria inicial cuando se cargan o muestran mapas de bits.
- Reutilización: Implementa mecanismos de almacenamiento en caché para evitar asignaciones de mapas de bits redundantes.
- Reciclar: Libera recursos de forma proactiva para permitir la reasignación de memoria para procesos activos.
La siguiente lista de tareas para desarrolladores puede ayudarte a optimizar el uso de memoria de mapa de bits.
| Principio básico | Área | Descripción |
|---|---|---|
| Reducir | Elimina los mapas de bits duplicados | Analiza los volcados de montón con el Generador de perfiles de memoria para detectar asignaciones de mapas de bits redundantes. Consulta la guía Cómo administrar la memoria del mapa de bits. |
| Aprovecha las bibliotecas de carga de imágenes | Usa bibliotecas como Glide y Coil para automatizar el subprocesamiento, el almacenamiento en caché y la decodificación eficiente. | |
| Implementa la reducción de muestreo | Decodifica imágenes para que coincidan con las dimensiones del contenedor de la IU objetivo en lugar de cargar recursos en resolución completa. | |
| Usa RGB_565 para imágenes opacas | Se redujo el espacio en memoria en un 50% al cambiar de ARGB_8888 a una configuración de 16 bits para las imágenes sin transparencia. |
|
| Prioriza VectorDrawables | Usa vectores para los íconos y los gráficos básicos para garantizar un escalamiento nítido con una sobrecarga de memoria mínima. | |
| Optimiza la entrega de imágenes del servidor | Configura las APIs de backend para entregar imágenes adaptadas a la densidad del dispositivo y a las dimensiones del contenedor de la IU. | |
| Elimina los márgenes transparentes | Evita asignar memoria para píxeles "invisibles" usando InsetDrawable o padding de diseño en lugar de márgenes integrados. Consulta Cómo diseñar apps para Android con un buen rendimiento de la memoria. | |
| Reutilización | Configura tamaños óptimos de caché | Ajusta los límites de la memoria caché del disco y la memoria según la RAM y la resolución de pantalla del dispositivo. Consulta Cómo almacenar mapas de bits en caché. |
| Reciclar | Borra recursos en segundo plano | Implementa TRIM_MEMORY_BACKGROUND para borrar las cachés y mejorar la supervivencia del proceso durante la presión de la memoria del sistema. |
| Activos de lanzamiento cuando la IU está oculta | Usa TRIM_MEMORY_UI_HIDDEN para liberar las memorias caché de mapa de bits cuando la app ya no sea visible para el usuario. |
|
| Supervisa las fugas de memoria | Usa LeakCanary y el Generador de perfiles de memoria para encontrar mapas de bits que se conservan después de que se destruye su LifecycleOwner. Consulta Cómo administrar la memoria de tu app. |