前台和后台用户系统处理

在移动 Android 中,对多个用户的支持使用户能够在后台(当另一个用户处于活动状态时)和前台(也称为当前用户)运行。为了尽量节省资源,系统会管理用户关机事宜。始终要求有一个前台用户。

从 Android 10 开始,Android Automotive 的默认配置最多只允许三 (3) 个用户同时运行 (config_multiuserMaxRunningUsers)。因此,除了无头系统用户(用户 0)之外,只可以配置一个前台用户和一个后台用户。

  • 通常,当前用户在前台运行,无头系统用户(用户 0)在后台运行。一旦用户进入后台,系统就会停用该用户,但不会锁定该用户。一旦达到最大用户数,系统就会停用并锁定使用时间最早的后台用户 (config_multiuserDelayUserDataLocking)。
  • 系统会在车库模式下重启已停用但未锁定的后台用户。

访客用户是临时用户,只能在前台运行。一旦用户退出访客模式,系统就会停用该访客用户,该访客用户便无法在后台运行。

后台用户进程

一旦用户从前台切换到后台(反之亦然),系统就会终止该用户的所有 activity 和前台服务,继而停用与这些服务绑定的所有服务。但是,一些清理服务会继续运行。 只要系统未停用当前在后台运行的用户,第一方和 OEM 系统应用的持久性服务就会继续运行。

由于持久性服务包含在 Android 内存不足 (OOM) 管理系统的高优先级存储分区中,因此这些服务更易出现问题。即使面向前台用户的应用需要更多内存,系统也不会终止这些持久性后台进程。因此,从前台用户的角度来看,持久性服务会永久地占用一定数量的内存,并且只有在用户重新启动汽车且系统停用任何后台用户时,系统才会释放该内存。

用户状态

用户处于停用状态 (STATE_SHUTDOWN),直到系统启用该用户。如果系统设置了用户凭据(如 PIN 码),Android 用户会运行但保持锁定状态 (STATE_RUNNING_LOCKED),直至该用户的锁屏被解锁。一旦解锁,用户的凭据加密存储空间将被解密,并且该用户的数据目录将变为可用。在典型的用户切换情况下,系统不会停用后台用户,该用户一经解锁即保持运行状态和解锁状态 (STATE_RUNNING_UNLOCKED)。

面向用户的车库模式、JobScheduler 和应用更新

对于 Automotive 应用,更新数据的推荐方法如下:在车库模式下,使用 JobScheduler 预定在设备处于空闲状态时运行的作业(例如,从 Google Play 商店下载应用更新)。一旦应用向 JobScheduler 和 JobSchedulerService 注册作业,系统就会尽量运行这些作业。

CarService 会向 JobSchedulerService 发送信号,以便在车库模式下触发作业,这些作业设置为在 Automotive 设备处于空闲状态时运行。为了使 JobSchedulerService 能够为后台用户运行作业,该用户必须处于 STATE_RUNNING_UNLOCKED 状态。已加入 JobSchedulerService 队列的作业会保留下来,并且在重启后继续存在。

如果系统在重启后未解锁特定用户,JobScheduler 将无法为该用户运行作业。但是,一经解锁,并且用户保持为 STATE_RUNNING_UNLOCKED,就可以为该用户运行作业。