No Android móvel, o suporte para vários usuários permite que os usuários sejam executados em segundo plano (quando outro usuário está ativo) e em primeiro plano (também conhecido como usuário atual). Para conservar recursos quando apropriado, o sistema gerencia o desligamento de usuários. Um usuário em primeiro plano é sempre necessário .
A partir do Android 10, o Android Automotive tem uma configuração padrão que permite a execução de no máximo três usuários por vez ( config_multiuserMaxRunningUsers
). Portanto, além do usuário do sistema headless (Usuário 0), apenas um usuário em primeiro plano e um usuário 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 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
). - Fundo parado e desbloqueado Os usuários 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 Guest, o usuário convidado é interrompido e não pode ser executado em segundo plano.
Processos de 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 desse Usuário são encerrados. Isto leva à paralisação de todos os serviços vinculados a esses serviços. No entanto, alguma limpeza permanece. Os serviços persistentes de aplicativos de sistema primários e OEM continuam em execução 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 intervalo 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 em primeiro plano, os serviços persistentes ocupam permanentemente uma certa quantidade de memória e essa memória é retornada somente quando uma pessoa reinicia o carro e quaisquer usuários em segundo plano são interrompidos.
Estado do usuário
Um usuário está em um estado parado ( STATE_SHUTDOWN
) até que 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 desse usuário. Quando o Usuário é desbloqueado, seu armazenamento criptografado de credenciais é descriptografado e os diretórios de dados desse Usuário ficam disponíveis. Para uma 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.
Modo Garagem, JobScheduler e atualizações de aplicativos para usuários
A técnica recomendada para aplicativos automotivos atualizarem dados é usar JobScheduler para agendar trabalhos para serem executados quando um dispositivo estiver no estado inativo, 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 configurados para execução 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 após ciclos de energia.
JobScheduler não poderá executar trabalhos para um usuário específico se o usuário nunca tiver sido 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.