利用 Doze 进行平台电源管理

为了延长设备电池续航时间,Android 可以通过监控设备使用情况和唤醒状态来影响设备状态。当设备未使用时,平台可以进入休眠状态,以暂停活动的运行。

关于 Doze

当设备长时间未使用时,Doze 会延迟应用后台 CPU 和网络活动,从而延长电池续航时间。

处于 Doze 状态的闲置设备会定期进入维护窗口,应用可在此时完成待处理的工作(同步、作业等)。然后,Doze 会恢复休眠状态,休眠时间更长,之后又会进入另一个维护窗口。平台会继续执行 Doze 休眠/维护序列,每次都增加闲置时长,直到达到最长休眠时间(几个小时)。在任何时候,处于 Doze 状态的设备都会感知运动,如果检测到运动,会立即退出 Doze 状态。

Android 7.0 及更高版本扩展了 Doze 功能,使用户每次关闭设备屏幕时都会触发一组较轻的优化措施,即使他们继续四处移动,也能实现更长的电池续航时间。

关键系统服务通常由设备制造商设置为免于 Doze 模式。用户也可以使用“设置”菜单将特定应用从 Doze 模式中排除。但是,排除应用可能会导致设备电池电量耗尽。默认情况下,Doze 在 AOSP 中处于停用状态;如需详细了解如何启用 Doze,请参阅集成 Doze

Doze 要求

Doze 支持要求设备具有云消息传递服务,例如 Firebase Cloud Messaging (FCM)。外部触发事件(例如云消息)可以暂时唤醒应用以执行工作,同时设备仍保持 Doze 模式。

完全 Doze 支持还需要设备上配备显著运动检测器 (SMD);但是,Android 7.0 及更高版本中的轻量级 Doze 模式不需要 SMD。如果在设备上启用了 Doze,而该设备

  • 具有 SMD,则会进行完全 Doze 优化(包括轻量级优化)。
  • 不具有 SMD,则只会进行轻量级 Doze 优化。

Doze 生命周期

当平台检测到设备处于闲置状态时,Doze 模式开始;当发生一个或多个退出条件活动时,Doze 模式结束。

当出现以下情况时,平台会检测到设备处于闲置状态:

  • 设备静止不动(使用 SMD)。
  • 设备屏幕关闭一段时间。

当电池供电设备插入电源充电器时,Doze 模式不会启动。

在 Doze 期间

平台会尝试使系统保持休眠状态,并在维护窗口期间定期恢复正常运行,然后将设备恢复到休眠状态,以便进行更长时间的重复周期。在休眠期间,以下限制处于活动状态:

  • 应用不允许访问网络。
  • 应用唤醒锁定被忽略。
  • 闹钟被延迟。不包括闹钟应用闹钟以及使用 setAndAllowWhileIdle() 设置的闹钟(在 Doze 模式下,每个应用每 15 分钟限 1 个)。此豁免旨在用于必须显示事件提醒通知的应用(例如“日历”)。
  • 不执行 Wi-Fi 扫描。
  • SyncAdapter 同步和 JobScheduler 作业会延迟到下一个维护窗口。
  • 接收 SMS 和 MMS 消息的应用会被放入临时白名单,以便它们可以完成处理。

退出

当平台检测到以下情况时,设备会退出 Doze 模式:

  • 用户与设备互动
  • 设备移动
  • 设备屏幕开启
  • 即将到来的 AlarmClock 闹钟

通知不会导致设备退出 Doze 模式。

Android 7.0 及更高版本通过在屏幕关闭期间(设备处于闲置状态之前)启用轻量级休眠模式,扩展了 Doze 功能。

图 1. 非静止设备和静止设备的 Doze 模式。

操作 Doze 轻量级 Doze
触发条件 屏幕关闭、电池供电、静止 屏幕关闭、电池供电(未插电)
计时 维护期逐渐增加 重复 N 分钟期间,包含维护窗口
限制 无网络访问、唤醒锁或 GPS/Wi-Fi 扫描;闹钟和作业/同步已延迟 无网络访问;作业/同步已延迟,维护窗口期间除外
行为 仅接收高优先级推送通知消息 接收所有实时消息(即时消息、通话等);高优先级推送通知消息启用临时网络访问
退出 运动、屏幕开启或闹钟闹响 屏幕开启

与应用待机交互

  • 在 Doze 模式下花费的时间不计入应用待机。
  • 当设备处于 Doze 模式时,空闲应用每天至少可以执行一次正常操作。

集成 Doze 模式

启用 Doze 模式后,支持 SENSOR_TYPE_SIGNIFICANT_MOTION 的设备会执行完整的 Doze 模式优化(包括轻量级优化);不支持 SMD 的设备仅执行轻量级 Doze 模式优化。Android 会自动选择合适的 Doze 模式优化,并且无需供应商配置。

为设备启用 Doze 模式

  1. 确认设备已安装云消息传递服务。
  2. 在设备叠加配置文件夹 overlay/frameworks/base/core/res/res/values/config.xml 中,将 config_enableAutoPowerModes 设置为 true
    <bool name="config_enableAutoPowerModes">true</bool>
    
    在 AOSP 中,此参数默认设置为 false(Doze 模式已停用)。
  3. 确认预加载的应用和服务
  4. 确认必要的服务已从 Doze 模式中豁免。

提示

测试和优化应用

在 Doze 模式下测试所有应用(尤其是预加载的应用)。有关详情,请参阅使用 Doze 模式和应用待机进行测试