在移动 Android 中,对多用户的支持使用户能够在后台(当另一个用户处于活动状态时)和前台(也称为当前用户)运行。为了在适当的时候节省资源,系统会管理用户的关闭。始终需要一个前台用户。
从 Android 10 开始,Android Automotive 具有默认配置,即仅允许最多三个用户同时运行 (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
状态,则可以为该用户运行作业。