Os bitmaps costumam ser os maiores objetos que consomem memória em um app. As operações de decodificação e escalonamento geralmente estão no caminho crítico para a renderização de frames. A otimização do uso da memória de bitmap oferece melhorias significativas na capacidade de resposta da interface, na duração da bateria e na estabilidade geral, reduzindo travamentos, ANRs e encerramentos de processos relacionados a OOM.
Fatores que contribuem para o alto uso da memória de bitmap
A memória virtual que nunca foi usada também pode ser incluída no cálculo. Se você notar um uso inesperadamente alto da memória de bitmap, verifique se não está alocando memória que não é usada.
Recursos
Analisar bitmaps no Android Studio
Criação de perfil de bitmaps no Android Studio
Use o Memory Profiler para inspecionar alocações de memória em tempo real, capturar heap dumps e analisar objetos em busca de vazamentos de memória. Além disso, use o analisador de heap para detectar vazamentos de memória, identificar alocações de bitmap duplicadas e visualizar a retenção de objetos.
Detecção automática de vazamentos com o LeakCanary
Integre a biblioteca LeakCanary para automatizar a detecção de vazamentos de memória no seu app. O LeakCanary oferece análise automática de heap, identificando objetos que deveriam ter sido coletados como lixo, mas ainda estão na memória, como bitmaps retidos por componentes destruídos.
Documentação de desempenho de bitmap
Esses recursos oferecem orientação abrangente sobre práticas recomendadas para o processamento eficiente de bitmaps em diferentes componentes do Android.
Lista de verificação do desenvolvedor para otimizar o uso da memória de bitmap
Para otimizar a eficiência da memória de bitmap, siga os três princípios básicos: reduzir, reutilizar e reciclar.
- Reduzir: minimize o consumo inicial de memória ao carregar ou mostrar bitmaps.
- Reutilização: implemente mecanismos de cache para evitar alocações redundantes de bitmap.
- Reciclar: libera recursos de maneira proativa para permitir a realocação de memória para processos ativos.
A lista de verificação para desenvolvedores a seguir pode ajudar você a otimizar o uso da memória de bitmap.
| Princípio fundamental | Área | Descrição |
|---|---|---|
| Reduzir | Eliminar bitmaps duplicados | Analise heap dumps usando o Memory Profiler para detectar alocações de bitmap redundantes. Consulte o guia Como gerenciar a memória de bitmap. |
| Aproveitar bibliotecas de carregamento de imagens | Use bibliotecas como Glide e Coil para automatizar threading, armazenamento em cache e decodificação eficiente. | |
| Implementar a redução de amostragem | Decodifique imagens para corresponder às dimensões do contêiner da interface de destino em vez de carregar recursos de resolução total. | |
| Usar RGB_565 para imagens opacas | Reduza o consumo de memória em 50% mudando de ARGB_8888 para uma configuração de 16 bits em imagens sem transparência. |
|
| Priorizar VectorDrawables | Use vetores para ícones e gráficos básicos para garantir um escalonamento nítido com sobrecarga mínima de memória. | |
| Otimizar a entrega de imagens do lado do servidor | Configure as APIs de back-end para disponibilizar imagens adaptadas à densidade do dispositivo e às dimensões do contêiner da interface. | |
| Eliminar margens transparentes | Evite alocar memória para pixels "invisíveis" usando InsetDrawable ou padding de layout em vez de margens fixas. Consulte Engenharia de apps Android com boa performance de memória. | |
| Reutilizar | Configurar tamanhos ideais de cache | Adapte os limites de memória e cache em disco com base na RAM do dispositivo e na resolução da tela. Consulte Como armazenar bitmaps em cache. |
| Reciclagem | Limpar recursos em segundo plano | Implemente TRIM_MEMORY_BACKGROUND para limpar caches e melhorar a capacidade de sobrevivência do processo durante a pressão da memória do sistema. |
| Liberar recursos quando a interface estiver oculta | Use TRIM_MEMORY_UI_HIDDEN para liberar caches de bitmap quando o app não estiver mais visível para o usuário. |
|
| Monitorar vazamentos de memória | Use o LeakCanary e o Memory Profiler para encontrar bitmaps retidos depois que o LifecycleOwner é destruído. Consulte Gerenciar a memória do seu app. |