普通 Android 用户会在其设备上安装 50 多个应用(随着设备 RAM 等级的提高,这个数字还会增加)。但是,其中相当一部分应用用户会在很长一段时间内不使用。
应用休眠会休眠用户几个月不使用的应用,类似于权限自动撤销。权限自动撤销也与此状态捆绑在一起,并且它们在设置中共享相同的豁免设置。强制停止的应用不会在后台运行作业或提醒,也无法发送推送通知。当用户再次使用该应用时,该应用会退出休眠状态,作业/提醒/通知会像往常一样再次运行。在应用进入休眠状态之前计划的任何作业/提醒/通知都需要重新安排。
修改平台的 OEM 可能会与应用休眠实现发生冲突。例如
- 修改应用使用情况定义或引入 AOSP 中没有的应用唤醒方式可能会中断应用休眠的准确性
- OEM 专有的限制机制(类似于应用休眠)可能会起到类似的作用。虽然两者可以共存,但可能存在一些重叠。
CDD 概述了一组基于应用使用情况的变更的新要求,类似于现有的 3.5.1 要求。应用休眠遵循这些要求。
框架代码位于
- repo: platform/frameworks/base
- 目录:services/core/java/com/android/server/apphibernation
政策逻辑位于
- repo: platform/packages/modules/Permission
- 目录:PermissionController/src/com/android/permissioncontroller/hibernation
高层架构
应用休眠系统服务可优化用户不常用的应用以节省存储空间,并阻止这些应用在后台运行。为了实现这些结果,当我们休眠应用时,我们会特别执行以下操作:
- 自动撤销权限
- 强制停止应用
- 删除 ODEX 和 VDEX 文件
- 删除应用缓存
我们的目标是将休眠实现为可逆操作,以便用户仍然可以通过启动器和其他界面访问应用,并且应用数据保持不变。启动应用后,我们将从强制停止状态恢复应用,并像往常一样继续创建 ODEX 和 VDEX 文件。
计划的设计围绕两个主要部分展开
- 确定何时应休眠软件包
- 优化休眠软件包
新的系统服务 AppHibernationService
和作业服务 AppHibernationJobService,
在 PermissionController
中,是将总体决策和逻辑控制在一起的粘合剂。
确定何时应休眠软件包主要由 UsageStatsService
提供支持,并由 PermissionController
中的 AppHibernationJobService
管理。此政策逻辑位于 PermissionController
中,以便我们能够通过 Mainline 动态更新。此外,我们计划添加一个新的信号(组件使用情况),以捕获软件包组件(例如,服务、内容提供程序)的使用情况,作为 UsageStatsService
中的新指标。
优化软件包是所有实际节省和优化的发生地。AppHibernationService
与系统的各个部分通信,以停止软件包、删除缓存数据、删除 ART 工件等。权限撤销直接从 AppHibernationJobService
发起,以在 Android 11 及更低版本的设备上保留自动撤销功能。
用户体验
用户可以获得关于哪些应用可以休眠的信息和控制权。
与自动撤销类似,用户会收到有关哪些应用已休眠的通知,并且可以选择直接从通知转到“设置”,以打开应用并使其退出休眠状态,或者在需要时删除未使用的应用。
我们将继续支持开发者要求用户通过现有的权限自动撤销豁免 Intent 豁免休眠的意图。
向后兼容性
特定于休眠的功能从 Android 12 开始提供。此功能无法在早期版本上运行,因为平台组件(例如,新的系统服务)不存在。自动撤销会继续按照为早期操作系统版本实现的方式运行。
从 Android 12 开始,为了确保向后兼容性,在设置中的应用和通知下的应用页面上添加了休眠切换开关,同时在权限子菜单中保留了原始的自动撤销切换开关。此切换开关控制应用的总体应用休眠系统豁免。
自定义
部分实现是模块化系统组件的一部分,因此不鼓励合作伙伴修改此功能。合作伙伴可以改为实现类似的功能,只要它们遵循 CDD 要求即可。
对于所有以 Android 11 或更高版本为目标平台的应用,应用休眠应默认设置为“开启”。这与权限自动撤销相同。虽然设置本身可能为“开启”,但应用休眠实现对于以 Android 11 为目标平台的应用与以 Android 12 为目标平台的应用可能有所不同。更具体地说,应用休眠仅适用于以 Android 11 为目标平台的应用,而对于以 Android 12 为目标平台的应用,它本质上只是自动撤销。
此外,OEM 可能会实现类似的功能。但是,这些功能的目标是在更短的时间尺度内进行电池优化,这可能是 OEM 特有的。OEM 开发的任何类似应用限制功能都可以与应用休眠系统共存,只要它们满足 CDD 中定义的现有标准即可。
测试
应用休眠具有 CTS 和单元测试,以确保其正常运行。
AutoRevokeTest
AppHibernationIntegrationTest