好的,这里没有伏都教,没有盲目尝试和(我希望)很好地解释了这个问题的解决方案(很抱歉,我几乎一整天都在谷歌上搜索解决方案,但无济于事)。
首先,让我们了解一下 adb 与设备通信的方式:
https ://android.googlesource.com/platform/system/core/+/master/adb/protocol.txt
小故事:主机 adb 在 5037 上建立服务器,通过 tcp 端口 5555(默认)连接到设备上的 adbd。
这意味着 - 要工作,您的 adb 必须有一条通往本地 5037 和远程 5555 的清晰道路。如果您不能或不想先建立 USB 连接,您可以在设备上设置 adbd(使用设备终端)进行监听使用 USB:
setprop service.adb.tcp.port 5555
stop adbd
start adbd
检查netstat -plant | grep adbd
adbd 是否正在侦听端口 5555(或您选择的任何其他端口)。
现在使用捕获过滤器启动 Wireshark port 5555
。在您的主机上执行此命令:(adb connect device_ip:5555
如果您使用的是非标准端口,请替换 5555)。
根据上面的文档,您应该会看到CNXN
来自两个方向的命令!如果你的远端没有回复,adb devices
会说你的设备是offline
!一场比赛结束了。adb devices
不进行任何网络交换,它只是向您显示adb connect
命令的结果。
我的问题是 - 我一直在使用 NAT 网络并转发 5555 端口的 Virtualbox 内运行 Android。另外,我在端口 5554 上运行了一个模拟器。它没有占用 5555,但是不知何故,这两个干扰并破坏了 Virtualbox 在较低级别的连接,因为我有很多奇怪的重复 ACK 和 RST 在整个接口上飞来飞去。解决这个问题的方法是选择一个不同的端口。
如果我错了,请告诉我,但我之前没有看到有人提出这个建议。既没有解释它应该如何工作以及为什么工作。