USB 的 HOST 和 DEVICE 到底有什么区别?ADB 调试应该选哪个?

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 设备接入鼠标为例,过程可以简化为:

  1. Android 的 USB 主机控制器检测到有设备接入。
  2. 主机读取设备描述信息,了解厂商、产品和功能等信息。
  3. 主机为设备分配地址,并选择配置。
  4. 系统为相应接口匹配驱动。
  5. 主机安排传输,系统收到鼠标移动、点击等报告。

前面的识别和配置过程通常称为 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。

相关推荐
奶油话梅糖1 小时前
苹果的内核跑上了安卓手机:2,631 Star 的 HakiOS 让 XNU 在 Adreno GPU 上画出 118 帧
android·macos·智能手机
恋猫de小郭1 小时前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter
好的佩奇12 小时前
Dart 之扩展类型
android·flutter·dart
alexhilton14 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
灿飞屋16 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
疯华整猫17 小时前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
TimeFine19 小时前
AI 编程工作流的设计:从人工判断到 AI裁判
android·ai编程
阿杰m19 小时前
Android源码第四章:Android 系统启动——App 的第一行代码从哪来?
android
疯华整猫1 天前
混淆起初根本不是为了防破解:我用 Trae 把 Android 混淆这二十来年重跑了一遍
android·人工智能·计算机视觉