Control del sistema de usuario en primer y segundo plano

En Android para dispositivos móviles, la compatibilidad con varios usuarios permite que los usuarios se ejecuten en segundo plano (cuando otro usuario está activo) y en primer plano (también conocido como usuario actual). Para conservar recursos cuando corresponda, el sistema administra el apagado de los usuarios. Siempre se requiere un usuario en primer plano.

A partir de Android 10, Android Automotive tiene una configuración predeterminada que permite que se ejecuten solo un máximo de tres usuarios a la vez (config_multiuserMaxRunningUsers). Por lo tanto, además del usuario del sistema sin cabeza (usuario 0), solo se puede configurar un usuario en primer plano y uno en segundo plano.

  • En circunstancias normales, el usuario actual se ejecuta en primer plano y el usuario del sistema sin cabeza (usuario 0) se ejecuta en segundo plano. Cuando se mueve un usuario al segundo plano, se detiene, pero no se bloquea. Cuando se alcanza la cantidad máxima de usuarios, se detiene y se bloquea (config_multiuserDelayUserDataLocking) el usuario en segundo plano que se usó menos recientemente.
  • Los usuarios en segundo plano detenidos y desbloqueados se reinician durante el modo de garaje.

Los usuarios invitados son efímeros y solo se pueden ejecutar en primer plano. Cuando una persona deja de ser invitado, el usuario invitado se detiene y no se puede ejecutar en segundo plano.

Procesos en segundo plano del usuario

Cuando se cambia un usuario de primer plano a segundo plano (y viceversa), se cancelan todas las actividades y los servicios en primer plano de ese usuario. Esto detiene todos los servicios vinculados desde esos servicios. Sin embargo, aún queda algo de limpieza. Los servicios persistentes de las apps del sistema propias y del OEM siguen ejecutándose mientras no se detenga el usuario (ahora en segundo plano).

Los servicios persistentes son más problemáticos, ya que se encuentran en un bucket de alta prioridad en el sistema de administración de falta de memoria (OOM) de Android. Incluso si las apps para el usuario en primer plano requieren más memoria, esos procesos en segundo plano persistentes no se cancelan. Como resultado, desde el punto de vista del usuario en primer plano, los servicios persistentes reservan de forma permanente una cantidad de memoria, y esa memoria se muestra solo cuando una persona reinicia el automóvil y se detienen los usuarios en segundo plano.

Estado del usuario

Un usuario se encuentra en un estado detenido (STATE_SHUTDOWN) hasta que se inicia. Si se establece una credencial de usuario (como un PIN), el usuario de Android se ejecuta, pero permanece bloqueado (STATE_RUNNING_LOCKED) hasta que una persona desbloquea la pantalla de bloqueo de ese usuario. Cuando se desbloquea el usuario, se desencripta su almacenamiento encriptado por credenciales y los directorios de datos de ese usuario están disponibles. En el caso del cambio de usuario típico, el usuario en segundo plano no se detiene y permanece en ejecución y desbloqueado (STATE_RUNNING_UNLOCKED) una vez que se desbloquea.

Garage Mode, JobScheduler y actualizaciones de apps para los usuarios

La técnica recomendada para que las apps para vehículos actualicen datos es usar JobScheduler para programar trabajos que se ejecuten cuando un dispositivo esté inactivo, a través del modo de garaje (por ejemplo, descargar actualizaciones de apps desde Google Play). Después de que las apps registran trabajos con JobScheduler y JobSchedulerService, los trabajos se ejecutan cuando es posible.

CarService envía una señal a JobSchedulerService para activar las tareas configuradas para ejecutarse cuando el dispositivo Automotive está inactivo a través del modo de garaje. Para que JobSchedulerService ejecute trabajos para un usuario en segundo plano, este debe estar en el estado STATE_RUNNING_UNLOCKED. Los trabajos en fila en JobSchedulerService se conservan y sobreviven a los ciclos de energía.

JobScheduler no puede ejecutar tareas para un usuario específico si este nunca se desbloqueó después de un ciclo de encendido. Sin embargo, cuando el usuario está desbloqueado y permanece en STATE_RUNNING_UNLOCKED, se pueden ejecutar tareas para el usuario.