3、ADB基础命令:adb devices、adb version、adb help等常用命令的用法和输出解读

ADB(Android Debug Bridge)是Android开发与调试的核心工具链,它采用客户端-服务器-守护进程(Client-Server-Daemon)的三层架构,为开发者提供了与设备进行交互的统一通道。在掌握复杂的安装、推送、日志抓取等高级命令之前,必须先扎实地理解最基础的三个命令:adb devices、adb version 和 adb help。这三个命令是ADB世界的“敲门砖”,它们分别承担着环境自检、设备发现和功能索引的关键角色。本章将深入剖析这三个命令的工作原理、输出格式、典型应用场景以及常见误区,帮助学员建立正确的ADB调试基础认知。

ADB基础命令架构与执行链路 ADB Client adb devices / version / help 命令行输入解析 ADB Server TCP 5037 端口监听 设备状态管理 ADB Daemon adbd (设备端) USB/Wi-Fi 通信 TCP:5037 USB/Wi-Fi 命令输出映射 adb devices List of devices attached emulator-5554 device R58M23ABC device 192.168.1.10:5555 device adb version Android Debug Bridge version 1.0.41 Version 33.0.1-1060021 Installed as /usr/bin/adb adb help usage: adb [-d|-e|-s] [-a] [-n] [command] commands 列表 service 列表 状态机:offline → device → unauthorized → no permissions

上图清晰地展示了ADB基础命令在客户端-服务器-守护进程架构中的执行路径。当用户在终端输入adb devices时,ADB Client会通过TCP 5037端口向本机的ADB Server发送请求,Server再通过USB或Wi-Fi与设备端的adbd守护进程通信,最终将设备列表返回给Client并打印在终端上。理解这一链路对于后续排查“设备未显示”等问题至关重要。

3.1 核心原理:ADB的三层架构与命令分发机制

ADB并非一个单一的程序,而是由三个独立组件构成的系统。深入理解这三者的关系,是解读任何ADB命令输出结果的前提。

  • ADB Client(客户端):运行在PC端,是用户直接交互的命令行程序。它负责解析用户输入的命令(如devices、install),并将命令封装成协议消息发送给Server。每次执行一个ADB命令,就会启动一个Client实例。
  • ADB Server(服务器):同样运行在PC端,是一个后台管理进程。它负责管理Client与Daemon之间的通信,维护所有已连接设备的列表和状态。Server在系统后台持续运行,默认监听TCP 5037端口。当Client启动时,它会先检查Server是否运行,若未运行则自动启动。
  • ADB Daemon(守护进程):运行在Android设备端(或模拟器)的后台进程,通常称为adbd。它负责在设备端执行来自Server的具体指令,如文件复制、端口转发、shell命令执行等。

当执行adb devices时,Client将“host:devices”请求发送给Server,Server查询其维护的设备列表并返回。该列表包含设备的序列号(Serial Number)和当前连接状态。这种架构设计使得多个Client可以同时连接一个Server,而Server可以管理多个设备,实现了高效的资源复用。

关键点:ADB Server是单例的,它会在PC后台常驻。如果Server版本与Client不匹配,或者Server进程异常,会导致所有ADB命令失效。此时,使用adb kill-server和adb start-server重启Server是常用的恢复手段。

3.2 判断方法:三个命令的详细输出解读与状态机

每个基础命令的输出都包含了丰富的调试信息,学会“读懂”这些输出是进阶的第一步。

3.2.1 adb devices:设备列表与状态机

该命令用于列出当前连接的所有Android设备。其标准输出格式如下:

List of devices attached
emulator-5554   device
R58M23ABC       device
192.168.1.10:5555   device

输出分为两列:第一列是设备的序列号,第二列是状态。序列号是设备的唯一标识,对于USB连接的物理设备,通常是设备序列号;对于模拟器,则是emulator-5554格式;对于网络连接的设备,则是IP:端口格式。状态字段是判断设备是否可用的核心,常见状态如下表所示:

状态值 含义 常见原因与处理建议
device 设备已正常连接,且ADB通信正常,可执行命令。 正常状态,无需处理。
offline 设备已连接,但ADB通信异常或设备端adbd无响应。 1. 尝试重新插拔USB线。2. 执行adb kill-server后重试。3. 检查设备端是否弹出“允许USB调试”授权窗口。
unauthorized 设备已连接,但用户未在设备上确认“允许USB调试”授权。 在设备屏幕上点击“允许”并勾选“始终允许”。若未弹出,可撤销授权后重试。
no permissions PC端用户没有权限访问USB设备(常见于Linux系统)。 在Linux下需配置udev规则,或使用sudo adb devices(不推荐)。
sideload 设备处于Recovery模式下的sideload状态。 用于通过adb sideload命令刷入OTA包。
风险提示:当设备状态为unauthorized时,请务必检查设备屏幕。若长时间未授权,可能是PC端的RSA密钥指纹与设备端不匹配。可在设备端开发者选项中“撤销USB调试授权”后重新连接。

3.2.2 adb version:环境自检与版本兼容性

该命令用于查看ADB工具的版本信息。输出示例如下:

Android Debug Bridge version 1.0.41
Version 33.0.1-1060021
Installed as /usr/local/bin/adb

第一行是ADB协议的版本号,第二行是SDK工具的详细版本号,第三行是ADB可执行文件的安装路径。版本信息对于排查兼容性问题至关重要。例如,较新的ADB版本可能不支持旧版Android设备(如Android 2.x),而旧版ADB可能无法识别Android 13+的新特性。

经验提醒:在CI/CD自动化测试环境中,务必固定ADB版本。不同版本的adb在命令参数和输出格式上可能存在细微差异,这会导致自动化脚本解析失败。

3.2.3 adb help:内置命令手册

执行adb help会输出完整的命令列表和参数说明。这是最权威的“离线文档”。输出内容通常分为几个部分:全局选项(Global options)、通用命令(General commands)、调试命令(Debugging commands)、脚本命令(Scripting commands)等。例如:

usage: adb [-d|-e|-s <serial-number>] <command>

global options:
 -a                       listen on all network interfaces
 -d                       use USB device
 -e                       use emulator
 -s SERIAL                use device with given serial number

general commands:
 devices                  list connected devices
 help                     show this help message
 version                  show version num

...

通过adb help,用户可以快速查找特定命令的用法,而无需翻阅网络文档。它是学习ADB命令的“索引”。

3.3 案例拆解:多设备管理下的命令实战

在实际开发中,工程师经常需要同时管理多台设备(如多台真机、混合模拟器)。此时,基础命令的组合使用就显得尤为重要。

场景背景:某测试团队需要在一台PC上同时连接两台Android手机(序列号分别为R58M23ABC和R58M23XYZ)以及一个模拟器(emulator-5554),用于执行兼容性测试。

初始现象与目标:测试脚本需要分别向特定设备安装APK并启动应用。如果直接执行adb install,ADB会报错“adb: more than one device/emulator”,因为系统无法确定目标设备。

分析判断过程:首先,执行adb devices确认所有设备均处于device状态。输出显示三台设备均在线。此时,必须使用-s参数指定目标设备序列号。

实际操作步骤:

  1. 执行adb devices获取所有设备的序列号列表。
  2. 向序列号为R58M23ABC的设备安装测试包:
    adb -s R58M23ABC install app-debug.apk
  3. 向模拟器安装测试包:
    adb -s emulator-5554 install app-debug.apk
  4. 若需要针对网络连接的设备(如192.168.1.10:5555),同样使用-s指定:
    adb -s 192.168.1.10:5555 shell getprop ro.product.model

结果对比与复盘:通过-s参数,脚本成功将应用安装到了指定设备上,避免了多设备冲突。复盘发现,团队在最初编写脚本时忽略了多设备场景,导致脚本无法复用。后续在脚本中增加了设备序列号参数化配置,提高了脚本的健壮性。

实战技巧:在编写自动化脚本时,建议先执行adb devices并解析输出,动态获取设备列表,再通过循环或参数化方式执行后续命令,这样可以适应不同的硬件环境。

3.4 常见误区与总结复盘

基础命令虽然简单,但在实际使用中仍存在一些高频误区,需要特别注意。

  • 误区一:忽略Server重启。当设备状态一直显示offline时,很多新手会反复插拔USB线,却忽略了重启ADB Server。正确做法是先执行adb kill-server,再执行adb start-server,最后再执行adb devices。
  • 误区二:混淆device状态与可用性。状态为device仅代表ADB通信正常,但设备可能处于锁屏状态或未解锁。某些命令(如adb shell input text)在锁屏状态下会失败。
  • 误区三:忽视adb help的输出差异。不同版本的ADB,其help输出内容可能不同。在阅读教程或脚本时,应以本机adb help的输出为准。
  • 误区四:在非root权限下使用Linux USB调试。在Ubuntu等Linux系统上,如果未配置udev规则,普通用户执行adb devices会显示no permissions。此时应配置udev规则,而不是使用sudo adb,因为sudo会改变文件属主,可能导致后续文件操作权限混乱。

总结复盘:本章节所讲的三个命令是ADB调试的基石。adb devices用于确认设备连接状态,是排障的第一步;adb version用于确认工具版本,是环境自检的关键;adb help是随时可查的命令手册。掌握这三个命令,并深刻理解其输出背后的架构原理,能够帮助开发者快速定位问题,为后续学习adb install、adb shell、adb logcat等高级命令打下坚实的基础。建议读者在实战中反复练习,尤其是在多设备环境下,熟练使用-s参数进行设备选择。