USB 的 HOST 和 DEVICE 到底有什么区别?ADB 调试应该选哪个?
每次给 Android 工控屏接电脑,看到「USB OTG 模式」里的 HOST 和 DEVICE,总要想一下该选哪个。
先把最常用的答案放在这里:
电脑通过 USB 调试这台 Android 设备:Android 端选 DEVICE,并开启 ADB 调试。
这台 Android 设备要接 U 盘、鼠标等 USB 外设:对应接口选 HOST。
通过网络连接 ADB:USB 角色不决定这条网络连接能否建立。
记忆口诀:接电脑,让电脑管;接外设,由我来管。 这里的「管」,指管理 USB 通信。
1. 先理解:USB 两端承担不同的角色
日常看起来,USB 就是一根连接两台设备的线。但在普通 USB 数据连接里,两端的职责有明确分工:
| 角色 | 中文理解 | 主要职责 |
|---|---|---|
| HOST | 主机端 | 识别接入的设备、配置设备、安排数据传输 |
| DEVICE | 设备端,也常称外设端 | 向主机报告自己的能力,响应主机的请求并交换数据 |
这里的「主机」不是专指台式电脑,「设备」也不是专指性能弱的小东西。它们描述的是某条 USB 连接上的角色。
一台运行完整 Android 系统的工控屏,既能当 HOST,也可能当 DEVICE,取决于硬件和当前设置。
例如,同一台 Android 设备在两种场景下的角色是:
text
场景一:电脑连接 Android 设备,进行 USB ADB 调试
电脑:HOST ←──── USB 数据线 ────→ Android:DEVICE
场景二:Android 设备连接鼠标
Android:HOST ←──── USB 数据线 ────→ 鼠标:DEVICE
角色会变,机器本身没有变。 Linux USB 文档也明确区分了主机侧和设备侧的软件实现。参考:Linux USB 主机侧文档
2. HOST 到底在「管」什么?
可以把 HOST 想成会议主持人,把 DEVICE 想成参会者:主持人先确认谁来了,再了解对方能做什么,最后安排交流。
以 Android 设备接入鼠标为例,过程可以简化为:
- Android 的 USB 主机控制器检测到有设备接入。
- 主机读取设备描述信息,了解厂商、产品和功能等信息。
- 主机为设备分配地址,并选择配置。
- 系统为相应接口匹配驱动。
- 主机安排传输,系统收到鼠标移动、点击等报告。
前面的识别和配置过程通常称为 USB 枚举 。Android 官方对 HOST 模式的描述就包含为总线供电、枚举连接设备等职责。参考:Android USB Host
这里容易产生一个误解:既然主机安排通信,是否只有主机能发送数据?
两端都能收发数据。 主机角色描述的是总线管理和传输调度权,不是数据只能向一个方向流动。以常见的 USB 2.0 鼠标为例,鼠标会准备好输入报告,由主机发起相应的读取传输。
也就是说:谁产生数据,和谁安排 USB 传输,是两件事。
3. DEVICE 模式在做什么?
切到 DEVICE 模式后,这个 USB 接口要向对面的主机展示自己提供的功能。
Android 连接电脑时,可能提供文件传输、照片传输、ADB 调试等功能。底层可以把多个功能组合在同一个 USB 设备里,让电脑分别识别和使用。
在 Linux/Android 的相关资料中,这类设备端实现经常叫 USB Gadget 。可以把它理解成:系统通过 USB 接口,向外提供哪些功能。参考:Linux USB Gadget
因此,需要分开看两个设置:
| 设置 | 回答的问题 |
|---|---|
| HOST / DEVICE | 这个接口在 USB 连接里承担什么角色? |
| ADB 调试开关 | 系统是否允许通过 ADB 进行调试? |
对常见的电脑直连 Android 的 USB ADB 场景来说,DEVICE 角色和 ADB 调试都需要配置正确。只开启 ADB,不能让一个固定在 HOST 模式的接口自动变成电脑可识别的 ADB 设备。
4. 为什么 USB ADB 要选 DEVICE?
先把 ADB 的软件关系画出来:
text
电脑 Android 设备
adb 命令行 → adb server ←── USB 或网络连接 ──→ adbd → 执行命令
电脑上的 adb 命令把请求交给本机的 ADB server,再由它与 Android 设备上的 adbd 后台进程通信。例如执行 adb shell,就是借助这条通路进入设备的 shell。参考:ADB 工作原理
当中间走 USB 时,还需要满足 USB 本身的角色关系:
text
电脑提供 USB 主机能力
↓
Android 以 DEVICE 身份暴露 ADB 接口
↓
电脑识别接口,ADB 建立连接并完成授权
↓
执行 adb shell、adb install、adb logcat 等命令
如果把 Android 这一端也固定成 HOST,普通直连情况下两端都在等待识别外设,Android 没有以 DEVICE 身份向电脑提供 ADB 接口,这条 USB 调试通路就无法按上述方式建立。
另外,USB 的 HOST 和 ADB 的 server 是不同层面的概念 :前者描述 USB 角色,后者描述 ADB 软件中的后台服务。不要因为设备里运行着 adbd,就推断它应该选择 USB HOST。
5. OTG 又是什么?为什么这里能切模式?
OTG 是 On-The-Go 的缩写。理解这个设置时,可以先抓住它与 USB 角色切换有关这一点:具备相应硬件和软件支持的接口,可以在主机端和设备端之间切换。
传统 OTG、现代 USB-C 的双角色机制,具体实现并不完全相同。对使用者来说,关键是确认这个物理接口实际支持哪些角色,以及厂商如何控制角色切换 。参考:Linux Gadget 文档中的 OTG 支持
结合这台工控屏的截图,页面在「USB OTG 模式」下面显示 DEVICE,另一个可选状态是 HOST。据此可以理解为厂商把角色选择做成了手动开关。
看下方显示的 HOST / DEVICE 判断当前模式。 不要只记「蓝色是开、灰色是关」:这个开关的颜色与角色如何对应,属于厂商界面的具体设计。
截图显示的是:
text
USB OTG 模式:DEVICE
ADB 调试模式:开启
网络调试模式:开启
就 USB 角色和 ADB 调试开关而言,这已经符合电脑通过 USB 调试的要求;还需要接对接口、使用数据线,并完成可能出现的调试授权。
6. HOST 就是供电,DEVICE 就是充电吗?
在传统、常见的连接中,HOST 通常向 USB 总线提供电源。例如 Android 设备作为 HOST 接鼠标时,需要让鼠标获得工作电源。
但「谁管理数据」与「谁供电」是不同的问题。在支持相应协商能力的 USB-C/USB PD 系统中,数据角色和供电角色可以分别管理。因此,不能仅凭正在充电,判断它一定处于 DEVICE 模式。参考:Linux USB-C 的数据角色与供电角色
对这台有独立供电的工控屏,也不能因为它自己插着电源,就推断它的 USB 角色。做 ADB 调试时,直接检查模式文字和电脑的识别结果。
7. 实操:用 USB 连接 ADB
第一步:设置设备
进入设备的开发入口:
- 将目标 OTG 接口切到 DEVICE。
- 开启 ADB 调试模式。
- 用支持数据传输的 USB 线连接电脑与设备的 OTG/调试口。
一台工控设备可能同时有固定 HOST 口、可切换的 OTG 口和其他专用口。这个模式开关未必控制所有 USB 插口。 接口功能要以设备标识或说明书为准。
第二步:在电脑上检查
已安装 ADB 的电脑执行:
bash
adb devices -l
设备如弹出「允许 USB 调试」提示,确认后再检查。
正常结果示例:
text
List of devices attached
ABC123456 device product:example model:example device:example
这里第二列的 device 表示 ADB 连接状态正常。它与设置页面中的 USB DEVICE 恰好同名,表达的含义不同。
再执行一个简单命令,验证能否实际通信:
bash
adb shell getprop ro.product.model
能返回设备型号,就说明这条 ADB 通路已经可以执行命令。参考:启用和验证 ADB 调试
第三步:按结果排查
| 看到的结果 | 含义与下一步 |
|---|---|
| 列表为空 | 先检查 DEVICE 模式、ADB 开关、接口和数据线,再检查电脑端 USB 识别与驱动 |
unauthorized |
设备已被 ADB 发现,但尚未授权这台电脑;查看设备上的授权提示 |
offline |
ADB 连接未正常响应;尝试重插、重新连接,必要时重启电脑上的 ADB server |
device |
ADB 传输连接正常,可继续用简单命令验证 |
需要重启电脑上的 ADB server 时:
bash
adb kill-server
adb start-server
adb devices -l
这只会重启电脑侧的 ADB 服务,不能代替设备上的 USB 角色切换。
8. 网络 ADB 为什么不受这个模式限制?
因为 ADB 可以使用不同的传输通道:
text
USB ADB:电脑 ←── USB ──→ Android
网络 ADB:电脑 ←── IP 网络 ──→ Android
第二条路不经过那条 USB 数据连接,所以 Android 可以用 HOST 模式连接 USB 外设,同时通过网络接受电脑的 ADB 调试。这也是调试 USB 外设功能时很有用的办法。参考:USB 外设调试与网络 ADB
网络连接的具体步骤需要区分两种情况。
厂商提供的网络调试 / 传统 TCP ADB
部分工控设备开启「网络调试」后,会让 adbd 在某个 TCP 端口监听。如果厂商说明端口是 5555,且设备 IP 是 192.168.1.100,电脑可以执行:
bash
adb connect 192.168.1.100:5555
adb devices -l
这里的 IP 是示例;截图没有显示监听端口,不能据此断定这台设备一定使用 5555。
另一种常见方式,是先建立已授权的 USB ADB 连接,再在电脑执行:
bash
adb tcpip 5555
adb connect 192.168.1.100:5555
其中 adb tcpip 5555 是通过现有 ADB 连接,让设备上的 adbd 改为监听指定 TCP 端口。确认网络连接可用后,再拔掉 USB 线。
带配对码的无线调试
提供标准无线调试功能的 Android 系统,可以显示配对码与配对地址。对应命令是:
bash
adb pair 设备IP:配对端口
按提示输入配对码,若未自动连接,再使用无线调试页面显示的连接地址:
bash
adb connect 设备IP:连接端口
配对端口和连接端口可能不同,也不应默认填 5555。 这与传统的 adb tcpip 5555 流程有所区别。设备与电脑还需要网络互通,相关端口不能被网络隔离或防火墙阻断。参考:ADB 无线调试
9. 能不能一边接 USB 外设,一边用 USB ADB?
要看是否使用同一个接口,以及设备的 USB 硬件布局。
同一个普通双角色接口,在同一时刻通常选择一个数据角色。 它作为 HOST 连接鼠标时,不能再把这个接口同时当作 DEVICE 口直连电脑做普通 USB ADB。普通 USB Hub 也不能把两个 HOST 变成这种连接。
如果设备有相互独立的 HOST 口与 DEVICE/OTG 调试口,硬件和系统支持时,就可能同时工作:
text
固定 HOST 口 ──→ 鼠标、读卡器等外设
DEVICE 调试口 ←── 电脑通过 USB 连接 ADB
如果设备只有一个可用的双角色口,可以采用:
text
USB 口设为 HOST ──→ 连接外设
网络连接 ←── 电脑通过网络使用 ADB
这台设备是否支持两个物理口同时承担上述角色,需要查具体型号的接口说明,单凭设置截图无法确定。
10. 忘记时,回来查这张表
| 我现在要做什么? | Android 对应 USB 接口选什么? | 还需要什么? |
|---|---|---|
| 电脑通过 USB 安装 APK、看日志、执行 shell | DEVICE | ADB 调试、数据线、正确接口、授权 |
| Android 连接 U 盘、鼠标等外设 | HOST | 外设支持、驱动及必要的应用权限 |
| 电脑通过网络连接 ADB | 按 USB 外设需求决定 | 网络调试服务、正确地址和端口、必要的配对或授权 |
| 一边调 USB 外设,一边看 ADB 日志 | 外设接口用 HOST | 优先考虑网络 ADB,或独立的 DEVICE 调试口 |
下次再看到这个设置,先问自己:这根 USB 线对面,接的是电脑,还是要让我使用的外设?
接电脑调试选 DEVICE;接外设选 HOST。