Freezer dos apps armazenados em cache

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 para Apps 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\)"