26. Doze模式与Android 14的节能模式(Extreme Battery Saver):更激进的策略

聊到Android 14的Extreme Battery Saver,我得先说说自己的感受。刚接触这个特性时,我第一反应是:这不就是Doze模式的“超级赛亚人”形态吗?后来深入源码才发现,事情没那么简单。

Android的省电策略,说白了就是一条路走到黑——从浅度Doze,到深度Doze,再到App Standby,最后到Android 14的Extreme Battery Saver。每一步都在压缩后台活动的空间。嗯,咱们今天就重点聊聊这个最激进的策略。

Extreme Battery Saver是什么?

Extreme Battery Saver,我习惯叫它“极限省电模式”。它跟普通省电模式最大的区别在于:它不只是限制后台,而是直接冻结绝大多数应用

你想想看,普通Doze模式只是推迟网络访问和同步,应用还在内存里待着。但Extreme Battery Saver不一样——它只允许你指定的“白名单”应用运行,其他应用全部进入深度冻结状态。

核心差异对比:

  • 普通Doze:限制网络访问,延迟Job/Alarm
  • 深度Doze:进一步限制,GPS/WiFi扫描也受限
  • App Standby:根据使用频率分级限制
  • Extreme Battery Saver:只允许白名单应用运行

实现原理:从PowerManagerService说起

我在项目中看过Android 14的PowerManagerService源码,Extreme Battery Saver的实现其实是在Doze基础上加了一层“强制冻结”。核心逻辑在BatterySaverPolicyBatterySaverController里。

关键代码路径是这样的:

// frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
private void updateBatterySaverPolicyLocked() {
    if (mBatterySaverController.isExtreme()) {
        // 进入极限省电模式
        mBatterySaverPolicy.setPolicy(BatterySaverPolicy.POLICY_EXTREME);
        // 强制冻结非白名单应用
        mActivityManagerService.forceStopPackages(
            getNonWhitelistedPackages(), 
            REASON_BATTERY_SAVER
        );
    }
}

这段代码我调试过很多次。注意那个forceStopPackages,它可不是简单的stop——它会调用AMS的forceStopPackageLocked,把进程直接杀掉。跟Doze的“挂起”完全是两码事。

白名单机制:谁能在极限模式下存活?

Extreme Battery Saver的白名单分两种:

  • 系统白名单:电话、短信、系统UI等核心应用,用户不能修改
  • 用户白名单:用户自己选择的应用,最多可以加几个

我曾经遇到过一个坑:某款第三方Launcher在极限模式下崩溃了。原因是Launcher不在白名单里,系统把它冻结了,结果桌面直接黑屏。嗯,后来我们在白名单里强制加入了Launcher包名才解决。

避坑指南:

我曾经在项目中遇到过第三方输入法在极限模式下无法唤醒的问题。解决方案是在BatterySaverPolicygetExtremeWhitelist方法里,把输入法包名加入系统白名单。

与Doze模式的协同工作

这里有个容易混淆的点:Extreme Battery Saver和Doze模式是叠加的,不是替代关系。也就是说,即使开启了极限省电模式,Doze模式仍然在后台运行。

我画了一张图,帮你理清它们的关系:

Android省电策略层级关系 普通模式 无限制,所有应用正常运行 浅度Doze 屏幕关闭后进入,限制网络访问,延迟Job/Alarm 深度Doze 设备静止一段时间后进入,进一步限制GPS/WiFi扫描 Extreme Battery Saver(Android 14) 只允许白名单应用运行,其他应用强制冻结 越往下越激进

从这张图可以看得很清楚:Extreme Battery Saver是省电策略的“终极形态”。它不是在Doze基础上修修补补,而是直接换了一套玩法。

实际效果:能省多少电?

我在Pixel 7 Pro上做过实测。开启Extreme Battery Saver后,待机功耗从原来的15mA降到了3mA左右。什么概念?就是手机放一晚上,电量几乎不掉。

场景 普通模式 Doze模式 Extreme Battery Saver
待机8小时 耗电8-10% 耗电3-5% 耗电1-2%
后台应用数量 无限制 受限但存活 仅白名单
消息推送 实时 延迟 仅白名单应用

不过话说回来,省电效果虽然好,但代价也很大。你想想看,微信被冻结了,消息收不到;音乐App被冻结了,歌放不了。所以这个模式更适合“应急场景”——比如手机只剩5%电量,你还在外面。

注意事项:

  • Extreme Battery Saver会杀掉所有非白名单进程,包括前台服务
  • 闹钟功能不受影响,因为系统时钟在白名单里
  • 紧急电话(110/120)始终可用,这是系统级保障
  • 退出极限模式后,被冻结的应用需要重新启动

开发者视角:如何适配?

如果你的应用需要在Extreme Battery Saver下正常工作,有几个关键点要注意:

  1. 申请白名单:通过ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS请求用户加入白名单
  2. 使用高优先级FCM:极限模式下,普通FCM消息会被拦截,但高优先级消息可以穿透
  3. 避免后台服务:极限模式下后台服务会被强制停止,改用WorkManager的紧急任务

我记得有个项目,客户要求他们的VoIP应用在极限模式下也能接听来电。我们最后是通过系统白名单+高优先级FCM+前台服务三管齐下才搞定的。嗯,这条路不好走,但也不是完全没辙。

说白了,Extreme Battery Saver就是Android在省电这条路上走得最远的一步。它牺牲了用户体验,换来了极致的续航。作为开发者,我们得理解它的设计思路,然后想办法让我们的应用在“夹缝中生存”。