Estou bastante curioso sobre esta questão relativa à gerenciamento de memória do sistema operacional Android, por isso espero uma resposta bastante detalhada sobre esse tópico.
O que eu gostaria de saber:
- Qual é a quantidade máxima de memória (em megabytes / como porcentagem da RAM total) que um aplicativo Android (que não é um aplicativo do sistema) pode usar?
- Existem diferenças entre as versões do Android ?
- Existem diferenças quanto ao fabricante do dispositivo?
E o mais importante:
- O que é considerado / do que depende quando o sistema determina a quantidade de RAM que um aplicativo pode usar em tempo de execução (assumindo que o máximo de memória por aplicativo não seja um número estático)?
O que ouvi até agora (até 2013):
- Os primeiros dispositivos Android tinham um limite de 16 MB por aplicativo
- Posteriormente, esse limite aumentou para 24 MB ou 32 MB
O que me deixa muito curioso:
Esses dois limites são muito baixos.
Acabei de baixar o Android Task Manager para verificar a RAM dos meus dispositivos. O que eu notei é que existem aplicativos usando cerca de 40 a 50 megabytes de RAM, o que é obvioulsy mais do que o uso máximo de RAM mencionado, digamos 32 MB. Então, como o Android determina quanta RAM um aplicativo pode usar? Como é possível que os aplicativos excedam esse limite?
Além disso, notei que alguns aplicativos meus travam (eliminados pelo sistema?) Com uma OutOfMemoryException ao usar cerca de 30 a 40 megabytes. Por outro lado, tenho aplicativos em execução no meu telefone usando 100 MB ou mais depois de algum tempo (provavelmente devido a vazamentos de memória) que não travam ou são mortos. Portanto , obviamente, também depende do próprio aplicativo quando se trata de determinar quanta RAM pode ser poupada. Como isso é possível? (Realizei meus testes com um HTC One S com 768 MB de RAM)
Disclaimer: Eu não sou afiliado com o aplicativo Android Task Manager de qualquer forma.
fonte
É o fim de 2018, então as coisas mudaram.
Primeiro: execute o aplicativo e abra a guia Android Profiler no Android Studio. Você verá quanta memória consome, ficará surpreso, mas ele pode alocar muita RAM.
Também aqui está um excelente artigo em documentos oficiais, com instruções detalhadas sobre como usar o Memory Profiler, que pode fornecer uma visão detalhada do gerenciamento de memória.
Mas na maioria dos casos, seu Android Profiler regular será suficiente para você.
Normalmente, um aplicativo começa com 50Mb de alocação de RAM, mas salta instantaneamente até 90Mb quando você começa a carregar algumas fotos na memória. Quando você abre o Activity com um ViewPager com fotos pré-carregadas (3,5Mb cada), você pode obter 190Mb facilmente em segundos.
Mas isso não significa que você tenha problemas com o gerenciamento de memória.
O melhor conselho que posso dar é seguir as diretrizes e práticas recomendadas, usar as principais bibliotecas para carregamento de imagens (Glide, Picasso) e você ficará bem.
Mas, se você precisar adaptar algo e realmente precisar saber quanta memória pode alocar manualmente, poderá obter memória livre total e calcular uma parte pré-determinada (em%) dela. No meu caso, eu precisava armazenar em cache as fotos descriptografadas na memória para não precisar descriptografá-las sempre que o usuário passar pela lista.
Para esse fim, você pode usar a classe LruCache pronta para usar . É uma classe de cache que rastreia automaticamente a quantidade de memória que seus objetos alocam (ou o número de instâncias) e remove a mais antiga para manter as recentes pelo histórico de uso. Aqui está um ótimo tutorial sobre como usá-lo.
No meu caso, criei 2 instâncias de caches: para polegares e anexos. Tornou-os estáticos com acesso único, para que estejam disponíveis globalmente em todo o aplicativo.
classe de cache:
É assim que eu calculo a RAM livre disponível e quanto posso extrair dela:
E é assim que eu o uso nos adaptadores para obter a imagem em cache:
e como eu o configuro no cache no thread de segundo plano (AsyncTask regular):
Meu aplicativo tem como alvo a API 19+, para que os dispositivos não sejam antigos e essas partes da RAM disponível sejam boas o suficiente para cache no meu caso (1% e 3%).
Curiosidade: o Android não possui APIs ou outros hacks para obter a quantidade de memória alocada ao seu aplicativo, é calculado em tempo real com base em vários fatores.
PS: Estou usando um campo de classe estática para armazenar um cache, mas de acordo com as diretrizes mais recentes do Android, é recomendável usar o componente de arquitetura ViewModel para esse fim.
fonte
Os limites de memória por aplicativo estão aqui, dependendo do tamanho da tela e da versão do Android: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing
Fonte: Downloads de compatibilidade do Android http://source.android.com/compatibility/downloads.html ; Documento de Definição de Compatibilidade (CDD), Seção Compatibilidade com Máquina Virtual ou Compatibilidade com Tempo de Execução
fonte