第3章 adb基础命令速查:数据采集四件套

在WorkManager问题排查中,adb命令是连接设备和开发者的桥梁。本章围绕数据采集环节,系统介绍四个最常用的基础命令及其在作业调度排查中的实战用法。掌握它们,你就能快速获取设备状态、日志、作业队列快照,将模糊的“任务没跑”转化为可分析的数据。

排查主线定位:现象识别(任务未执行/延迟)→ 数据采集(本章)→ 原因定位 → 修复动作 → 复测 → 预防
WorkManager问题排查 - adb命令数据采集流程 adb命令数据采集流程 任务未执行 / 延迟 开始采集? adb devices 确认设备连接 adb shell 进入设备环境 adb logcat过滤 抓取WM日志 dumpsys jobscheduler 获取调度队列 日志 / 调度状态数据 四类命令协同采集,覆盖从设备到作业调度的全链路数据

3.1 命令速查表

命令作用WorkManager排查关键参数
adb devices列举已连接的设备/模拟器检查设备是否在线;多设备时指定 -s serial
adb shell在设备上运行交互式 shell 或单条命令后接其他命令的入口,也可直接 adb shell cmd
adb logcat抓取设备系统日志过滤 WorkManager 日志:-s WM-* 或 -s WorkManager
adb shell dumpsys jobscheduler输出作业调度服务状态查看 WorkManager 创建的 JobInfo、约束、等待原因

3.2 逐命令详解与排查技巧

3.2.1 adb devices – 确认数据采集管道通畅

在开始任何排查前,必须确保目标设备已正确连接。执行:

adb devices

正常输出应显示设备序列号及 device 状态。若显示 unauthorized,需在手机上授权调试连接。若显示 offline,重启 adb 服务:

adb kill-server
adb start-server
adb devices
多设备场景:连接多台时,所有后续命令需加 -s 序列号,例如:adb -s emulator-5554 logcat。

3.2.2 adb shell – 进入设备内部

使用 adb shell 可直接执行单条命令或进入交互环境。对于 WorkManager 排查,常用于:

  • 查看包名下的作业:adb shell dumpsys jobscheduler | grep -A 30 "com.example.app"
  • 触发强制作业运行(需要 root 或 adb shell cmd jobscheduler run -f com.example.app WorkManagerWorkId)

示例:单条命令直接输出结果

adb shell dumpsys jobscheduler | grep "com.example.app"

3.2.3 adb logcat 过滤 – 聚焦 WorkManager 日志

WorkManager 使用固定的日志 tag 体系。建议使用以下过滤模式:

adb logcat -s WM-* WorkManager

更精细的过滤可加上时间戳:

adb logcat -v time -s WM-*:V WorkManager:V

保存日志到本地以便离线分析:

adb logcat -d -f /sdcard/wm_log.txt
adb pull /sdcard/wm_log.txt .
注意:WorkManager 日志级别从 ERROR 到 VERBOSE。排查初启动问题建议使用 VERBOSE(:V),但生产环境日志量大,通常先用 ERROR/WARN 缩小范围。

3.2.4 adb shell dumpsys jobscheduler – 查看作业调度底层状态

这是排查 WorkManager 任务被推迟或未执行的核心命令。输出中包含大量结构化信息:

  • active jobs:正在运行的作业
  • pending jobs:等待执行的作业及其约束(网络、充电、空闲等)
  • recent jobs:最近完成的作业及结果
  • JobInfo 条目:每个作业的周期、延迟、约束详情

典型用法,以包名过滤:

adb shell dumpsys jobscheduler | grep -A 50 "com.yourapp"

输出示例摘要:

JOB #uid10123: com.yourapp/.WorkManagerInitializer
  ...
  Run reason: waiting...
  Constraints:
    CONNECTIVITY: [UNMETERED] (not satisfied)
    BATTERY_NOT_LOW: satisfied

上面表示“网络约束未满足”,导致作业暂停。结合此信息可直接定位延迟原因。

3.3 原因定位实战:从命令输出到根因

以下排查表将常见现象与命令输出特征对应,帮助快速定位:

现象关键命令预期输出特征可能根因
任务从未执行dumpsys jobscheduler作业信息缺失,或 Run reason: not scheduledWorkManager 未初始化,或 JobInfo 未注册
任务延迟执行dumpsys jobschedulerConstraints: … (not satisfied)网络、充电、空闲约束未满足
任务执行后立即失败logcat -s WM-*Result: FAILURE 或 Worker failed with exceptionWorker 内逻辑异常,或系统杀进程
任务被反复调度dumpsys jobscheduler同一作业 ID 多次出现在 pending 队列重复 enqueue,或 PeriodicWork 周期过短

3.4 修复动作示例

  • 约束不满足:修改 WorkRequest 的约束(如去除网络要求),或连接充电器/网络后复测。
  • 日志太少:使用 adb logcat -v time -s WM-*:V 获取更详细的调度日志。
  • 作业被系统抑制:检查设备省电策略(Battery Optimization/Standby Bucket),可通过 adb shell dumpsys deviceidle 查看。
  • 手动触发测试:
adb shell cmd jobscheduler run -f com.yourapp 123456   # 123456 为 jobId

3.5 复测与预防

修复后,重复以下验证流程:

  1. 连接设备,执行 adb devices 确认在线。
  2. 清除旧日志:adb logcat -c
  3. 触发测试场景(如切换网络、锁屏等)。
  4. 抓取日志:adb logcat -v time -s WM-*:V > wm_test.log
  5. 对比 dumpsys jobscheduler 中作业状态变化。
  6. 确认约束状态变为 satisfied,作业按预期执行。

为预防同类问题,建议团队建立以下规范:

  • 每次发布前使用 dumpsys jobscheduler 导出基线,对比作业数。
  • 在 CI 步骤中加入 adb logcat -s WM-*:W 检查异常日志。
  • 开发阶段常用 adb shell dumpsys jobscheduler | grep -A 30 实时观察。
进阶技巧:将以上四个命令封装为一个 shell 脚本 wm_debug.sh,一次执行获取完整数据包,包括设备信息、日志片段、作业状态快照,方便分享给团队或归档。