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.
Identificar o uso elevado da memória de bitmap
O Android vitals fornece métricas sobre o consumo de memória de bitmap de um app agregando dados de dispositivos Android. Por padrão, elas são calculadas como um resumo de 28 dias dos dados diários. Esses dados ajudam a identificar tendências e possíveis regressões na eficiência da memória em diferentes tipos e versões de dispositivos.
O Android vitals compartilha o uso da memória de bitmap do app dividido pelos seguintes estados de processo:
- Em primeiro plano: o processo do app está visível. É esperado que o P99 seja significativamente maior em primeiro plano do que em outros estados de processo, mas os desenvolvedores precisam investigar se a proporção P99/P50 é significativa (por exemplo, maior que 3,5 vezes), já que isso geralmente aponta para um vazamento de memória de bitmap. Para identificar isso, procure uma divergência entre o uso típico (P50) e o uso atípico (P99). Enquanto o aumento geral de recursos aumenta a memória de maneira uniforme em todos os percentis, os vazamentos de memória se agravam com o tempo, distorcendo muito os dados finais (P99). Verifique se as alocações de bitmap em primeiro plano não persistem desnecessariamente depois que o app passa para outros estados.
- Serviços percebidos pelo usuário: o processo do app está em um estado perceptível. Isso inclui serviços em primeiro plano, jobs acelerados e jobs de transferência de dados iniciados pelo usuário. Os apps não podem reter alocações de bitmap em primeiro plano pesadas ao fazer a transição para esses estados. Como esses serviços são projetados para tarefas de longa duração, manter recursos grandes prejudica a experiência geral do usuário e força o daemon Low Memory Killer (LMKD) a recuperar memória encerrando processos de menor prioridade.
- Segundo plano: o app está executando um serviço em segundo plano ou foi colocado em segundo plano recentemente, mas ainda não está em cache. Como esse estado de processo é menos importante do que os processos em primeiro plano ou perceptíveis, os apps precisam liberar explicitamente recursos de bitmap grandes aqui para reduzir a pressão da memória.
- Em cache: o app está em estado de cache. Esse estado é altamente sensível à pressão da memória do sistema, como LMKs. Os apps precisam reduzir de maneira proativa o uso da memória de bitmap nesse estado para evitar a remoção pelo SO.
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.