使用Android模拟器进行远程调试

时间:2009-11-18 07:08:18

标签: android android-emulator

是否可以在一台机器上编写代码/编译Android应用程序并在另一台机器上启动的仿真器上远程调试?我厌倦了模拟器不断吃掉我笔记本电脑CPU的一半。

9 个答案:

答案 0 :(得分:66)

我之前没有尝试过(甚至注意到)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 - 我可以像在本地计算机上运行一样使用它。

答案 1 :(得分:20)

以下是我在Windows上解决它的方法。我几乎跟随克里斯托弗的领导,但我无法编辑,因此需要做出新的答案。

我遇到的问题是ADB和模拟器只是在监听127.0.0.1而不是0.0.0.0。否则我会使用TCPMon。我想这在Windows上要么不同,要么在最新版本的SDK中有所改变。 (您可以查看netstat -ban。)

  1. 我在运行模拟器的计算机上安装了WinSSHD。 (我相信它也适用于freeSSHd,但我无法在那里登录。)

  2. 我在Windows防火墙中打开了端口22(TCP)。 (WinSSHD也许可以为你做到这一点。)

  3. 我在WinSSHD GUI中创建了一个虚拟帐户。

  4. 我从开发机器到模拟器机器创建了一个新的PuTTY连接,并确保我可以连接。

  5. 然后我在PuTTY设置隧道:连接 - > SSH - >隧道

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto

    (连接并保持PuTTY打开,以维护隧道。)

  6. 现在我在远程计算机上启动了模拟器,并确保ADB没有在那里运行。

  7. 我在开发计算机上重新启动了ADB(adb kill-server,然后adb start-server)。

  8. adb devices,远程模拟器显示为emulator-5554 device。我现在可以直接从Eclipse / ADT部署和运行我的应用程序,其中模拟器出现在虚拟设备下,就好像它是本地模拟器一样。

答案 2 :(得分:18)

我意识到这个问题真的很老了,但我解决问题的方式略有不同,我花了一些时间来弄清楚这个简单的解决方案。

我通常使用Windows7 PC或笔记本电脑(取决于我工作的地方)作为我的前端,因为我喜欢GUI,但我更喜欢在无头Ubuntu服务器上进行所有编辑/编译/调试,因为它提供的所有命令行功率。我的目标是尽可能地使每个Windows系统成为瘦客户端,而无需任何额外服务(例如sshd)或防火墙漏洞。

所以这是senario:

  • System-A:运行Android模拟器的Windows7系统
  • System-B:安装了SDK的Ubuntu服务器

前面描述的问题是System-A上的模拟器绑定到localhost而不是外部以太网接口,因此System-B上的adb无法访问System-A上的模拟器。您需要做的就是在PuTTY中设置远程端口转发,以便与System-B建立SSH连接。诀窍是在创建两个隧道时检查“远程”单选按钮,以便隧道方向反转(从您登录的服务器隧道到您登录的客户端)。

tunnel screenshot

最后,在建立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服务器在System-A上运行,而不是在启动SSH会话之前在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

最后,重启ssh会话到System-B并验证

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device

答案 3 :(得分:5)

如果您的两台计算机位于同一个专用网络中,因此我找到了一种简单的方法,因此不需要使用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,它们是模拟器使用的端口(实际上,第一个lauched模拟器 - 如果你有几个运行它们将使用更高的端口号,如本页的其他回复中所示。)

  • 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进行机器/机器交换,但当然,只要它们尚未使用,您就可以使用其他端口。

答案 4 :(得分:2)

当我的ssh服务无法启动时,我的解决方案是Windows + AndroVM(需要一个仅限主机的适配器)。因此它不需要任何其他软件。

adb connect <Andro VM IP>
adp tcpip 555

在cmd提示符下以admin:

运行
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>

在Windows防火墙中打开TCP端口5555。

然后,从第二次PC运行:

adb connect <host ip>

答案 5 :(得分:1)

所提议的解决方案都不适合我。 我从Emirikol的解决方案开始并对其进行了改进,就像新的Android API&gt;一样。 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/ 免责声明,我是作者。

答案 6 :(得分:1)

运行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”的计算机)。

答案 7 :(得分:0)

我没有配备SDK的第二台机器,但我注意到模拟器的监听端口(默认为5554,5555)正在监听0.0.0.0,即可从远程机器上访问,而adb --help 1}}显示connect <host>:<port>命令。我认为这会使它显示在adb devices中,因此adb命令会对其起作用。对于Eclipse,请尝试“运行/运行配置...”并将目标设置为手动。这给了你一个“设备选择器”,我猜它会包含一个远程模拟器,如果adb连接到它。值得一试。

答案 8 :(得分:0)

Android 模拟器默认侦听本地端口 5555,因此连接到远程模拟器的一种方法是使用端口转发工具将所有 LAN 数据包转发到本地 5555 端口。

一个这样优秀的工具是Trivial Port Forward

命令如下:

trivial_portforward.exe 1234 127.0.0.1 5555

这里的 1234 是开发计算机将连接的端口号。 127.0.0.1 是环回地址,5555 是模拟器的端口。

更详细的例子,see my blog post