来自adbtag wiki:
Android Debug Bridge (adb) 是一个通用的命令行工具,它可以让
您与模拟器实例或连接的 Android 驱动的通信
设备。它是一个客户端-服务器程序,包括三个组件:
- 在您的开发机器上运行的客户端。您可以通过发出 adb 命令从 shell 调用客户端。其他 Android 工具(例如 ADT 插件和 DDMS)也会创建 adb 客户端。
- 服务器,在您的开发机器上作为后台进程运行。服务器管理客户端和运行在模拟器或设备上的 adb 守护程序之间的通信。
- 一个守护进程,在每个模拟器或设备实例上作为后台进程运行。
adb connect 命令用于将本地adb 服务器 与网络连接设备上的adbd 守护进程 连接起来。但是你想要的是将本地adb client 连接到远程(在另一个系统上运行)adb server。 adb 可执行文件的默认行为是连接到adb 服务器 的本地实例。如果没有找到它会尝试启动一个。这种方法适用于所有开发都在单个系统上完成的大多数环境。但在更复杂的环境中,它可能会导致多个adb server 实例被启动。而且因为adbd daemon 只支持一次连接到单个adb 服务器 - 该设备将被一个系统识别,并且在其他任何地方都会出现丢失。
因此,为了让adb 能够可靠地识别那些更复杂配置中的设备,您需要告诉adb 停止猜测并手动指定adb 的哪一部分(即服务器 或client) 应该在哪个系统上运行。
首先确保您在本地和远程系统上都安装了相同且足够新的 adb 版本(最新的 Google 官方版本通常效果最好)。并且当前没有adb 服务器在任一系统上运行。
然后使用以下命令在远程系统(您将插入设备的系统)上启动adb server 的实例:
adb -a -P <PORT_NUMBER> nodaemon server
现在您可以通过将-H <REMOTE_IP> -P <PORT_NUMBER> 添加到您的adb 命令来强制本地系统上的adb 客户端使用另一个(远程)服务器,而不是启动它自己的(本地)实例:
adb -H <REMOTE_IP> -P <PORT_NUMBER> devices
或者,在客户端设置ANDROID_ADB_SERVER_ADDRESS=<REMOTE_IP> 和ANDROID_ADB_SERVER_PORT=<PORT_NUMBER> 环境变量可以让您避免必须为每个adb 命令指定<REMOTE_IP> 和<PORT_NUMBER>。
如果省略<PORT_NUMBER>,则默认为5037。
这个用于adb 编排的官方内置解决方案并不是SSH 隧道 的互斥替代方案——它只是解决了另一个更重要的问题。您可以在此基础上添加隧道以增加额外的安全性或帮助解决多站点网络环境中的路由问题。但单靠隧道并不能解决所有adb 连接问题。
虚拟化环境也是如此 - 在 host 和 guest 系统之间运行多个 adb server 实例也会导致 adb 连接问题。