第1章 Doze模式概述
适用场景
- 需要保证后台服务的稳定性、网络连接可靠性的 Android 应用。
- 计划提交至 Google Play 或已上架的应用,必须通过 Doze 模式兼容性测试。
- 涉及消息推送、定位更新、定时同步、文件下载等后台任务的应用。
- Android 6.0(API 23)及以上版本所有目标设备。
前置条件
| 条件 | 说明 |
| 系统版本 | Android 6.0+(API 23 及以上) |
| Google Play 服务 | 已安装并登录 Google 账号 |
| 测试设备 | 真实物理设备或带电池模拟的模拟器 |
| 开发者选项 | 已开启“不保留活动”、“后台进程限制” 等调试开关 |
| adb 工具 | 用于手动触发 Doze 模式或导入测试配置 |
操作步骤
- 检查设备当前 Doze 状态:
使用 adb 命令获取设备闲置状态:
adb shell dumpsys deviceidle get deep
返回 IDLE 表示已激活深度 Doze,ACTIVE 表示未进入。
- 模拟进入轻度 Doze 阶段:
断开充电器,熄屏静置约 30 分钟。或通过命令强制进入:
adb shell dumpsys deviceidle step light
- 模拟进入深度 Doze 阶段:
继续静置约 1 小时(或执行命令多次直至 deep 状态)。
adb shell dumpsys deviceidle step deep
- 观察应用后台行为:
记录网络访问、闹钟触发、JobScheduler 执行等是否被延迟或禁止。
- 使用 Battery Historian 收集数据:
导出 bugreport 并导入 Battery Historian 工具分析 Doze 影响。
输入输出物
| 类型 | 输入物 | 输出物 |
| 配置 | AndroidManifest.xml 权限与后台任务声明 | Doze 白名单配置(可选) |
| 脚本 | 模拟 Doze 的 adb 命令序列 | 执行日志(stdout/stderr) |
| 数据 | Bugreport(.zip 或 .txt) | Battery Historian 分析报告(HTML) |
| 文档 | 应用后台行为设计文档 | Doze 兼容性测试报告(格式见 记录材料) |
责任边界
- 开发者:确保应用在 Doze 模式下使用
JobScheduler、setAlarmClock、FCM 高优先级消息 等兼容手段。
- 测试工程师:执行 Doze 模式全流程测试,记录异常行为并反馈。
- Google Play 审核组:核验应用是否遵循后台限制政策,决定是否允许更新或上架。
记录材料
Doze 兼容性测试记录表(模板)
| 测试项 | 预期行为 | 实际结果 | 是否通过 |
| 轻度 Doze 下网络访问 | 允许短连接,禁止长连接 | | |
| 深度 Doze 下 Alarm 触发 | 延迟到维护窗口 | | |
| FCM 高优先级推送 | 立即唤醒设备 | | |
| JobScheduler 作业 | 仅在维护窗口执行 | | |
| GPS/WiFi 扫描 | 频率降低或临时关闭 | | |
记录保存路径:项目仓库 /docs/doze-test-report/ 下,按版本命名,例如 doze_v1.0.3.md。
异常处理
常见异常与解决方案
| 异常现象 | 可能原因 | 解决方法 |
| 应用在深度 Doze 下无法接收推送 | 使用了普通网络请求而非 FCM 高优先级 | 改用 FcmService 设定高优先级消息 |
| 定时同步任务始终不被调度 | 使用了 AlarmManager.setExact() | 替换为 JobScheduler 或 setAlarmClock() |
| adb 命令无法进入深度 Doze | 设备正在充电或保持唤醒锁 | 断开充电器,释放所有 WakeLock 后重试 |
| Battery Historian 图表不显示 Doze 区间 | bugreport 采集时间太短(<1 小时) | 保证静置时长超过 60 分钟,重新导出 |
验收标准
- 应用在轻度 Doze 阶段能够维持必要短连接(如心跳包),不会无限制重连。
- 应用在深度 Doze 阶段不主动发起网络请求,不频繁唤醒系统。
- 用户通过通知或点击应用时,设备能正常退出 Doze 并恢复后台能力。
- 所有后台任务使用
JobScheduler、FCM 或 setAlarmClock 实现,且经过测试验证。
- 测试报告文档完整,包含至少一次完整轻度/深度 Doze 轮回的日志与截图。
Doze 模式阶段与后台行为影响