文章目录
安卓Doze
安卓 Doze 是 Android 6.0(API 23)引入的一种电池优化机制。
工作原理
- 进入条件
当设备屏幕关闭,不充电,且在 Android 6.0 中设备静止 30 分钟后,进入Deep Doze模式。
在 Android 7.0 及以上版本中设备即使有轻微移动,只要屏幕关闭且不充电一段时间后,便会进入 Light Doze模式,持续一段时间后进入Deep Doze。 - 限制措施
进入 Doze 模式后,系统会对应用和部分系统功能进行限制,包括暂停网络访问、忽略唤醒锁、推迟 AlarmManager 闹钟、禁止 Wi-Fi/GPS 扫描、不允许同步适配器和 JobScheduler 运行等. - 维护窗口
每隔一段时间,系统会进入一个时长约为 30 秒的维护窗口(maintenance window),在这个窗口期内,应用可以唤醒系统,进行网络交互等操作,完成被推迟的任务.
如图,设备会先进入Doze Light(轻度模式),然后被Doze(深度模式)覆盖
Deep Doze的各种状态
- 手机设备处于激活活动状态 ACTIVE
- 屏幕关闭且不充电即进入非活动INACTIVE状态
- INACTIVE状态30分钟后让App进入IDLE_PENDING。
- IDLE_PENDING状态下使用Significant Motion Detector检测设备是否发生显著运动(利用加速度传感器),30分钟无运动则进入SENSING(传感检测)状态。
- SENSING,根据运动、光线、距离等传感器判断设备是否静止,默认是4分钟,传感检测设备没有运动就切到 LOCATION 状态。
- LOCATION状态经过 30s 的网络及GPS定位检测之后进入 Doze 的核心状态 IDLE。
- IDLE每隔一段时间会进入IDLE_MAINTENANCE处理挂起任务然后再回到IDLE状态,这个间隔会不断加大,第一次是1小时,然后加大为2小时,这样按小时递增,最后稳定为最大的6小时。
Light Doze的状态
- 手机设备处于激活活动状态 ACTIVE
- 屏幕关闭且不充电即进入非活动INACTIVE状态
- 3分钟后进入PRE_IDLE
- PRE_IDLE后进入IDLE状态
- IDLE状态时会判断有没网络,没有则进入WAITING_FOR_NETWORK,5分钟后回到IDLE,有网则间隔5, 10, 15分钟递增最大保持在15分钟后进入IDLE_MAINTENANCE状态1分钟后回到IDLE。
不同版本的特点
- Android 6.0 的 Doze 模式
设备不插电源充电,保持静止,且关闭屏幕一段时间后进入 Doze 模式,系统会禁止应用访问网络,延迟应用的后台作业、同步、闹钟等. - Android 7.0 增强 Doze 模式
分为浅度 Doze(Light IDLE)和深度 Doze(Deep IDLE)两个阶段。浅度 Doze 阶段,设备不充电,屏幕关闭即可进入,应用不能访问网络、推迟作业和同步;
深度 Doze 阶段,设备需在不充电、屏幕关闭且保持静止一段时间后进入,此阶段除了浅度 Doze 的限制外,唤醒锁失效,禁止 GPS/WIFI 扫描,闹钟等也会被推迟.
不同版本安卓默认开启情况
- 安卓 6.0 - 安卓 12:Doze 功能默认是开启的。当设备未连接电源、处于静止状态一段时间且屏幕关闭时,设备就会自动进入 Doze 模式,系统会通过限制应用对网络的访问以及对 CPU 的使用等来节省电量.
- 安卓 13:Doze 模式默认是关闭的
影响
安卓 Doze 模式会对以下方面进行限制:
Light Doze影响
- 网络访问限制
- 后台任务推迟(Jobs 和 Syncs 等后台任务会被推迟执行)
Deep Doze影响
- 网络访问
应用的网络访问会受到限制,仅在维护窗口期间才允许联网,非维护窗口时段,应用无法主动进行网络请求,以减少网络数据传输,节省电量. - 后台任务
大部分后台任务、定时器和同步操作会被暂停,比如常规的后台数据更新、定时任务等,都将推迟到维护窗口执行,避免后台任务频繁唤醒设备导致电量消耗. - Wake Locks
大多数 Wake Locks 会被系统无视,防止应用长时间阻止设备进入低功耗状态,确保设备能够进入休眠以节省电量. - AlarmManager 闹钟
除了使用setAndAllowWhileIdle