4. 进入 Doze 模式的 ADB 命令

适用场景

  • 验证应用在 深度 Doze(Deep Idle)状态下的后台行为,如网络访问、闹钟、JobScheduler 延迟。
  • 模拟设备长期闲置后的省电机制,无需等待物理静置数十分钟。
  • 与 Google Play 后台测试发布配合,确认应用在极端省电模式下仍满足 后台限制策略 要求的存活与唤醒能力。

前置条件

条件 具体要求
设备充电 通过 USB 连接电脑或插上充电器,确保充电状态(可在设置中确认)。
设备静置 屏幕熄灭,且至少 30 秒内无触摸、按键、传感器事件(物理静置 + 屏幕关闭)。
USB 调试 已开启开发者选项中的 USB 调试,并授权当前电脑的 ADB 公钥。
Android 版本 设备 API 等级 ≥ 23(Android 6.0+),且未停用 Doze 组件。
注意:若设备连接充电器后仍无法进入 Doze,请检查是否开启了“充电时不休眠”或开发者选项中的“保持唤醒”开关。

操作步骤

  1. 连接设备并确认 ADB 可用
    adb devices
    # 正常显示设备序列号及 "device" 状态
  2. 强制进入 Doze 模式
    adb shell dumpsys deviceidle force-idle

    执行后设备立即进入深度 Doze,系统会停止大部分网络访问与同步,仅保留高优先级闹钟和短信/电话。

  3. 验证 Doze 状态
    adb shell dumpsys deviceidle get deep
    # 返回 "IDLE" 表示已进入 Doze;返回 "ACTIVE" 表示未进入

    也可通过 adb shell dumpsys deviceidle 查看完整状态信息,其中 mState=IDLE 表示激活。

  4. 退出 Doze 模式
    adb shell dumpsys deviceidle unforce

    执行后设备恢复正常运行状态,应用可重新发起网络请求和后台任务。

  5. 确认退出成功
    adb shell dumpsys deviceidle get deep
    # 返回 "ACTIVE"

输入输出物

类型 具体内容
输入 ADB 命令字符串、设备充电状态、静置条件
输出
  • 命令行回显(无输出或状态字符串)
  • dumpsys deviceidle 状态文本(用于验证)

责任边界

  • 测试 / 开发人员:执行 ADB 命令、记录输出、判断状态是否符合预期;注意在测试结束后调用 unforce 恢复设备。
  • 系统框架:Android 设备空闲管理模块(DeviceIdleController)根据命令切换状态,并同步给所有注册的应用。
  • 应用自身:监听 ACTION_DEVICE_IDLE_MODE_CHANGED 广播,或通过 PowerManager.isDeviceIdleMode() 获取当前状态。

记录材料

  • 操作终端日志截图或文本,包含 force-idle 和 unforce 前后的状态输出。
  • 设备系统日志(adb logcat -b events -s idle*)中 Doze 切换事件的时间戳。
  • 测试用例标识与执行日期。

异常处理

异常现象 可能原因 解决方案
force-idle 后状态仍为 ACTIVE 设备未满足充电 + 静置条件;或正在播放媒体、VoIP 通话 关闭所有前台应用、断开蓝牙音频、等待 1 分钟后重试
命令返回 SecurityException ADB 未获得 root 或 shell 权限(部分厂商锁定) 使用 adb shell 进入 shell 后再次尝试;或刷入工程固件
设备不支持 deviceidle 命令 Android 版本低于 6.0 或系统被精简 确认 API level ≥23,并检查 /system/framework 中是否包含 services.jar
unforce 后应用仍受限 系统缓存状态未即时刷新 等待 2 秒后再次验证;或重启 ADB 服务

验收标准

  1. 执行 force-idle 后,dumpsys deviceidle get deep 返回 IDLE。
  2. 执行 unforce 后,状态返回 ACTIVE。
  3. 在同一会话中,重复强制进入 / 退出 Doze 不少于 3 次均能稳定切换。
  4. 进入 Doze 后,应用网络请求被延迟(可通过抓包或 ping 验证,延迟约 10 分钟以上)。
  5. 退出 Doze 后,网络恢复,应用能正常发起 AlarmManager 和 JobScheduler 任务。
Doze 模式手动触发流程 1. 准备条件 充电 + 屏幕关闭静置 2. 连接 ADB adb devices 确认设备 3. 强制进入 Doze adb shell dumpsys deviceidle force-idle 4. 验证状态 dumpsys deviceidle get deep → IDLE 5. 退出 Doze dumpsys deviceidle unforce 6. 确认退出 get deep → ACTIVE ⚠️ 注意 若设备充电但 status 仍为 ACTIVE,请检查“充电时 不休眠”开关是否关闭。

实战提示

最佳实践:在 force-idle 前先通过 adb shell dumpsys deviceidle disable 临时关闭 Doze 以便观察基线行为;测试完成后务必重新启用(enable)。使用批处理脚本可自动化进入 / 退出循环,提升回归效率。