第1章 Doze模式概述

适用场景

  • 需要保证后台服务的稳定性、网络连接可靠性的 Android 应用。
  • 计划提交至 Google Play 或已上架的应用,必须通过 Doze 模式兼容性测试。
  • 涉及消息推送、定位更新、定时同步、文件下载等后台任务的应用。
  • Android 6.0(API 23)及以上版本所有目标设备。

前置条件

条件说明
系统版本Android 6.0+(API 23 及以上)
Google Play 服务已安装并登录 Google 账号
测试设备真实物理设备或带电池模拟的模拟器
开发者选项已开启“不保留活动”、“后台进程限制” 等调试开关
adb 工具用于手动触发 Doze 模式或导入测试配置

操作步骤

  1. 检查设备当前 Doze 状态:
    使用 adb 命令获取设备闲置状态:
    adb shell dumpsys deviceidle get deep
    返回 IDLE 表示已激活深度 Doze,ACTIVE 表示未进入。
  2. 模拟进入轻度 Doze 阶段:
    断开充电器,熄屏静置约 30 分钟。或通过命令强制进入:
    adb shell dumpsys deviceidle step light
  3. 模拟进入深度 Doze 阶段:
    继续静置约 1 小时(或执行命令多次直至 deep 状态)。
    adb shell dumpsys deviceidle step deep
  4. 观察应用后台行为:
    记录网络访问、闹钟触发、JobScheduler 执行等是否被延迟或禁止。
  5. 使用 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 模式阶段与后台行为影响

Doze 模式阶段与后台行为影响 正常使用状态 轻度 Doze 阶段 深度 Doze 阶段 后台行为 短网络连接允许 维持小部分 JobScheduler 限制位置更新频率 后台行为 全部网络访问被暂停 JobScheduler 仅在维护窗口执行 Alarm 延迟到下一维护窗口 设备熄屏静置 ~30min 继续静置 ~1h 或命令触发 逐步降级