4. 进入 Doze 模式的 ADB 命令
适用场景
- 验证应用在 深度 Doze(Deep Idle)状态下的后台行为,如网络访问、闹钟、JobScheduler 延迟。
- 模拟设备长期闲置后的省电机制,无需等待物理静置数十分钟。
- 与 Google Play 后台测试发布配合,确认应用在极端省电模式下仍满足 后台限制策略 要求的存活与唤醒能力。
前置条件
| 条件 | 具体要求 |
|---|---|
| 设备充电 | 通过 USB 连接电脑或插上充电器,确保充电状态(可在设置中确认)。 |
| 设备静置 | 屏幕熄灭,且至少 30 秒内无触摸、按键、传感器事件(物理静置 + 屏幕关闭)。 |
| USB 调试 | 已开启开发者选项中的 USB 调试,并授权当前电脑的 ADB 公钥。 |
| Android 版本 | 设备 API 等级 ≥ 23(Android 6.0+),且未停用 Doze 组件。 |
注意:若设备连接充电器后仍无法进入 Doze,请检查是否开启了“充电时不休眠”或开发者选项中的“保持唤醒”开关。
操作步骤
-
连接设备并确认 ADB 可用
adb devices # 正常显示设备序列号及 "device" 状态 -
强制进入 Doze 模式
adb shell dumpsys deviceidle force-idle执行后设备立即进入深度 Doze,系统会停止大部分网络访问与同步,仅保留高优先级闹钟和短信/电话。
-
验证 Doze 状态
adb shell dumpsys deviceidle get deep # 返回 "IDLE" 表示已进入 Doze;返回 "ACTIVE" 表示未进入也可通过
adb shell dumpsys deviceidle查看完整状态信息,其中mState=IDLE表示激活。 -
退出 Doze 模式
adb shell dumpsys deviceidle unforce执行后设备恢复正常运行状态,应用可重新发起网络请求和后台任务。
-
确认退出成功
adb shell dumpsys deviceidle get deep # 返回 "ACTIVE"
输入输出物
| 类型 | 具体内容 |
|---|---|
| 输入 | ADB 命令字符串、设备充电状态、静置条件 |
| 输出 |
|
责任边界
- 测试 / 开发人员:执行 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 服务 |
验收标准
- 执行
force-idle后,dumpsys deviceidle get deep返回IDLE。 - 执行
unforce后,状态返回ACTIVE。 - 在同一会话中,重复强制进入 / 退出 Doze 不少于 3 次均能稳定切换。
- 进入 Doze 后,应用网络请求被延迟(可通过抓包或
ping验证,延迟约 10 分钟以上)。 - 退出 Doze 后,网络恢复,应用能正常发起
AlarmManager和JobScheduler任务。
实战提示
最佳实践:在
force-idle 前先通过 adb shell dumpsys deviceidle disable 临时关闭 Doze 以便观察基线行为;测试完成后务必重新启用(enable)。使用批处理脚本可自动化进入 / 退出循环,提升回归效率。