Gestione del sistema utente in primo piano e in background

Nei dispositivi mobili di Android, il supporto di più utenti consente agli utenti di eseguire in background (quando un altro utente è attivo) e in primo piano (noti anche come l'utente corrente). Per risparmiare risorse quando appropriato, il sistema gestisce la chiusura degli utenti. È sempre necessario un utente in primo piano.

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

  • In circostanze tipiche, l'utente corrente viene eseguito in primo piano e l'utente di sistema headless (utente 0) viene eseguito in background. Quando un utente visualizza spostato in background, l'utente viene arrestato ma non bloccato. Quando il valore massimo di utenti viene raggiunto, l'utente in background utilizzato meno di recente viene interrotto bloccato (config_multiuserDelayUserDataLocking).
  • Gli utenti in background fermi e sbloccati vengono riavviati durante la modalità Garage.

Gli utenti ospiti sono effimeri e possono essere eseguiti solo in primo piano. Quando una persona esce dal profilo ospite, l'utente ospite viene interrotto e non può essere eseguito in background.

Processi utente in background

Quando un utente passa dal primo piano allo sfondo (e viceversa), tutte le attività e i servizi in primo piano per quell'utente vengono interrotti. In questo modo vengono interrotti tutti i servizi collegati da questi servizi. Tuttavia, rimangono alcuni aspetti da sistemare. I servizi permanenti delle app di sistema proprietarie e OEM continuano a funzionare finché l'utente (ora in background) non viene interrotto.

I servizi permanenti sono più problematici, in quanto i servizi sono contenuti in un bucket ad alta priorità della rete OOM (Out of Memory) di Android completamente gestito di Google. Anche se le app per l'utente in primo piano richiedono più memoria, quelle e i processi in background non vengono interrotti. Di conseguenza, dall'interfaccia utente punto di vista, i servizi permanenti liberano definitivamente una certa quantità di memoria la memoria viene restituita solo quando una persona riavvia l'auto e viene restituito di utenti vengono interrotti.

Stato dell'utente

Un utente è in stato di fermata (STATE_SHUTDOWN) finché non viene avviato. Se si imposta una credenziale utente (ad esempio un PIN), l'utente Android esegue ma rimane bloccato (STATE_RUNNING_LOCKED) finché una persona non sblocca la schermata di blocco per quell'utente. Quando l'utente viene sbloccato, il suo spazio di archiviazione con crittografia con credenziali viene decriptato e le directory dei dati per quell'utente diventano disponibili. Per il tipico passaggio di utenti, l'utente in background non viene interrotto 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 per auto e motori per aggiornare i dati è utilizzare JobScheduler per pianificare l'esecuzione dei job quando un dispositivo è in stato inattivo, tramite la modalità Garage (ad esempio, il download degli aggiornamenti delle app da Google Play). Dopo che le app hanno registrato i job con JobScheduler e JobSchedulerService, i job vengono eseguiti quando possibile.

CarService invia un segnale a JobSchedulerService per attivare i job impostati per l'esecuzione Quando il dispositivo Automotive è inattivo con la modalità Garage. Affinché JobSchedulerService esegua job per un utente in background, questo deve essere nello stato STATE_RUNNING_UNLOCKED. Job in coda in JobSchedulerService sono persistenti e sopravvivono attraverso i cicli di spegnimento e riaccensione.

JobScheduler non può eseguire job per un utente specifico se l'utente non è mai stato sbloccato dopo un ciclo di alimentazione. Tuttavia, quando l'utente è sbloccato e se rimane in STATE_RUNNING_UNLOCKED, è possibile eseguire job per l'utente.