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 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 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+的新特性。
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参数指定目标设备序列号。
实际操作步骤:
- 执行
adb devices获取所有设备的序列号列表。 - 向序列号为
R58M23ABC的设备安装测试包:adb -s R58M23ABC install app-debug.apk - 向模拟器安装测试包:
adb -s emulator-5554 install app-debug.apk - 若需要针对网络连接的设备(如
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参数进行设备选择。