我之前没有尝试过(甚至没有注意到)cmb提到的adb connect
命令,但我可以确认自己转发TCP端口 - 比如通过SSH - 是可行的。
模拟器每个实例监听两个TCP端口:5554用于telnet接口,5555用于与DDMS等工具进行控制通信。因此,您可能只需要转发端口5555(虽然我只尝试过使用两个端口)。随后的每个模拟器都采用下一个可用的偶数+奇数端口号元组(最多到5580左右)。
作为参考,在我的本地机器上执行了以下步骤:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
我相信模拟器在启动时会尝试通知本地的adb服务器;因此需要重新启动adb以便它能够探测本地的5554+端口。
请注意,ssh命令中的localhost
指的是远程机器的本地接口。
adb devices
显示了一个新的模拟器 - emulator-5554
- 我可以像在本地机器上运行一样使用它。
我知道这个问题已经很老了,但是我以稍微不同的方式解决了这个问题,并花了一些时间才找到这个微不足道的解决方案。
通常我会使用Windows7电脑或笔记本电脑(根据我的工作地点)作为我的前端,因为我喜欢图形用户界面(GUI),但是我更喜欢在无头Ubuntu服务器上进行所有编辑/编译/调试,因为它提供了命令行强大的功能。我的目标是尽可能将每个Windows系统作为纯客户机而没有任何额外的服务(例如sshd)或防火墙漏洞。
所以这里是场景:
正如之前描述的那样,问题在于System-A上的模拟器绑定到了localhost而不是外部以太网接口,因此System-B上的adb无法访问System-A上的模拟器。你需要做的就是在PuTTY中为与System-B的SSH连接设置远程端口转发。诀窍是在创建两个隧道时选中"Remote"单选按钮,以便隧道方向被反转(从您登录的服务器隧道到你从中登录的客户端)。
最后,在建立SSH连接后,使用adb连接到System-B上的"localhost"。
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
现在你可以像往常一样下载图像/调试,如果你想把电脑拿出去喝咖啡,切换到另一个Windows系统也是微不足道的事情。
此外,通过以相同的方式隧道传输端口5037,您实际上可以转发adb服务器连接,这样您就可以在System-A上通过USB连接真正的Android设备,并从System-B向其下载图像。为了使此功能正常工作,您需要确保adb服务器在启动SSH会话之前在System-A上运行,并且在System-B上没有运行:
首先,在System-A上启动adb服务器(命令提示符)
C:\> adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
C:\> adb devices
List of devices attached
3435F6E6035B00EC device
接下来,在System-B上关闭adb服务器。
System-B$ adb kill-server
最后,重新开始您与 System-B 的 ssh 会话并进行验证。
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
netstat -ban
进行检查。)
我在运行模拟器的机器上安装了WinSSHD。(我认为它也可以与freeSSHd一起使用,但我无法在那里获得登录权限。)
我在Windows防火墙中打开了端口22(TCP)。 (WinSSHD可能可以为您完成此操作。)
我在WinSSHD GUI中创建了一个虚拟账户。
我从开发机器到模拟器机器创建了一个新的PuTTY连接,并确保我可以连接。
然后我在PuTTY中设置了隧道:连接 -> SSH -> 隧道
源端口:5554
目标:localhost:5554
类型:本地/自动
源端口:5555
目标:localhost:5555
类型:本地/自动
(连接并保持PuTTY处于打开状态,以维护隧道。)
现在我在远程机器上启动了模拟器,并确保ADB未在该机器上运行。
我在开发机器上重新启动了ADB (adb kill-server
,然后 adb start-server
)。
adb devices
,远程模拟器显示为emulator-5554 device
。现在我可以直接从Eclipse/ADT部署和运行我的应用程序,在虚拟设备下模拟器显示为本地模拟器。
Run the emulator on one of the machines (let's say its host name is HostEmulator)
Start Eclipse on the other machine (let's call it HostEclipse)
Open a Cygwin terminal on each machine, and then,
On HostEmulator, enter the following cygwin commands:
hts -F localhost:5554 10000
hts -F localhost:5555 10001
hts指的是Http隧道服务器。
这两个命令创建了两个半桥,它们监听端口10001和10001,并将这些端口的I/O重定向到本地端口5554和5555,这些端口是模拟器使用的端口(实际上是第一个启动的模拟器 - 如果有多个运行,则会使用更高的端口号,如本页其他回复中所示)。
On HostEclipse, enter these ones:
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htc指的是Http隧道客户端。
这些命令创建了缺失的半桥。它们监听本地端口5554和5555,并将这些端口的I/O重定向到我们刚刚在HostEmulator上创建的半桥。
Then, still on HostEclipse, enter these three commands:
adb kill-server
adb start-server
adb devices
如果不重启adb,它将无法检测到远程模拟器。它必须在启动时进行一些扫描。然后列出设备(可用的模拟器)只是为了检查。
你可以像本地一样使用远程模拟器。 你必须在两台机器上都保持Cygwin终端打开,否则会导致创建的桥接失败。
我在这里使用10000和10001端口进行机器之间的交换,但是你当然可以使用其他端口,只要它们没有被占用。
adb -L tcp:remotehost:1234 devices
。如果它可以使用,那么你需要找出Android Studio是否支持远程ADB,我不会感到惊讶,如果它坚持使用本地设备。 - android.weaselnetsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
当我的ssh服务无法启动时,我为Windows + AndroVM(需要一个host-only适配器)提供了解决方案。因此,它不需要任何额外的软件。
adb connect <Andro VM IP>
adp tcpip 555
在管理员权限下的 CMD 提示符上运行:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
在Windows防火墙中打开TCP端口5555。
然后,在第二台电脑上运行:
adb connect <host ip>
注:
第一步:
在运行Android Studio的计算机上,打开终端窗口并运行以下命令。
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 dhaval@192.168.0.104
5554
和5555
端口转发到PC_EM上的相同端口。因此,在PC_EM上运行的模拟器可以在PC_AS上被检测到。dhaval@192.168.0.104
是PC_EM的地址。地址格式为用户名@本地IP地址
一旦您运行了上述命令,如果命令成功执行,终端窗口将不会显示任何内容。看起来好像什么也没有发生,但是该过程正在那里运行。
| 注意:在您想停止远程调试之前,请勿关闭此终端。
步骤2:
现在在PC_AS上打开另一个终端窗口,并依次运行以下命令。
killall adb;adb devices
此命令将停止adb并停止服务器。adb start-server
此命令将启动adb服务器。adb devices
此命令将列出所有已连接的adb设备。一旦您运行了上述命令,您将看到PC_EM的模拟器现在在PC_AS上被检测到。现在,您可以在这些模拟器上运行项目并进行远程调试。
| 注意:在执行上述过程时,模拟器可能会显示一个对话框来信任传入的请求。
Android模拟器默认监听本地端口5555,因此连接到远程模拟器的一种方法是使用端口转发工具将所有局域网数据包转发到本地5555端口。
其中一个优秀的工具是Trivial Port Forward
以下是命令:
trivial_portforward.exe 1234 127.0.0.1 5555
这里的1234是开发计算机将连接的端口号。127.0.0.1是环回地址,5555是模拟器的端口。
有关更详细的示例,请参阅我的博客文章。
这是我如何从主机macOS通过模拟器使其工作到macOS客户端的方法。
socat tcp-l:5560 tcp:localhost:5559
adb connect <IP>:5560
host$ adb kill-server
host$ adb -a nodaemon server
client$ adb kill-server
client$ ssh -L 5037:localhost:5037 <host-IP>
client$ adb kill-server # I observe first it kills client adb
client$ adb kill-server # then it kills server adb, do it maybe once more
client$ adb devices # show devices on server now
现在我也在Android Studio中看到了主机模拟器
killall adb
命令,因为模拟器无法接受多个连接,否则本地机器将无法与其建立连接。这会导致模拟器处于“离线”状态。 - Henrique de Sousa