电源管理

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

电源管理功能可以分为两个类别:

应用待机存储分区
系统会根据用户的使用模式限制应用对 CPU 或电池等设备资源的访问。这是 Android 9 的一项新功能。
省电模式改进
开启省电模式后,系统会对所有应用施加限制。这是一项现有功能,在 Android 9 中得到了改进。

应用待机分桶

Android 9 引入了新的电池管理功能,即应用待机存储分区。应用待机分桶有助于系统根据应用的使用时间新近度和使用频率来确定应用资源请求的优先级。根据应用使用模式,每个应用都会放置在五个优先级分桶之一中。系统会根据应用所在的分桶限制每个应用可用的设备资源。

五个群组按照以下特性将应用分组:

活跃

如果用户当前正在使用应用,则该应用位于“活跃”分桶中,例如:

  • 该应用启动了一个 activity
  • 该应用正在运行一项前台服务
  • 该应用具有与前台应用使用的 content provider 相关联的同步适配器
  • 用户点按了应用通知

如果应用位于“活跃”分桶中,系统不会对应用的作业、警报或 FCM 消息施加任何限制。

工作集

如果应用经常运行,但当前未处于活跃状态,则会被分配到“工作集”分桶中。例如,用户多数时候都会启动的社交媒体应用可能位于“工作集”分桶中。如果以间接的方式使用,应用也会被提升到“工作集”分桶。

如果某个应用位于“工作集”分桶中,系统会对其运行作业和触发 alarm 的能力施加轻度限制。如需了解详情,请参阅电源管理限制

常用

如果某个应用会定期使用,但不一定每天使用,该应用将位于“常用”分桶中。例如,用户在健身房运行的锻炼跟踪应用可能位于“常用”分桶中。

如果某个应用位于“常用”分桶中,系统会对其运行作业和触发闹钟的能力施加较高的限制,还会对高优先级 FCM 消息施加上限。如需了解详情,请参阅电源管理限制

极少使用

不经常使用的应用会被分配到“极少使用”分桶中。例如,用户仅在入住酒店期间才会运行的某个酒店应用就可能位于“极少使用”分桶中。

如果某个应用位于“极少使用”分桶中,系统会对其运行作业、触发警报以及接收高优先级 FCM 消息的能力施加严格的限制。系统还会限制应用连接到互联网的能力。如需了解详情,请参阅电源管理限制

永不

已安装但从未运行过的应用会被分配到“永不”存储分区。系统会对这些应用施加极强的限制。

系统会动态地将每个应用分配到优先级分桶,并根据需要重新分配应用。系统可能依赖于某个预加载的应用,该应用使用机器学习技术判断每个应用将被使用的可能性,并将应用分配到相应的分桶。如果设备上没有该系统应用,系统默认会根据应用的使用时间新近度对应用进行排序。系统会将更活跃的应用分配到为应用提供更高优先级的分桶,从而为应用提供更多系统资源。具体而言,分桶决定了应用的作业运行频率、应用触发闹钟的频率,以及应用可以接收高优先级 Firebase Cloud Messaging (FCM) 消息的频率。 这些限制仅适用于设备使用电池供电的情况;在设备充电时,系统不会对应用施加这些限制。

每个制造商都可以针对将非活跃应用分配到分桶的方式设定自己的标准。您不应尝试影响应用分配到哪个分桶,而应专注于确保您的应用在可能处于的任何分桶中都运行良好。您的应用可以通过调用新方法 UsageStatsManager.getAppStandbyBucket() 查明其当前所在的分桶。

最佳实践

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

  • 请勿试图迫使系统将您的应用放到某个存储分区中。系统的分桶方法可能会发生变化,并且每个设备制造商都可以选择使用自己的算法编写自己的分桶应用。请改为确保应用无论位于哪个分桶都运行正常。
  • 没有启动器 activity 的应用可能永远不会被提升到“活跃”分桶。您可能需要重新设计应用,使其具有此类 activity。
  • 如果应用的通知不可操作,用户将无法通过与通知互动来触发应用提升到“活跃”分桶。在这种情况下,您可能需要重新设计一些适当的通知,使其允许用户响应。如需了解一些相关准则,请参阅 Material Design 通知设计模式
  • 同样,如果应用在收到高优先级 FCM 消息时不显示通知,用户也没有机会与应用互动并导致应用被提升到“活跃”分桶。事实上,高优先级 FCM 消息的唯一预期用途就是向用户推送通知,因此这种情况绝不应发生。如果您在某条不会触发用户互动的 FCM 消息中不当地将其标记为高优先级,则可能会导致其他不良后果;例如,这可能导致您的应用耗尽其配额,导致真正紧急的 FCM 消息被视为普通优先级。

    注意:如果用户反复忽略某个通知,系统会为用户提供以后屏蔽该通知的选项。请勿仅仅为了将应用保留在“活跃”分桶中而向用户发送大量通知!

  • 如果应用拆分为多个软件包,这些软件包可能位于不同的分桶中,并因此具有不同的访问权限级别。对于软件包会分配到不同分桶的此类应用,您应该进行测试,以确保该应用运行正常。

省电模式改进

Android 9 对省电模式进行了多项改进。设备制造商会决定施加的确切限制。例如,在 AOSP build 中,系统会应用以下限制:

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

此外,还有其他特定于设备的电源优化。如需了解详情,请参阅介绍电源管理限制的页面

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

测试和问题排查

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

请务必在各种条件下测试应用的主要用例,了解电源管理功能如何彼此互动。您可以使用 Android 调试桥命令开启和关闭部分功能。

Android 调试桥命令

您可以使用 Android 调试桥 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