是否可以在一台机器上编写代码/编译 Android 应用程序并在另一台机器上启动的模拟器上远程调试它?我厌倦了模拟器不断吃掉笔记本电脑一半的 CPU。
10 回答
我以前没有尝试过(甚至没有注意到)adb connect
cmb 提到的命令,但我可以确认自己转发 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+ 端口。
注意localhost
ssh 命令中的 是指远程机器的本地接口。
adb devices
展示了一个新的模拟器——emulator-5554
我可以使用它,就好像它在我的本地机器上运行一样。
这是我在 Windows 上解决它的方法。我几乎跟随克里斯托弗的领导,但我无法编辑,所以必须做一个新的答案。
我遇到的问题是 ADB 以及模拟器对我来说只是在监听 127.0.0.1,而不是 0.0.0.0。否则我会使用TCPMon。我猜这要么在 Windows 上有所不同,要么随着 SDK 的最新版本而改变。(您可以检查netstat -ban
。)
我在运行模拟器的机器上安装了WinSSHD 。(我相信它也应该与 freeSSHd 一起使用,但我无法在那里登录。)
我在 Windows 防火墙中打开了端口 22 (TCP)。(WinSSHD 或许可以为您做到这一点。)
我在 WinSSHD GUI 中创建了一个虚拟帐户。
我创建了一个从开发机器到模拟器机器的新 PuTTY 连接,并确保我可以连接。
然后我在 PuTTY 中设置隧道: Connection -> SSH -> Tunnels
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(连接并保持 PuTTY 打开,以维护隧道。)
现在我在远程机器上启动了模拟器,并确保 ADB 没有在那里运行。
我在开发机器上重新启动了 ADB (
adb kill-server
, thenadb start-server
)。adb devices
远程模拟器显示为emulator-5554 device
. 我现在可以直接从 Eclipse/ADT 部署和运行我的应用程序,其中模拟器显示在虚拟设备下,就好像它是本地模拟器一样。
我意识到这个问题真的很老,但我解决问题的方式略有不同,我花了一段时间才弄清楚这个微不足道的解决方案。
我通常使用 Windows7 PC 或笔记本电脑(取决于我在哪里工作)作为我的前端,因为我喜欢 GUI,但是我更喜欢在无头 Ubuntu 服务器上进行所有编辑/编译/调试,因为所有它提供的命令行功能。我的目标是让每个 Windows 系统尽可能地成为一个瘦客户端,而不需要任何额外的服务(例如 sshd)或防火墙漏洞。
所以这里是情景:
- System-A:运行安卓模拟器的Windows7系统
- System-B:安装了 SDK 的 Ubuntu 服务器
如前所述,问题是 System-A 上的模拟器绑定到 localhost,而不是外部以太网接口,因此 System-B 上的 adb 无法访问 System-A 上的模拟器。您需要做的就是在 PuTTY 中为您的 SSH 连接到 System-B 设置远程端口转发。诀窍是在创建两个隧道时检查“远程”单选按钮,以便反转隧道方向(从您登录的服务器到您登录的客户端的隧道)。
最后,在建立 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 服务器连接,以便您可以通过 USB 连接到 System-A 上的真实 android 设备,并从 System-B 下载图像到它。为了让它工作,你需要确保 adb 服务器在 System-A 上运行,而不是在 System-B 上运行,然后再开始你的 SSH 会话:
首先,在 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
如果您的两台机器在同一个专用网络中,因此不需要使用 SSH 加密(这是常见情况),我找到了一种简单的方法来执行此操作。这可能会有所帮助,因为 SSH 隧道可能很长且难以安装。比如第一次在 Cygwin/Windows 下安装 SSH 守护进程可能会导致放弃(好吧,我放弃了)。
在 Windows 下,接下来需要安装 Cygwin 和httptunnel包。这也必须在 Linux / httptunnel下工作,但我没有尝试。
在其中一台机器上运行模拟器(假设它的主机名是HostEmulator)
在另一台机器上启动 Eclipse(我们称之为HostEclipse)
在每台机器上打开一个 Cygwin 终端,然后,
在HostEmulator 上,输入以下 cygwin 命令:
hts -F localhost:5554 10000 hts -F localhost:5555 10001
hts表示Http Tunnel Server。
这两个命令创建了两个半桥,侦听端口 10001 和 10001,并将这些端口的 I/O 重定向到本地端口 5554 和 5555,这是模拟器使用的端口(实际上,第一个启动的模拟器 -如果您有几个在运行,他们将使用更高的端口号,如本页其他回复中所示)。
在HostEclipse 上,输入这些:
htc -F 5554 HostEmulator:10000 htc -F 5555 HostEmulator:10001
htc表示Http Tunnel Client。
这些命令会创建缺失的半桥。它们监听本地端口 5554 和 5555,并将这些端口的 I/O 重定向到我们之前在HostEmulator上创建的半桥。
然后,仍然在HostEclipse上,输入以下三个命令:
adb kill-server adb start-server adb devices
这将重新启动 adb,因为它不会检测到远程仿真器。它必须在启动时进行一些扫描。然后它列出了设备(可用的模拟器)只是为了检查。
- 你去吧。
您可以像使用本地模拟器一样使用远程模拟器。你必须在两台机器上保持 Cygwin 终端打开,否则你会杀死你创建的半桥。
我在这里使用端口 10000 和 10001 进行机器/机器交换,但当然您可以使用其他端口,只要它们尚未使用。
当我的 ssh 服务无法启动时,我的 windows + AndroVM 解决方案(需要仅主机适配器)。所以它不需要任何额外的软件。
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。
然后,从第二台 PC 运行:
adb connect <host ip>
建议的解决方案都不适合我。我从 Emirikol 的解决方案开始并对其进行了改进,因为新的 Android API > 21 模拟器出现离线,我不得不去 Genymotion 设置并将 Android SDK 路径留空。从命令行:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
来源: http: //www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ 免责声明,我是作者。
当您运行 adb 时,它会启动自己的服务器副本(如果尚未运行)。您可以使用设备在机器上自己启动该副本,并且从 sdk 4.3 开始,您可以为其提供 -a 选项来告诉该服务器侦听远程机器。使用以下不退出的命令执行此操作:
adb -a -P 5037 服务器节点
在要使用设备的机器上,在环境变量中将 ADB_SERVER_SOCKET 设置为 tcp:xxxx:5037(或使用 -L 选项为每个 adb 调用提供相同的值),其中 xxxx 是 IP 地址或主机名机器与设备,并且 5037 与您在上面的命令中提供的端口匹配。
我们使用它来访问分布在 3 台机器上的大约 100 个仿真器,以及并行运行端到端测试的机器,以及希望远程共享真实设备的开发人员。
您可以使用 adb forward 和 adb reverse 将端口转发到模拟器或从模拟器转发端口,它们将出现在带有设备的机器上(而不是您正在运行“adb forward”的机器)。
Android 模拟器默认侦听本地端口 5555,因此连接到远程模拟器的一种方法是使用端口转发工具将所有 LAN 数据包转发到本地 5555 端口。
一个这样优秀的工具是Trivial Port Forward
这是命令:
trivial_portforward.exe 1234 127.0.0.1 5555
这里的 1234 是开发计算机将连接的端口号。127.0.0.1 是环回地址,5555 是模拟器的端口。
有关更详细的示例,请参阅我的博客文章。
这篇文章包含许多答案,但缺少分步说明。
因此,此答案将解释如何连接两台计算机以在另一台计算机的模拟器上运行一台计算机的项目。
进一步前的要求:
- 两台电脑的防火墙都应该关闭。
- 两台 PC 必须连接在同一网络中。
笔记:
- 运行 Android Studio 的计算机被称为“PC_AS”
- 运行模拟器的计算机被称为“PC_EM”
第1步:
在运行 Android Studio 的计算机上,打开终端窗口并运行以下命令。
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 dhaval@192.168.0.104
- 上述命令会将PC_AS
5554
的5555
端口转发到 PC_EM 上的相同端口。因此,PC_EM 上运行的仿真器可以在 PC_AS 上检测到。 dhaval@192.168.0.104
是 PC_EM 的地址。地址格式为username@local_ip_address
运行上述命令后,如果命令执行成功,终端窗口将不会显示任何内容。看起来什么都没有发生,但该过程正在那里运行。
| 注意:在您想停止远程调试之前,请勿关闭此终端。
第2步:
现在在 PC_AS 上打开另一个终端窗口并逐个运行以下命令。
killall adb;adb devices
此命令将停止 adb 并停止服务器。adb start-server
此命令将启动 adb 服务器。adb devices
此命令将列出所有连接的 adb 设备。
运行上述命令后,您将看到现在在 PC_AS 中检测到 PC_EM 的仿真器。现在您可以在这些模拟器上运行项目并进行远程调试。
| 注意:在执行上述过程时,模拟器可以显示一个对话框来信任传入的请求。
我手头没有第二台带有 SDK 的机器,但我注意到模拟器的侦听端口(默认 5554、5555)正在侦听0.0.0.0
,即可以从远程机器访问,并且adb --help
显示connect <host>:<port>
命令。我认为这会使它出现在命令中adb devices
。adb
对于 Eclipse,尝试“运行/运行配置...”并将目标设置为手动。这给了你一个“设备选择器”,我猜如果 adb 连接到它,它会包括一个远程模拟器。值得一试。