3. 设备连接与管理:USB连接、Wi-Fi连接、多设备管理、设备状态检测

设备连接是ADB调试的第一步,也是很多新手最容易卡住的地方。我见过不少同事,明明驱动装了、USB调试也开了,但就是连不上设备。说白了,就是没搞懂ADB的设备状态机是怎么工作的。

这一节,咱们把设备连接的几种方式、常见状态、以及多设备场景下的管理技巧,一次性讲透。

3.1 USB连接:最基础也是最容易出问题的方式

USB连接是ADB最传统的连接方式。你想想看,一根线插上去,就能跑日志、装应用、甚至执行shell命令,确实方便。但为什么有时候插上去就是识别不了?

3.1.1 连接前的准备工作

在插线之前,有几步必须确认:

  • 开启开发者选项:进入「设置」→「关于手机」,连续点击「版本号」7次,直到提示「您已处于开发者模式」。
  • 开启USB调试:在「开发者选项」中,找到「USB调试」并打开。
  • 安装驱动:Windows系统需要安装设备对应的USB驱动。我个人习惯用adb devices命令来验证驱动是否生效,而不是去设备管理器里瞎翻。
小技巧:如果你用的是Windows,插上设备后打开设备管理器,如果看到带黄色感叹号的「Android设备」,说明驱动没装好。去下载一个「通用ADB驱动」或者用厂商提供的驱动包,基本都能解决。

3.1.2 连接与授权流程

插上USB线后,执行adb devices,你会看到类似这样的输出:

List of devices attached
0123456789ABCDEF    unauthorized

嗯,这里要注意。第一次连接时,设备屏幕上会弹出一个授权对话框,询问是否允许这台电脑进行USB调试。你必须勾选「一律允许使用这台计算机进行调试」,然后点击「确定」。否则,设备状态会一直停留在unauthorized。

为什么会这样?因为ADB在传输层之上加了一层RSA密钥认证机制。每次连接时,主机会生成一对密钥,把公钥发给设备。设备会记录信任的主机公钥。如果公钥不匹配,或者你点了「拒绝」,那设备就会一直处于unauthorized状态。

避坑指南:我曾经在调试一款国产平板时,插上USB后设备一直不弹出授权对话框。后来发现是USB线的问题——那根线只能充电,不能传数据。换了一根带数据传输功能的线,问题立刻解决。所以,如果遇到unauthorized且没有弹窗,先换根线试试。

3.2 Wi-Fi连接:摆脱线缆的束缚

USB线虽然稳定,但有时候确实不方便。比如你在测试设备在特定位置的行为,或者同时调试多台设备时,Wi-Fi连接就派上用场了。

3.2.1 两种Wi-Fi连接方式

方式 适用场景 命令示例
TCP/IP模式(Android 11+) 设备与电脑在同一局域网 adb connect 192.168.1.100:5555
无线调试模式(Android 11+) 无需USB线,通过配对码连接 adb pair 192.168.1.100:41327

对于Android 10及以下版本,你需要先用USB线连接设备,然后执行以下命令切换到TCP/IP模式:

adb tcpip 5555
adb connect 192.168.1.100:5555

对于Android 11及以上版本,Google引入了「无线调试」功能。你可以在开发者选项中开启「无线调试」,然后使用配对码连接,全程不需要USB线。

核心要点:Wi-Fi连接虽然方便,但稳定性不如USB。如果你在抓取大量日志或者执行长时间的压力测试,我建议还是用USB线。Wi-Fi连接更适合日常的快速调试和日志查看。

3.3 多设备管理:同时操作多台设备

在实际项目中,你很可能需要同时管理多台设备。比如我在测试一款App的兼容性时,桌上经常摆着四五台不同品牌、不同Android版本的手机。这时候,adb devices命令就变成了我的主力工具。

3.3.1 查看已连接的设备列表

adb devices -l

加上-l参数后,输出会更详细,包括设备的型号、产品名、USB端口等信息。比如:

List of devices attached
0123456789ABCDEF       device product:walleye model:Pixel_2 device:walleye
9876543210FEDCBA       device product:blueline model:Pixel_3 device:blueline

3.3.2 指定设备执行命令

当有多台设备时,你不能直接执行adb shell,否则ADB会报错「error: more than one device/emulator」。你需要用-s参数指定设备序列号:

adb -s 0123456789ABCDEF shell
adb -s 9876543210FEDCBA install app.apk

我个人习惯给每台设备贴一个标签,写上它的序列号后几位。这样在命令行里输入时,不用每次都去查完整的序列号。

3.3.3 批量操作脚本

如果你需要同时对多台设备执行相同的操作,可以写一个简单的shell脚本:

#!/bin/bash
for device in $(adb devices | grep "device$" | awk '{print $1}'); do
    echo "正在操作设备: $device"
    adb -s $device install -r myapp.apk
done

这个脚本会遍历所有状态为device的设备,依次安装应用。我在做自动化测试时经常用这个套路,省了不少时间。

3.4 设备状态检测:device / offline / unauthorized

ADB设备有四种状态,理解它们之间的区别,能帮你快速定位连接问题。

状态 含义 常见原因
device 设备已连接且授权成功,可以正常通信 正常状态
offline 设备已连接,但ADB无法与设备通信 ADB服务异常、设备端ADB进程崩溃、USB线接触不良
unauthorized 设备已连接,但未授权当前主机 未点击授权弹窗、公钥不匹配、设备端USB调试未开启
no device 没有检测到任何设备 驱动未安装、USB线损坏、设备未开启USB调试
避坑指南:我曾经遇到过一个诡异的问题——设备状态在device和offline之间反复跳变。折腾了半天,最后发现是USB线太长(3米),信号衰减导致的。换成1米以内的短线后,问题消失。所以,如果你遇到offline状态,先检查USB线缆质量。

3.5 知识结构图:设备连接与管理的核心流程

下面这张图总结了设备连接与管理的核心流程,从连接方式到状态检测,再到多设备管理,一目了然。

ADB设备连接与管理核心流程 ADB设备连接与管理核心流程 ADB设备连接 USB连接 Wi-Fi连接 开启USB调试 安装驱动 adb tcpip 5555 adb connect IP:5555 设备状态检测 device offline unauthorized no device

3.6 实战建议:建立你的设备管理习惯

最后,分享几个我在项目中养成的习惯,希望能帮你少走弯路:

  • 每次插线前,先执行adb kill-server再adb start-server:这能清除ADB服务端的缓存状态,避免一些莫名其妙的连接问题。
  • 给设备贴标签:多设备场景下,用标签纸写上设备序列号后4位和Android版本,贴在设备背面。这样在命令行里操作时,一眼就能认出是哪台设备。
  • 用adb devices -l代替adb devices:多出来的几行信息(型号、产品名)能帮你快速确认当前连接的是哪台设备,尤其是在多台同型号设备同时连接时。
  • Wi-Fi连接不稳定时,切回USB:如果Wi-Fi连接频繁断开,别硬撑。切回USB线,等调试完再切回来。效率比「优雅」更重要。