应用休眠

一个普通的 Android 用户在他们的设备上安装了 50 多个应用程序(随着设备 RAM 层的增加,这个数字也会增加)。但是,这些应用程序中的很大一部分在很长一段时间内都未被用户使用。

应用休眠使用户几个月不使用的应用休眠,类似于权限自动撤销。这会强制停止应用程序并将其置于我们优化存储而不是性能的状态。权限自动撤销也与此状态捆绑在一起,它们在Settings 中共享相同的豁免设置。强制停止的应用程序不会在后台运行作业或警报,也无法发送推送通知。当用户再次使用应用程序时,应用程序退出休眠状态,作业/警报/通知再次照常运行。在应用程序进入休眠状态之前安排的任何作业/警报/通知都需要重新安排。

修改平台的 OEM 可能会与应用休眠实现发生冲突。例如

  • 修改应用程序使用定义或引入唤醒不在 AOSP 中的应用程序的方法可能会中断应用程序休眠的准确性
  • 类似于应用程序休眠的 OEM 专有限制机制可能会执行类似的目的。虽然两者都可以存在,但可能会有一些重叠。

CDD 概述了一组基于应用程序使用情况的更改的新要求,类似于现有的3.5.1要求。应用休眠遵循这些要求。

框架代码位于:

策略逻辑存在于:

  • 回购:平台/包/模块/权限
  • 目录:PermissionController/src/com/android/permissioncontroller/hibernation

高层架构

应用休眠系统服务会优化用户不常用的应用程序以进行存储,并防止这些应用程序在后台运行。为了实现这些结果,当我们休眠一个应用程序时,我们专门:

  • 自动撤销权限
  • 强制停止应用程序
  • 删除 ODEX 和 VDEX 文件
  • 删除应用缓存

我们的目标是将休眠实现为可逆操作,以便用户仍可通过 Launcher 和其他界面使用应用程序,并且应用程序数据完好无损。启动应用程序后,我们会将其从强制停止状态恢复,并像往常一样继续创建 ODEX 和 VDEX 文件。

计划中的设计围绕两个主要部分:

  • 确定包何时休眠
  • 优化休眠包

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

确定包何时应该休眠主要由UsageStatsService提供支持,并由PermissionController中的AppHibernationJobService管理。这个策略逻辑存在于PermissionController中,允许我们通过 Mainline 动态更新。此外,我们计划在UsageStatsService中添加一个新信号组件使用情况,以捕获包组件(例如,服务、内容提供者)的使用情况作为新指标。

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

用户体验

向用户提供信息和控制哪些应用程序可以休眠。

与自动撤销类似,用户会收到有关哪些应用程序处于休眠状态的通知,并且可以选择直接从通知中转到“设置”以打开应用程序并使其退出休眠状态,或者在需要时删除未使用的应用程序。

我们继续支持开发人员通过现有权限自动撤销豁免意图请求用户免于休眠的意图。

向后兼容性

从 Android 12 开始提供特定于休眠的功能。这些功能无法在早期版本上运行,因为不存在平台组件(例如新的系统服务)。 Auto-revoke 将继续按照当前为早期操作系统版本实施的功能运行。

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

定制

由于某些实现是模块化系统组件的一部分,因此不鼓励合作伙伴修改该功能。合作伙伴可以改为实施类似的特性/功能,只要他们遵循 CDD 要求。

对于面向 Android 11 或更高版本的所有应用,应用休眠应默认为开启。这与权限自动撤销相同。虽然设置本身可能已开启,但针对 Android 11 和 Android 12 的应用之间的应用休眠实现可能会有所不同。更具体地说,应用休眠仅适用于针对 Android 11 的应用,而它本质上只是自动撤销针对 Android 12 的应用。

此外,OEM 可能正在实施类似的功能。但是,这些功能的目标是在更短的时间内进行电池优化,这可能是 OEM 特定的。只要符合CDD中定义的现有标准,OEM 开发的任何类似应用程序限制功能都可以与应用程序休眠系统共存。

测试

应用休眠具有 CTS 和单元测试,以确保其正常工作。