Gestione del sistema degli utenti in primo piano e in background

Nei dispositivi mobili Android, il supporto per più utenti consente agli utenti di funzionare in background (quando un altro utente è attivo) e in primo piano (noto anche come utente corrente). Per preservare le risorse quando opportuno, il sistema gestisce la chiusura degli utenti. È sempre richiesto un utente in primo piano .

A partire da Android 10, Android Automotive ha una configurazione predefinita che consente l'esecuzione di un massimo di tre utenti alla volta ( config_multiuserMaxRunningUsers ). Pertanto, oltre all'Utente del sistema headless (Utente 0), è possibile configurare solo un Utente in primo piano e un Utente in background.

  • In circostanze tipiche, l'utente corrente viene eseguito in primo piano e l'utente del sistema headless (Utente 0) viene eseguito in background. Una volta spostato in background, l'utente viene fermato ma non bloccato. Quando viene raggiunto il numero massimo di utenti, l'utente in background utilizzato meno di recente viene arrestato e bloccato ( config_multiuserDelayUserDataLocking ).
  • Sfondo interrotto e sbloccato Gli utenti vengono riavviati durante la modalità Garage .

Gli utenti guest sono temporanei e possono essere eseguiti solo in primo piano. Quando una persona esce dalla modalità Guest, l'utente Guest viene arrestato e non può essere eseguito in background.

Processi utente in background

Quando si verifica il passaggio dell'Utente dal primo piano allo sfondo (e viceversa), tutte le attività e i servizi in primo piano per quell'Utente vengono terminati. Ciò porta all'interruzione di tutti i servizi legati a tali servizi. Resta però ancora qualche pulizia. I servizi persistenti delle app di sistema originali e OEM continuano a essere eseguiti finché l'utente (ora in background) non viene interrotto.

I servizi persistenti sono più problematici poiché sono contenuti in un bucket ad alta priorità nel sistema di gestione Out of Memory (OOM) di Android. Anche se le app per l'utente in primo piano richiedono più memoria, i processi in background persistenti non vengono terminati. Di conseguenza, dal punto di vista dell'Utente in primo piano, i Servizi persistenti ritagliano permanentemente una certa quantità di memoria e tale memoria viene restituita solo quando una persona riavvia l'auto e gli eventuali Utenti in background vengono fermati.

Stato dell'utente

Un Utente è in uno stato arrestato ( STATE_SHUTDOWN ) finché non viene avviato. Se vengono impostate le credenziali utente (ad esempio un PIN), l'utente Android viene eseguito ma rimane bloccato ( STATE_RUNNING_LOCKED ) finché una persona non sblocca la schermata di blocco per quell'utente. Quando l'Utente viene sbloccato, l'archivio crittografato delle sue credenziali viene decrittografato e le directory dei dati per quell'Utente diventano disponibili. Per il tipico cambio utente, l'utente in background non viene arrestato e rimane in esecuzione e sbloccato ( STATE_RUNNING_UNLOCKED ), una volta sbloccato.

Modalità Garage, JobScheduler e aggiornamenti delle app per gli utenti

La tecnica consigliata per le app Automotive per aggiornare i dati consiste nell'utilizzare JobScheduler per pianificare i lavori da eseguire quando un dispositivo è nello stato inattivo, tramite la modalità Garage (ad esempio, il download degli aggiornamenti delle app da Google Play Store). Dopo che le app hanno registrato i lavori con JobScheduler e JobSchedulerService, i lavori vengono eseguiti quando possibile.

CarService invia un segnale a JobSchedulerService per attivare i processi impostati per l'esecuzione quando il dispositivo Automotive è inattivo tramite la modalità Garage. Affinché JobSchedulerService possa eseguire processi per gli utenti in background, tale utente deve essere nello stato STATE_RUNNING_UNLOCKED . I lavori in coda in JobSchedulerService vengono mantenuti e sopravvivono durante i cicli di accensione.

JobScheduler non può eseguire lavori per un utente specifico se l'utente non è mai stato sbloccato dopo un ciclo di accensione. Tuttavia, una volta sbloccato e se l'utente rimane in STATE_RUNNING_UNLOCKED , è possibile eseguire i lavori per l'utente.