电源管理

Android 9 (API 级别 28) 引入了新功能以改进设备电源管理。这些更改以及之前版本中已有的功能,有助于确保系统资源分配给最需要的应用。

电源管理功能分为两类:

应用待机分组
系统根据用户的用量模式限制应用对 CPU 或电池等设备资源的访问。这是 Android 9 的新功能。
省电模式改进
当省电模式开启时,系统会对所有应用施加限制。这是 Android 9 中改进的现有功能。

应用待机分组

Android 9 引入了一项新的电池管理功能:应用待机分组。应用待机分组有助于系统根据应用最近和频繁的使用情况来确定应用请求资源的优先级。根据应用的使用模式,每个应用被放置在五个优先级分组之一。系统根据应用所在的分组,限制每个应用可用的设备资源。

这五个分组根据以下特征对应用进行优先级排序:

活跃

如果用户当前正在使用该应用,则该应用处于活跃分组,例如:

  • 应用已启动 Activity
  • 应用正在运行前台服务
  • 应用具有与前台应用使用的内容提供程序关联的同步适配器
  • 用户点击了来自应用的通知

如果应用处于活跃分组,系统不会对应用的作业、闹钟或 FCM 消息施加任何限制。

工作集

如果应用经常运行但当前不活跃,则该应用处于工作集分组。例如,用户每天启动的大多数社交媒体应用很可能处于工作集分组。如果应用被间接使用,也会被提升到工作集分组。

如果应用处于工作集分组,系统对其运行作业和触发闹钟的能力施加轻微限制。有关详细信息,请参阅电源管理限制

常用

如果应用定期使用,但不一定每天使用,则该应用处于常用分组。例如,用户在健身房运行的健身追踪应用可能处于常用分组。

如果应用处于常用分组,系统对其运行作业和触发闹钟的能力施加更严格的限制,并对高优先级 FCM 消息施加上限。有关详细信息,请参阅电源管理限制

不常用

如果应用不常使用,则该应用处于不常用分组。例如,用户仅在入住酒店时运行的酒店应用可能处于不常用分组。

如果应用处于不常用分组,系统对其运行作业、触发闹钟和接收高优先级 FCM 消息的能力施加严格限制。系统还限制应用连接到互联网的能力。有关详细信息,请参阅电源管理限制

从不

已安装但从未运行过的应用被分配到从不分组。系统对这些应用施加严格限制。

系统动态地将每个应用分配到一个优先级分组,并根据需要重新分配应用。系统可能会依赖一个预加载的应用,该应用使用机器学习来确定每个应用的预期使用频率,并将应用分配到适当的分组。如果设备上不存在系统应用,系统默认根据应用最近的使用情况对应用进行排序。更活跃的应用被分配到优先级更高的分组,从而使应用可用的系统资源更多。特别是,分组决定了应用作业的运行频率、应用触发闹钟的频率,以及应用接收高优先级 Firebase 云消息传递 (FCM) 消息的频率。这些限制仅在设备依靠电池供电时适用;设备充电时,系统不会对应用施加这些限制。

每个制造商都可以设置自己的非活跃应用分配到分组的标准。您不应尝试影响您的应用被分配到哪个分组。相反,请专注于确保您的应用在任何分组中都能良好运行。您的应用可以通过调用新方法 UsageStatsManager.getAppStandbyBucket() 来查询它当前处于哪个分组。

最佳实践

如果您的应用已遵循打盹模式和应用待机的最佳实践,那么处理新的电源管理功能应该不会太难。然而,以前运行良好的某些应用行为现在可能会导致问题。

  • 不要试图操纵系统将您的应用放入某个分组。系统的分组方法可能会改变,并且每个设备制造商都可以选择编写自己的分组应用及其自己的算法。相反,请确保您的应用无论在哪个分组中都能正常运行。
  • 如果应用没有启动 Activity,它可能永远不会被提升到活跃分组。您可能需要重新设计您的应用,使其包含此类 Activity。
  • 如果应用的通知不可操作,用户将无法通过与通知交互来触发应用提升到活跃分组。在这种情况下,您可能需要重新设计一些合适的通知,以便它们允许用户响应。有关一些指导,请参阅 Material Design 通知设计模式
  • 同样,如果应用在收到高优先级 FCM 消息时没有显示通知,它将不会给用户与应用交互的机会,从而无法将其提升到活跃分组。事实上,高优先级 FCM 消息的唯一预期用途是向用户推送通知,因此这种情况不应发生。如果您在 FCM 消息不触发用户交互时错误地将其标记为高优先级,可能会导致其他负面后果;例如,它可能导致您的应用耗尽配额,从而导致真正紧急的 FCM 消息被视为普通优先级。

    注意:如果用户反复关闭通知,系统会给用户选择将来阻止该通知的选项。不要为了让您的应用保持在活跃分组而向用户发送垃圾通知!

  • 如果应用拆分为多个包,这些包可能处于不同的分组,因此具有不同的访问级别。您应确保在将包分配到不同分组的情况下测试此类应用,以确保应用正常运行。

省电模式改进

Android 9 对省电模式进行了一系列改进。设备制造商确定施加的精确限制。例如,在 AOSP 构建中,系统应用以下限制:

  • 系统更积极地将应用置于应用待机模式,而不是等待应用空闲。
  • 后台执行限制适用于所有应用,无论其目标 API 级别如何。
  • 当屏幕关闭时,定位服务可能会被禁用。
  • 后台应用无法访问网络。

此外,还有其他特定于设备的电源优化。有关完整详细信息,请参阅描述电源管理限制的页面

一如既往,在省电模式激活时测试您的应用是个好主意。您可以通过设备的 Settings > Battery Saver(设置 > 省电模式)屏幕手动开启省电模式。

测试与问题排查

新的电源管理功能会影响在 Android 9 设备上运行的所有应用,无论这些应用是否以 Android 9 为目标。确保您的应用在这些设备上正常运行至关重要。

务必在各种条件下测试您的应用的主要用例,以了解电源管理功能如何相互作用。您可以使用 Android Debug Bridge 命令来开启和关闭某些功能。

Android Debug Bridge 命令

您可以使用 Android Debug Bridge shell 命令来测试多项电源管理功能。

有关使用 ADB 将设备置于打盹模式的信息,请参阅使用打盹模式和应用待机进行测试

应用待机分组

您可以使用 ADB 手动将您的应用分配到应用待机分组。要更改应用的所属分组,请使用以下命令:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

您也可以使用该命令一次设置多个包:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

要检查应用处于哪个分组,请运行:

$ adb shell am get-standby-bucket [packagename]

如果您未传递 packagename 参数,则该命令会列出所有应用的所属分组。应用也可以通过调用新方法 UsageStatsManager.getAppStandbyBucket() 在运行时查询其所属分组。

省电模式

有几个命令可以测试您的应用在低电量条件下的行为。

要模拟设备断开电源,请使用以下命令:

$ adb shell dumpsys battery unplug

要测试设备在低电量条件下的行为,请使用以下命令:

$ adb shell settings put global low_power 1

完成测试后,您可以使用以下命令撤销您的手动设备设置:

$ adb shell dumpsys battery reset