是否可以在一台计算机上编写代码/编译Android应用程序,并在另一台计算机上启动的模拟器上进行远程调试?我厌倦了模拟器不断消耗笔记本电脑一半的CPU。
Answers:
我以前没有尝试过(甚至没有注意到)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
—我可以像在本地计算机上运行它一样使用它。
killall adb
在服务器上,因为仿真器将不接受多个连接,而是offline
用于本地计算机。
这是我在Windows上解决它的方法。我几乎追随克里斯托弗(Christopher)的步伐,但我无法编辑,因此必须做一个新的答案。
我遇到的问题是,对于我来说,ADB和仿真器只是在监听127.0.0.1,而不是0.0.0.0。否则我会使用TCPMon。我想这可能与Windows有所不同,或者随着最新版本的SDK发生了变化。(您可以通过进行检查netstat -ban
。)
我在运行模拟器的计算机上安装了WinSSHD。(我相信它也可以与freeSSHd一起使用,但是我无法在那里登录。)
我在Windows防火墙中打开了端口22(TCP)。(WinSSHD也许可以为您做到这一点。)
我在WinSSHD GUI中创建了一个虚拟帐户。
我创建了一个从开发机到仿真机的新PuTTY连接,并确保可以连接。
然后我在PuTTY中设置隧道:连接-> SSH->隧道
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(连接并保持腻子开放,以维护隧道。)
现在,我在远程计算机上启动了仿真器,并确保ADB没有在该计算机上运行。
我在开发计算机(adb kill-server
,然后adb start-server
)上重新启动了ADB 。
adb devices
远程仿真器显示为emulator-5554 device
。现在,我可以直接从Eclipse / ADT部署和运行我的应用程序,该模拟器在虚拟设备下显示在虚拟设备下,就好像它是本地模拟器一样。
我意识到这个问题确实很老,但是我以稍微不同的方式解决了这个问题,我花了一些时间才找到这个简单的解决方案。
我通常使用Windows7 PC或便携式计算机(取决于我在哪里工作)作为前端,因为我喜欢GUI,但是由于所有这些原因,我更喜欢在无头的Ubuntu服务器上进行所有的编辑/编译/调试。它提供的命令行功能。我的目标是使每个Windows系统尽可能多地成为瘦客户端,而没有任何额外的服务(例如sshd)或防火墙漏洞。
所以这是senario:
如前所述,问题是系统A上的仿真器绑定到本地主机,而不是外部以太网接口,因此系统B上的adb无法访问系统A上的仿真器。您需要做的就是在PuTTY中设置远程端口转发,以实现与System-B的SSH连接。诀窍是在创建两个隧道时选中“远程”单选按钮,以使隧道方向反向(从正在登录的服务器到正在登录的客户端的隧道)。
最后,在建立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下载图像。为了使它起作用,您需要在启动SSH会话之前确保adb服务器在系统A上运行,而不在系统B上运行:
首先,在系统-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
最后,重新启动与系统B的ssh会话并进行验证
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
如果您的两台计算机位于同一专用网络中,因此不需要使用SSH加密(这是常见的情况),我发现了一种简便的方法。这可能会有所帮助,因为SSH隧道可能很长且难以安装。例如,第一次在Cygwin / Windows下安装SSH守护程序可能会导致放弃(嗯,我放弃了)。
在Windows下,接下来需要安装带有软件包httptunnel的 Cygwin 。这也必须在Linux / httptunnel下工作,但我没有尝试。
在其中一台计算机上运行仿真器(假设其主机名为HostEmulator)
在另一台机器上启动Eclipse(我们将其称为HostEclipse)
在每台计算机上打开一个Cygwin终端,然后,
在HostEmulator上,输入以下cygwin命令:
hts -F localhost:5554 10000
hts -F localhost:5555 10001
hts表示Http隧道服务器。
这两个命令创建了两个半桥,它们监听端口10001和10001,并将这些端口的I / O重定向到本地端口5554和5555,它们是仿真器使用的端口(实际上是第一个启动的仿真器-如果其中有几个正在运行,则它们将使用更高的端口号,如本页其他答复所示)。
在HostEclipse上,输入以下内容:
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htc表示Http隧道客户端。
这些命令创建丢失的半桥。他们监听本地端口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服务器nodaemon
在要使用该设备的计算机上,在环境变量中将ADB_SERVER_SOCKET设置为tcp:xxxx:5037(或使用-L选项为每个adb调用赋予相同的值),其中xxxx是服务器的IP地址或主机名。机器和设备,并且5037与您在上面的命令中指定的端口相匹配。
我们使用它可以访问分布在3台计算机上的约100个仿真器,并行运行的端到端测试计算机以及希望远程共享真实设备的开发人员。
您可以使用adb forward和adb reverse将端口转发到仿真器和从仿真器转发端口,它们将与设备一起出现在计算机上(而不是从中运行“ adb forward”的计算机)。
adb -L tcp:remotehost:1234 devices
如果可以,那么您需要确定Android Studio是否支持远程ADB-如果它坚持使用,就不会感到惊讶。本地设备。