Processamento do sistema do usuário em primeiro e segundo plano

No Android para dispositivos móveis, o suporte a vários usuários permite que eles sejam executados em segundo plano (quando outro usuário está ativo) e em primeiro plano (também conhecido como o usuário atual). Para conservar recursos quando apropriado, o sistema gerencia a desativação de usuários. Sempre é necessário ter um usuário em primeiro plano.

A partir do Android 10, o Android Automotive tem uma configuração padrão que permite que um máximo de três usuários somente sejam executados por vez (config_multiuserMaxRunningUsers). Portanto, além do usuário do sistema sem cabeça (Usuário 0), apenas um usuário em primeiro plano e um em segundo plano podem ser configurados.

  • Em circunstâncias típicas, o usuário atual é executado em primeiro plano e o usuário do sistema sem cabeça (usuário 0) é executado em segundo plano. Quando um usuário é movido para o segundo plano, ele é interrompido, mas não bloqueado. Quando o número máximo de usuários é atendido, o usuário em segundo plano usado menos recentemente é interrompido e travado (config_multiuserDelayUserDataLocking).
  • Os usuários em segundo plano parados e desbloqueados são reiniciados durante o Modo garagem.

Os usuários convidados são temporários e podem ser executados apenas em primeiro plano. Quando uma pessoa sai do modo convidado, o usuário convidado é interrompido e não pode ser executado em segundo plano.

Processos do usuário em segundo plano

Quando um usuário muda de primeiro para segundo plano (e vice-versa), todas as atividades e serviços em primeiro plano para esse usuário são encerrados. Isso interrompe todos os serviços vinculados a esses serviços. No entanto, ainda há algumas limpezas. Os serviços persistentes de apps próprios e do sistema OEM continuam sendo executados enquanto o usuário (agora em segundo plano) não for interrompido.

Os serviços persistentes são mais problemáticos, porque estão contidos em um bucket de alta prioridade no sistema de gerenciamento de falta de memória (OOM, na sigla em inglês) do Android. Mesmo que os apps para o usuário em primeiro plano exijam mais memória, esses processos em segundo plano persistentes não são encerrados. Como resultado, do ponto de vista do usuário em primeiro plano, os serviços persistentes reservam permanentemente uma quantidade de memória, e essa memória é retornada somente quando uma pessoa reinicia o carro e todos os usuários em segundo plano são interrompidos.

Estado do usuário

Um usuário está em um estado parado (STATE_SHUTDOWN) até ser iniciado. Se uma credencial de usuário (como um PIN) estiver definida, o usuário do Android será executado, mas permanecerá bloqueado (STATE_RUNNING_LOCKED), até que uma pessoa desbloqueie a tela de bloqueio para esse usuário. Quando o usuário é desbloqueado, o armazenamento criptografado por credenciais é descriptografado e os diretórios de dados do usuário ficam disponíveis. Para a troca de usuário típica, o usuário em segundo plano não é interrompido e permanece em execução e desbloqueado (STATE_RUNNING_UNLOCKED), uma vez desbloqueado.

Modo garagem, JobScheduler e atualizações de apps para usuários

A técnica recomendada para que os apps automotivos atualizem dados é usar JobScheduler para programar a execução de jobs quando um dispositivo estiver no estado inativo, pelo Modo garagem (por exemplo, fazer o download de atualizações do app no Google Play). Depois que os apps registrarem jobs com JobScheduler e JobSchedulerService, os jobs serão executados quando possível.

O CarService envia um sinal para JobSchedulerService para acionar jobs definidos para execução quando o dispositivo automotivo está inativo no modo Garagem. Para que JobSchedulerService execute jobs para um usuário em segundo plano, esse usuário precisa estar no estado STATE_RUNNING_UNLOCKED. Os jobs enfileirados em JobSchedulerService são mantidos e persistem durante os ciclos de energia.

JobScheduler não pode executar trabalhos para um usuário específico se ele nunca foi desbloqueado após um ciclo de energia. No entanto, quando o usuário é desbloqueado e permanece em STATE_RUNNING_UNLOCKED, os jobs do usuário podem ser executados.