Обработка пользовательской системы на переднем и заднем плане

В мобильном Android поддержка нескольких пользователей позволяет пользователям работать в фоновом режиме (когда активен другой пользователь) и на переднем плане (также известном как текущий пользователь ). Чтобы сэкономить ресурсы, когда это необходимо, система управляет отключением пользователей. Всегда требуется один основной пользователь .

Начиная с Android 10, Android Automotive имеет конфигурацию по умолчанию, позволяющую одновременно работать не более трем пользователям ( config_multiuserMaxRunningUsers ). Таким образом, помимо пользователя безголовой системы (Пользователь 0), можно настроить только одного пользователя на переднем плане и одного пользователя на заднем плане.

  • В типичных обстоятельствах текущий пользователь работает на переднем плане, а пользователь автономной системы (Пользователь 0) — в фоновом режиме. Когда пользователь перемещается в фоновый режим, он останавливается, но не блокируется. При достижении максимального числа пользователей фоновый пользователь, использовавшийся последним, останавливается и блокируется ( config_multiuserDelayUserDataLocking ).
  • Остановленные и разблокированные фоновые пользователи перезапускаются в режиме гаража .

Гостевые пользователи являются эфемерными и могут работать только на переднем плане. Когда человек выходит из гостевого режима, гостевой пользователь останавливается и не может работать в фоновом режиме.

Фоновые пользовательские процессы

Когда пользователь переключается с переднего плана на фоновый (и наоборот), все действия и службы переднего плана для этого пользователя прекращаются. Это останавливает все службы, связанные с этими службами. Тем не менее, некоторая очистка остается. Постоянные службы сторонних и OEM-системных приложений продолжают работать до тех пор, пока пользователь (теперь фоновый) не остановлен.

Постоянные службы являются более проблематичными, поскольку эти службы содержатся в сегменте с высоким приоритетом в системе управления нехваткой памяти (OOM) Android. Даже если приложениям для пользователя на переднем плане требуется больше памяти, эти постоянные фоновые процессы не завершаются. В результате, с точки зрения пользователя на переднем плане, постоянные службы постоянно выделяют некоторый объем памяти, и эта память возвращается только тогда, когда человек перезагружает автомобиль и все фоновые пользователи останавливаются.

Состояние пользователя

Пользователь находится в остановленном состоянии ( STATE_SHUTDOWN ) до тех пор, пока он не будет запущен. Если установлены учетные данные пользователя (например, ПИН-код), пользователь Android запускается, но остается заблокированным ( STATE_RUNNING_LOCKED ), пока человек не разблокирует экран блокировки для этого пользователя. Когда пользователь разблокирован, его зашифрованное хранилище учетных данных расшифровывается и каталоги данных этого пользователя становятся доступными. При типичном переключении пользователей фоновый пользователь не останавливается и продолжает работать и разблокирован ( STATE_RUNNING_UNLOCKED ) после разблокировки.

Режим гаража, JobScheduler и обновления приложений для пользователей

Рекомендуемый метод обновления данных автомобильных приложений — использовать JobScheduler для планирования выполнения заданий, когда устройство находится в состоянии ожидания, через режим гаража (например, загрузка обновлений приложения из Google Play). После того как приложения регистрируют задания с помощью JobScheduler и JobSchedulerService , задания выполняются, когда это возможно.

CarService отправляет сигнал JobSchedulerService для запуска заданий, которые должны выполняться, когда автомобильное устройство находится в режиме ожидания в режиме гаража. Чтобы JobSchedulerService мог запускать задания для фонового пользователя, этот пользователь должен находиться в состоянии STATE_RUNNING_UNLOCKED . Задания, поставленные в очередь в JobSchedulerService сохраняются и сохраняются в течение нескольких циклов включения.

JobScheduler не может запускать задания для конкретного пользователя, если пользователь не был разблокирован после выключения и включения питания. Однако, когда пользователь разблокирован и он остается в состоянии STATE_RUNNING_UNLOCKED , задания для пользователя могут выполняться.