O QPR3 ou mais recente do Android 11 oferece suporte ao congelador de apps armazenados em cache. Esse recurso interrompe a execução de processos em cache e reduz o uso de recursos por apps com comportamento inadequado que podem tentar operar em cache. O framework congela apps em cache migrando os processos para um cgroup congelado. Isso reduz o consumo de CPU ativo e inativo na presença de apps em cache ativos. O freezer do app pode ser ativado usando uma flag de configuração do sistema ou uma opção do desenvolvedor.
Implementar o freezer de apps
O freezer de apps em cache aproveita o freezer cgroup v2 do kernel. Os dispositivos enviados
com um kernel compatível podem (opcionalmente) ativá-lo. Para fazer isso, ative a
opção do desenvolvedor "Suspender execução para apps em cache" ou defina a flag de configuração
do dispositivo activity_manager_native_boot use_freezer
como true
. Exemplo:
adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
O freezer é desativado quando a flag use_freezer
é definida como falsa ou a
opção de desenvolvedor é desativada. Você pode alternar essa definição mudando a configuração de um dispositivo em uma versão ou atualização de software.
O apps freezer não expõe APIs oficiais (e não tem um cliente de implementação
de referência), mas usa as APIs de sistema ocultas setProcessFrozen
e enableFreezer
. Para detalhes sobre essas APIs, consulte Process.java
do ActivityManager e a API ActivityManagerService. Os desenvolvedores também podem consultar
o código do cliente em ActivityManager
para experimentos.
Processar recursos personalizados
Normalmente, não espera-se que os processos façam nenhum trabalho quando armazenados em cache, mas alguns apps podem ter recursos personalizados com suporte de processos que devem ser executados enquanto armazenados em cache. Quando o congelamento de apps está ativado em um dispositivo que executa esse app, os processos em cache são congelados e podem impedir que os recursos personalizados funcionem.
Como solução alternativa, se um app tiver um processo que precise realizar atividades enquanto está em cache, mude o status do processo para não ter cache (como Bound ForeGround Service (BFGS) ou em primeiro plano) antes que o processo precise fazer qualquer trabalho para permitir que o app permaneça ativo.
Testar o freezer de apps
Para verificar se o freezer do app está funcionando conforme o esperado, use os seguintes recursos:
Verifique uma lista de processos congelados usando o comando
adb shell dumpsys activity
e o grep paraApps frozen:
.Verifique se o arquivo
/sys/fs/cgroup/uid_0/cgroup.freeze
está presente.Acesse o logcat, que mostra entradas congeladas e descongeladas sempre que um processo migra para dentro ou para fora do freezer. Exemplo:
adb logcat | grep -i "\(freezing\|froze\)"