应用休眠

Android 用户在设备上安装的应用达到平均每人 50 多款(随着设备 RAM 层级的提高,该数量还在继续增加)。不过,其中相当多的应用很长时间都不会用到。

应用休眠可以让用户连续几个月不使用的应用休眠,与权限自动撤消类似。这会强行停止应用,并将其置于我们针对存储空间而非性能进行优化的状态。权限自动撤消也与此状态捆绑,并且它们在设置中具有相同的豁免设置。强行停止的应用不会在后台运行作业或发出提醒,也无法发送推送通知。当用户重新使用该应用时,它会退出休眠状态,并照常运行作业、发出提醒和发送通知。您需要重新调度在应用进入休眠状态之前调度的所有作业/提醒/通知。

修改平台的原始设备制造商 (OEM) 可能会与应用休眠实现冲突,例如:

  • 修改应用使用情况定义或引入不在 AOSP 中的应用唤醒方法,可能会妨碍应用休眠的准确性
  • OEM 的专有限制机制(与应用休眠类似)可能具有类似的作用。虽然两者可以同时存在,但可能存在一些重叠。

针对基于应用使用情况进行的更改,CDD 概述了一组新的要求,与现有的 3.5.1 要求类似。应用休眠符合这些要求。

框架代码位于:

政策逻辑位于:

  • 代码库:platform/packages/modules/Permission
  • 目录:PermissionController/src/com/android/permissioncontroller/hibernation

高级架构

应用休眠系统服务可优化用户不常用的应用以节省存储空间,并能阻止这些应用在后台运行。为了实现这些结果,当应用休眠时,我们会执行以下具体操作:

  • 自动撤消权限
  • 强行停止应用
  • 删除 ODEX 文件和 VDEX 文件
  • 删除应用缓存

我们的目标是实现可逆转的休眠,让用户仍能通过启动器和其他途径访问应用,同时确保应用数据完好无损。应用一启动,我们就会将它从强行停止状态中恢复过来,继续像往常一样创建 ODEX 和 VDEX 文件。

规划的设计主要围绕以下两个部分展开:

  • 确定软件包何时应休眠
  • 优化休眠中的软件包

PermissionController 中的新系统服务 AppHibernationService 和作业服务 AppHibernationJobService, 是用于控制整体决策和逻辑的粘合剂。

确定软件包何时应休眠的机制主要由 UsageStatsService 驱动,并由 PermissionController 中的 AppHibernationJobService 管理。此政策逻辑位于 PermissionController 中,这样我们就能通过 Mainline 动态更新。此外,我们计划添加一个新的信号,即组件使用情况,作为 UsageStatsService 中的新指标,用于捕获软件包组件(例如,服务、content provider)的使用情况。

优化软件包是所有资源节省和优化操作实际发生的环节。AppHibernationService 与系统的各个部分通信,以停止软件包、删除缓存数据、删除 ART 工件等。 权限撤消直接从 AppHibernationJobService 启动,以在 Android 11 及更低版本的设备上保留自动撤消功能。

用户体验

我们为用户提供信息,并让他们自己控制可休眠哪些应用。

与自动撤消功能相似,用户会收到哪些应用已被休眠的通知,并可以直接从通知中转到“设置”,然后打开应用,将它从休眠中唤醒,或在必要时删除不用的应用。

我们仍然支持开发者通过现有的权限自动撤消豁免 intent 来请求用户豁免休眠。

向后兼容性

Android 12 及更高版本可提供与休眠相关的功能。此功能不适用于更早的版本,原因是缺少平台组件(例如新系统服务)。在较早的 OS 版本中,权限自动撤消功能仍然可用,实现方式与现有方式无异。

从 Android 12 开始,为确保向后兼容性,我们在设置中的应用和通知下的相应应用页面中添加了休眠切换开关,同时在权限子菜单中保留了原有的自动撤消切换开关。此切换开关可以控制应用的整体应用休眠系统豁免。

自定义

由于部分实现是模块化系统组件的一部分,因此不建议合作伙伴修改该功能。只要合作伙伴遵循 CDD 要求,就可以实现类似的功能。

对于以 Android 11 或更高版本为目标平台的所有应用,应用休眠功能应默认处于“启用”状态。这与权限自动撤消相同。虽然此设置本身可能处于“启用”状态,但以 Android 11 和 Android 12 为目标平台的应用之间的应用休眠实现可能有所不同。更具体地说,应用休眠功能仅适用于以 Android 11 为目标平台的应用,而对于以 Android 12 为目标平台的应用,它实质上只是自动撤消功能。

此外,OEM 可能会实现类似的功能。不过,OEM 开发这些功能是为了实现特定的电池优化,监控的时长范围要短得多。OEM 开发的任何类似应用限制功能都可以与应用休眠系统共存,只要它们符合 CDD 中定义的现有条件即可。

测试

应用休眠功能具有 CTS 和单元测试,可用于确保它能够正常工作。