AOSP的Doze模式-LightIdle初识
前言
从Android 6.0开始,谷歌引入了Doze模式(打盹模式)的省电技术延长电池使用时间。根据第三方测试显示,两台同样的Nexus 5,开启的Doze的一台待机能达到533小时,而未开启Doze的一台待机只能达到200小时。Doze省电效果十分明显。
Doze省电技术原理
Doze模式细分light idle和deep idle,本文主要介绍light idle
操作 | 低电耗模式-deep idle | 轻度低电耗模式-light idle |
触发器 | 屏幕关闭、电池供电(未插电)、静止 | 屏幕关闭、电池供电(未插电) |
计时 | 随维护时段依次增加 | 随维护时段反复持续 N 分钟 |
限制 | 无法访问网络、唤醒锁定和 GPS/WLAN 扫描;闹钟和作业/同步被延迟 | 无法访问网络;作业/同步被延迟(维护窗口除外) |
行为 | 仅接收优先级较高的推送通知消息 | 接收所有实时消息(即时消息、致电等);优先级较高的推送通知消息可以暂时访问网络 |
退出 | 动作、屏幕开启或闹钟响铃 | 屏幕开启 |
Doze技术原理主要分为Doze状态机+省电管控(后台 CPU 和网络活动)措施,延长待机续航的效果。
其中状态机的目的主要识别用户长时间未使用设备场景并标记Idle状态,省电管控措施主要是Idle状态内限制应用后台 CPU 和网络活动
Light idle 状态机时序图
从上述状态流转图来看,正常情况(手机有网络)下最快16mins进入light idle模式,每隔5mins进入1min的维护窗口期。
Light idle 状态机流转图
Light Idle 状态机状态转换表
状态 (State) | 进入条件 (Entry Conditions) | 触发方法/逻辑 |
LIGHT_STATE_ACTIVE | 屏幕开启 OR 正在充电 OR 即将触发闹钟 OR 有紧急呼叫活跃。 | 初始状态,通过 becomeActiveLocked() 激活。 |
LIGHT_STATE_INACTIVE | 屏幕关闭 AND 未充电 AND 无紧急呼叫。 | 从 LIGHT_STATE_ACTIVE 通过 becomeInactiveIfAppropriateLocked() 进入。 |
LIGHT_STATE_IDLE | 设备空闲一段时间(无用户交互或运动)。 | 从 LIGHT_STATE_INACTIVE 通过超时(some time transpires)自动进入。 |
LIGHT_STATE_WAITING_FOR_NETWORK | 从 LIGHT_STATE_IDLE 退出时,检测到无网络连接。 | 从 LIGHT_STATE_IDLE 通过条件分支(no network)进入。 |
LIGHT_STATE_IDLE_MAINTENANCE | 空闲维护窗口(短暂唤醒以执行任务)。 | 从 LIGHT_STATE_IDLE 或 LIGHT_STATE_WAITING_FOR_NETWORK 通过默认转换进入。 |
LIGHT_STATE_OVERRIDE | 设备进入 Deep Idle 的 STATE_IDLE 状态,Light Idle 状态机被冻结。 | 由 Deep Idle 状态机触发(deep goes to STATE_IDLE)。 |
相对Light Idle我更关注Doze的Deep Idle,目前大部分友商主要是对deep idle进行深度定制。