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


93

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

Answers:


71

我以前没有尝试过(甚至没有注意到)adb connectcmb提到的命令,但是我可以确认自己转发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+端口。

请注意,localhostssh命令中的指远程计算机的本地接口。

adb devices显示了一个新的模拟器— emulator-5554—我可以像在本地计算机上运行它一样使用它。


1
即使在具有Putty SSH端口转发功能的Windows 7计算机上也可以正常工作。谢谢。
gsbabil 2012年

1
@JimMcKeeth:根据上述网络配置,打开Putty,转到“连接”>“ SSH”>“隧道”。现在添加一个带有Source-port:5556和Destination:localhost:5554的条目。对Source-port:5557和Destination:localhost:5555重复相同的操作。干杯!
gsbabil

5
只要记住您也需要killall adb在服务器上,因为仿真器将不接受多个连接,而是offline用于本地计算机。
Henrique de Sousa

有人可以用英语解释吗?
Anil GR

21

这是我在Windows上解决它的方法。我几乎追随克里斯托弗(Christopher)的步伐,但我无法编辑,因此必须做一个新的答案。

我遇到的问题是,对于我来说,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

    (连接并保持腻子开放,以维护隧道。)

  6. 现在,我在远程计算机上启动了仿真器,并确保ADB没有在该计算机上运行。

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

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


很棒!感谢您的详细信息。
2013年

1
很好,但是我想澄清一下:在第4步之后,您必须关闭腻子,然后在第5步中再次将其打开,配置隧道并重新连接。步骤6-8:首先启动模拟器,然后启动adb(在主机中)。步骤9:您可能想在客户端计算机上重新启动ADB,然后键入ADB设备以确保它正常。常规的DDMS和蚀食也应该起作用。
史密斯先生

@MisterSmith非常有效的观点,为什么不提交编辑?:)
Henrik Heimbuerger 2014年

@MisterSmith您能否编辑您的答案以反映此评论,这对问题的成功非常重要。另外,谢谢,我现在可以从客户机连接到主机。
meanbunny15年

20

我意识到这个问题确实很老,但是我以稍微不同的方式解决了这个问题,我花了一些时间才找到这个简单的解决方案。

我通常使用Windows7 PC或便携式计算机(取决于我在哪里工作)作为前端,因为我喜欢GUI,但是由于所有这些原因,我更喜欢在无头的Ubuntu服务器上进行所有的编辑/编译/调试。它提供的命令行功能。我的目标是使每个Windows系统尽可能多地成为瘦客户端,而没有任何额外的服务(例如sshd)或防火墙漏洞。

所以这是senario:

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

如前所述,问题是系统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

有没有办法在System-A上未安装android sdk?(Windows机器?)
Keith Twombley 2011年

否,因为adb服务器和usb驱动程序需要在System-A上运行才能与设备通信。
Patrick McKinnon

我也使用类似的设置来完成此操作:Windows 7(正在运行仿真器)-> Linux(由于网络而需要跳)->运行Eclipse的OSX。我可以看到带有“ adb devices”的设备,并可以使用Eclipse中的仿真器。问题在于它无法识别模拟器的Android目标,因此我必须在每次手动运行时选择目标。
Frank

如果您需要Mac OS X的腻子,可以在这里找到:mac-tools.org/putty-fur-mac-os-x/02/2012对我来说,它与该工具一起使用。
Bruno Bieri 2013年

@PatrickMcKinnon一切正常,但是在System-B上,我在调用“ adb设备”时遭到未授权。在系统B上,“ adb设备”显示它工作正常。有什么帮助吗?
Tejas Sherdiwala

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,它们是仿真器使用的端口(实际上是第一个启动的仿真器-如果其中有几个正在运行,则它们将使用更高的端口号,如本页其他答复所示)。

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


2

当我的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>

1

所提出的解决方案均不适合我。我从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/ 免责声明,我是作者。


完美的答案和文章!如果您使用Genymotion,请使用此解决方案。本文是针对Windows和Mac编写的,但是我具有本地Ubuntu和远程Ubuntu,并且一切正常。保存了我的一周!
konstantin_doncov

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


您能否提供有关此解决方案的更多详细信息?我做了您所说的一切,但是Android Studio中的“选择部署目标”中没有任何设备。我在第二台计算机上使用Genymotion。
konstantin_doncov

@ don-prog您无需从命令行中说它是否对您有用:adb -L tcp:remotehost:1234 devices如果可以,那么您需要确定Android Studio是否支持远程ADB-如果它坚持使用,就不会感到惊讶。本地设备。
android.weasel

0

我没有第二台带有SDK的机器,但是我注意到仿真器的监听端口(默认5554、5555)正在监听0.0.0.0,即可以从远程机器访问,并且adb --help显示了一条connect <host>:<port>命令。我认为这会使它显示出来,adb devices因此adb命令可以对其进行处理。对于Eclipse,请尝试“运行/运行配置...”,然后将“目标”设置为“手动”。这给了您一个“设备选择器”,我猜想如果adb连接到它,它将包括一个远程仿真器。值得一试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.