电源管理

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

电源管理功能分为两类

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

应用待机分组

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

五个分组按以下特征对应用进行优先级排序

活动

如果用户当前正在使用应用,则该应用位于活动分组中,例如:

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

如果应用位于活动分组中,则系统不会对其作业、警报或 FCM 消息施加任何限制。

工作集

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

如果应用位于工作集中,则系统会对其运行作业和触发警报的能力施加轻微限制。详情请参阅 电源管理限制

频繁

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

如果应用位于频繁分组中,则系统会对其运行作业和触发警报的能力施加更严格的限制,还会对高优先级 FCM 消息设置上限。详情请参阅 电源管理限制

稀少

如果应用不经常使用,则该应用位于稀少分组中。例如,用户仅在入住该酒店期间运行的酒店应用可能位于稀少分组中。

如果应用位于稀少分组中,则系统会对其运行作业、触发警报和接收高优先级 FCM 消息的能力施加严格限制。系统还会限制应用连接互联网的能力。详情请参阅 电源管理限制

从不

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

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

每个厂商都可以设定自己的标准来决定非活跃应用如何分配到不同的分组。你不应该试图影响你的应用被分配到哪个分组。相反,应该专注于确保你的应用在任何分组中都能正常运行。你的应用可以通过调用新的方法UsageStatsManager.getAppStandbyBucket()来了解它当前属于哪个分组。

最佳实践

如果你的应用已经遵循了Doze 和应用待机的最佳实践,那么处理新的电源管理功能应该不会很困难。但是,一些以前运行良好的应用行为现在可能会导致问题。

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

    注意:如果用户反复取消通知,系统会给用户一个选项,以便将来阻止该通知。不要仅仅为了试图让你的应用保持在活跃分组而向用户发送垃圾通知!

  • 如果应用分散在多个包中,这些包可能位于不同的分组中,因此具有不同的访问级别。你应该确保在将包分配到各种分组后测试这些应用,以确保应用正常运行。

省电模式改进

Android 9 对省电模式进行了一些改进。设备制造商决定施加的精确限制。例如,在 AOSP 版本上,系统应用以下限制

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

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

与以往一样,最好在省电模式处于活动状态时测试你的应用。你可以通过设备的设置 > 省电模式屏幕手动打开省电模式。

测试和故障排除

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

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

Android 调试桥命令

你可以使用Android 调试桥 shell 命令来测试几个电源管理功能。

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

应用待机分组

你可以使用 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