As novas limitações de aplicativos em segundo plano do Android 12 podem ser uma grande dor de cabeça para usuários avançados que usam aplicativos como Termux e talvez até Tasker.
Andróide 12 introduziu muitas mudanças, embora nem todas sejam realmente voltadas para o usuário. Recursos como o enorme Material You redesenhado são obviamente jogados na sua cara e difíceis de perder, mas algo como Chave digital do carro o suporte pode ser mais fácil de perder. No entanto, uma mudança que pode até ser totalmente não documentada causará estragos em aplicativos como o Termux, e é a introdução de um assassino de processos em segundo plano bastante agressivo.
Para contextualizar, Termux é um emulador de terminal Linux que você pode obter no Android e o gerenciamento de pacotes do Termux sistema é muito parecido com a Advanced Package Tool (APT) do Debian, pois você pode pesquisar, instalar e desinstalar com o comando apto. O Termux instala apenas alguns pacotes básicos prontos para uso, para reduzir o tamanho do APK na Play Store, mas permite que você
instale quaisquer pacotes extras que você deseja. Muitas vezes, as pessoas usam o Termux para transformar smartphones mais antigos em miniservidores ou para executar outros programas que normalmente não são voltados para smartphones. Um uso comum é até configurar o youtube-dl nativamente, já que você pode executar scripts Python usando Termux em seu smartphone.No Android 12, porém, foi descoberto que um mecanismo para monitorar processos filhos bifurcados iniciados por aplicativos e os mata se consumirem muita CPU se o aplicativo estiver em segundo plano (via Mishaal Rahman) foi introduzido. Também limita o número de processos filhos que os processos pais podem gerar para 32, o que limita bastante o número de operações que um aplicativo pode concluir em segundo plano. Na verdade, esse limite de 32 processos filhos abrange todo o sistema, não apenas por aplicativo, o que significa que outros aplicativos com processos filhos também contribuirão para esse limite. Testei no Google Pixel 6 Pro e posso confirmar que o Assassino de Processo Fantasma existe e pode potencialmente causar estragos no Termux.
O Phantom Process Killer do Android 12 mata processos em segundo plano
O Android 12 introduziu algumas restrições aos processos em segundo plano; a primeira é que os processos filhos de aplicativos que consomem muita CPU em segundo plano serão eliminados se o processo pai também estiver em segundo plano. A segunda restrição introduzida é um limite no número de processos filhos que podem estar ativos a qualquer momento. De histórico de commits, parece que o Google estava tentando reprimir processos fraudulentos em segundo plano.
"Os aplicativos podem usar Runtime.exec() para gerar processos filhos e a estrutura não terá ideia sobre seu ciclo de vida. Agora rastreie esses processos sempre que os encontrarmos - atualmente, durante a amostragem de estatísticas da CPU, eles podem ser detectados. Se estiver consumindo muita CPU enquanto o processo do aplicativo pai também estiver em segundo plano, elimine-o. Por padrão, permitimos até 32 desses processos; o processo com a pior pontuação de ajuste de oom de seus pais será eliminado se houver muitos deles.
É claro que os smartphones Android já são famosos por matar aplicativos em segundo plano. Praticamente todos os principais OEMs se envolvem nisso de alguma forma, e empresas como OnePlus, Samsung e Xiaomi são considerados entre os piores. Embora o AOSP tenha algumas restrições de aplicativos em segundo plano, é típico dos fabricantes criarem suas próprias restrições sobre o AOSP. No entanto, essas são limitações bastante estritas para usuários avançados e incentivam comportamentos contra os quais os usuários avançados têm sido veementemente contra. Talvez aumente a vida útil da bateria a longo prazo, mas aparentemente também não há como desativá-lo.
Acionando o Android 12 Phantom Process Killer
Como diz o commit, 32 desses processos são permitidos, e verifiquei isso no meu Google Pixel 6 Pro com o seguinte comando.
adb shell "/system/bin/dumpsys activity settings"
Na saída deste comando, há uma constante chamada "max_phantom_processes" com valor 32. Neste contexto, um "processo fantasma" é considerado pelo sistema Android como um processo filho executado em segundo plano. Se você tiver um dispositivo Android 12, poderá usar o Termux para gerar mais de 32 processos filhos, criando um script bash em algum lugar do seu armazenamento contendo o código a seguir e executando-o (créditos para Agnóstico-Apolo no GitHub, um desenvolvedor envolvido com Termux):
for i in $(seq 40); do
sha256sum /dev/zero &
done
Para executá-lo, no Termux navegue até a pasta onde você salvou o script e digite o seguinte:
shfilename.sh
Se o seu telefone começar a ficar lento, isso significa que está funcionando. O código acima gera 40 operações sha256sum em segundo plano (indicadas pelo e comercial) tomando o /dev/zero arquivo como entrada. sha256sum fornecerá o hash SHA-256 de qualquer arquivo fornecido como entrada. A razão /dev/zero é usado é que é um arquivo de comprimento infinito que contém valores nulos enquanto for lido, o que significa que o A operação sha256sum nunca chegará ao final do arquivo, servindo como um bom teste de estresse para garantir um plano de fundo contínuo operações.
Depois de alguns segundos a um minuto, você poderá ver o seguinte:
O “sinal 9” é um sinal enviado ao processo forçando seu desligamento, e esse sinal é enviado pelo agendador Linux. A razão pela qual a mensagem aparece é que o terminal bash também é tecnicamente um processo filho do Termux, e o Android 12 acaba matando o terminal bash na demonstração acima. Na saída do logcat, você pode ver o seguinte:
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {623260a 7362:7284:nightwatch.txt/u0a227}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {bf3d88c 24220:24040:nightwatch.txt/u0a237}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {b160bd5 27316:27269:bash/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {bbc1fea 27371:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {9cf12db 27372:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {54bf178 27373:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {fb89051 27374:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {d3450b6 27375:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {2a201b7 27376:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {60aad24 27377:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {124e08d 27378:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {32cc242 27379:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {b160bd5 27316:27269:bash/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {9cf12db 27372:27269:sha256sum/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {414579a 27434:27269:top/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {32cc242 27379:27269:sha256sum/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {bbc1fea 27371:27269:sha256sum/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {bf3d88c 24220:24040:nightwatch.txt/u0a237} died
11-02 13:01:52.512 1444 1764 I ActivityManager: Process PhantomProcessRecord {60aad24 27377:27269:sha256sum/u0a340} died
11-02 13:01:52.516 1444 1764 I ActivityManager: Process PhantomProcessRecord {623260a 7362:7284:nightwatch.txt/u0a227} died
11-02 13:01:52.516 1444 1764 I ActivityManager: Process PhantomProcessRecord {124e08d 27378:27269:sha256sum/u0a340} died
11-02 13:01:52.517 1444 1764 I ActivityManager: Process PhantomProcessRecord {fb89051 27374:27269:sha256sum/u0a340} died
11-02 13:01:52.519 1444 1764 I ActivityManager: Process PhantomProcessRecord {54bf178 27373:27269:sha256sum/u0a340} died
11-02 13:01:52.532 1444 1764 I ActivityManager: Process PhantomProcessRecord {2a201b7 27376:27269:sha256sum/u0a340} died
11-02 13:01:52.545 1444 1764 I ActivityManager: Process PhantomProcessRecord {d3450b6 27375:27269:sha256sum/u0a340} died
A linha importante é aquela que menciona que o processo “bash” foi cortado e depois morreu, e é por isso que o Termux para de funcionar. Embora eu não tenha certeza do que é “nightwatch.txt”, uma pesquisa superficial no Google parece sugerir que ele está relacionado ao Facebook e ao Facebook Messenger, dois aplicativos que tenho instalados. Testei isso com a bateria adaptativa desligada e certifiquei-me de que também não havia otimizações de bateria aplicadas ao Termux.
Após terminar o teste, é provável que algumas das operações sha256sum continuem no fundo ainda (e pressionar enter forçará o fechamento do Termux), então abra novamente o Termux e digite o seguindo:
killall sha256sum
Embora tal limitação faça sentido para alguns aplicativos, os aplicativos que usuários avançados podem estar mais inclinados a usar (como o Termux) serão prejudicados. Isso também pode afetar outros aplicativos que usuários avançados também usam, como o Tasker. É uma limitação que ainda não parece possível ser superada e introduz ainda mais limitações em aplicativos em segundo plano, além de todas as outras restrições proprietárias que os fabricantes impõem. No tópico de problemas em andamento do GitHub, o seguinte é mencionado por agnostic-apollo em relação a um logcat que foi enviado por e-mail para eles:
"Todos os 32 logcat PhantomProcessRecord rastreados pertencem a com.wsandroid.suite e o bash do termux foi um dos processos que foram eliminados. Como mencionado acima, o limite de 32 processos é para todos os aplicativos combinados"
Curiosamente, executei os mesmos testes em um Xiaomi 11T Pro rodando Android 11 e confirmei que o comportamento não existe naquele dispositivo específico nessa configuração, embora os dispositivos Xiaomi sejam famosos por aplicativos em segundo plano limitações. Esta é, estranhamente, uma das políticas de gerenciamento de aplicativos em segundo plano mais rígidas introduzidas em qualquer smartphone Android, já que não há como contornar isso. Mesmo em dispositivos Xiaomi e OnePlus, é possível desativar maioria disso, e para algumas pessoas, desabilitar todas as otimizações de bateria nesses dispositivos é suficiente para que fiquem felizes. O assassino de processos fantasma, por outro lado, nem pode ser desativado.
Se você confia no Termux para muitas operações no dispositivo que são intensas com muitos processos em segundo plano, pode valer a pena adiar a atualização por enquanto até que haja mais informações. Se você não é um usuário avançado, provavelmente não é algo com que você realmente precise se preocupar.