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

No Android móvel, o suporte para vários usuários permite que os usuários executem em segundo plano (quando outro usuário está ativo) e em primeiro plano (também conhecido como o usuário atual). Para economizar recursos quando apropriado, o sistema gerencia o desligamento dos usuários. Um usuário de primeiro plano é sempre necessário .

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

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

Os usuários convidados são efêmeros e só podem ser executados em primeiro plano. Quando uma pessoa sai do Convidado, o Usuário Convidado é interrompido e não pode ser executado em segundo plano.

Processos do usuário em segundo plano

Quando ocorre a mudança do usuário de primeiro plano para segundo plano (e vice-versa), todas as atividades e serviços de primeiro plano para esse usuário são encerrados. Isso leva à interrupção de todos os serviços vinculados a esses serviços. No entanto, alguma limpeza permanece. Os serviços persistentes de aplicativos de sistema originais e OEM continuam a ser executados enquanto o usuário (agora em segundo plano) não for interrompido.

Os serviços persistentes são mais problemáticos, pois estão contidos em um balde de alta prioridade no sistema de gerenciamento de falta de memória (OOM) do Android. Mesmo que os aplicativos para o usuário em primeiro plano exijam mais memória, esses processos persistentes em segundo plano não serão encerrados. Como resultado, do ponto de vista do usuário de primeiro plano, os serviços persistentes extraem permanentemente alguma quantidade de memória e essa memória é retornada apenas quando uma pessoa reinicia o carro e qualquer usuário de segundo plano é interrompido.

Estado do usuário

Um usuário está em um estado parado ( STATE_SHUTDOWN ) até que o usuário seja iniciado. Se uma credencial de usuário (como um PIN) for 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. Depois que o usuário for desbloqueado, o armazenamento criptografado de suas credenciais será descriptografado e os diretórios de dados desse usuário ficarão disponíveis. Para troca típica de usuário, o usuário em segundo plano não é interrompido e permanece em execução e desbloqueado ( STATE_RUNNING_UNLOCKED ), uma vez desbloqueado.

Garage Mode, JobScheduler e atualizações de aplicativos para usuários

A técnica recomendada para aplicativos automotivos atualizarem dados é usar o JobScheduler para agendar trabalhos para serem executados quando um dispositivo estiver no estado ocioso, por meio do Modo Garagem (por exemplo, o download de atualizações de aplicativos da Google Play Store). Depois que os aplicativos registram trabalhos com JobScheduler e JobSchedulerService, os trabalhos são executados quando possível.

CarService envia um sinal para JobSchedulerService para acionar trabalhos definidos para serem executados quando o dispositivo automotivo estiver ocioso no Modo Garagem. Para que JobSchedulerService execute tarefas para usuários em segundo plano, esse usuário deve estar no estado STATE_RUNNING_UNLOCKED . Os trabalhos enfileirados no JobSchedulerService são persistidos e sobrevivem entre ciclos de energia.

JobScheduler não pode executar tarefas para um usuário específico se o usuário nunca foi desbloqueado após um ciclo de energia. No entanto, uma vez desbloqueado e se o usuário permanecer em STATE_RUNNING_UNLOCKED , os trabalhos para o usuário poderão ser executados.