电源管理

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

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

应用待机存储分区
系统限制了应用的设备资源(例如 CPU 或电量,具体取决于用户的使用模式。这是我们新推出的一项功能 Android 9。
省电模式改进
开启省电模式后, 系统会对所有应用施加限制这是一项现有功能 Android 9 做出了一些改进。

应用待机存储分区

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

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

有效

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

  • 该应用启动了一个 Activity
  • 该应用正在运行一项前台服务
  • 该应用具有与 前台应用
  • 用户点按了应用通知

如果应用位于“活跃”分桶中,系统不会对 应用的作业、闹钟或 FCM 消息。

工作集

如果某个应用经常运行,但目前并未运行,则会被分配到“工作集”分桶中 活动状态。例如,用户多数时候都会启动的社交媒体应用 很可能位于工作集内。应用也会被提升到工作集 存储分区中的资源。

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

常用

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

如果某个应用位于“常用”分桶中,系统会对 它能够运行作业和触发警报,并且对 高优先级 FCM 消息。有关详情,请参阅 电源管理限制

罕见

不经常使用的应用会被分配到“极少使用”分桶中。例如,酒店应用 用户只有在入住酒店时才会跑步,可能 存储分区。

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

永不

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

系统会动态地将每个应用分配到优先级分桶,并重新分配 应用。系统可能依赖于使用计算机的 以确定每个类别 app,并将应用分配到相应的分桶。如果系统 应用在设备上不存在,则系统默认按照以下条件对应用进行排序: 最近使用时间系统会将更活跃的应用分配到 为应用提供更高的优先级 为应用程序提供更多系统资源。具体而言,存储分区 确定应用的作业运行频率、应用可以触发的频率 警报,以及应用收到高优先级 Firebase Cloud 服务的频率 消息传递 (FCM) 消息。 这些限制仅适用于设备使用电池供电的情况;系统 在设备充电时不会对应用施加这些限制。

每个制造商都可以针对非活跃应用的判定标准设定自己的标准 分配给存储分区您不应尝试影响应用属于哪个类别 分配对象。而应专注于确保您的应用在任何环境下都能正常运行 存储分区您的应用可以通过 调用新方法 UsageStatsManager.getAppStandbyBucket()

最佳做法

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

  • 请勿试图迫使系统将您的应用放在一个分桶中,或 另一个。系统的分桶方法可能会发生变化,每台设备都可能 制造商可以选择使用自己的语言来 算法。请改为确保应用无论位于哪个分桶都运行正常。
  • 没有启动器 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