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

zak*_*rya 87 android android-emulator

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

Chr*_*Orr 66

我以前没有尝试(甚至注意到)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我可以使用它,好像它在我的本地机器上运行一样.

  • 记住你在服务器上也需要`killall adb`,因为模拟器不接受多个连接,并且本地机器将"离线". (5认同)
  • 即使在我使用 Putty SSH 端口转发的 Windows 7 机器上,它也能发挥作用。谢谢。 (2认同)

Hen*_*ger 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部署和运行我的应用程序,其中模拟器出现在虚拟设备下,就好像它是本地模拟器一样.


Pat*_*non 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连接.诀窍是在创建两个隧道时检查"远程"单选按钮,以便隧道方向反转(从您登录的服务器隧道到您登录的客户端).

隧道截图

最后,在建立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
Run Code Online (Sandbox Code Playgroud)

现在您可以正常下载图像/调试,如果您想要将笔记本电脑拿出来喝咖啡,切换到不同的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
Run Code Online (Sandbox Code Playgroud)

接下来,杀死System-B上的adb服务器

System-B$ adb kill-server
Run Code Online (Sandbox Code Playgroud)

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

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device
Run Code Online (Sandbox Code Playgroud)


Shl*_*blu 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
    
    Run Code Online (Sandbox Code Playgroud)

hts表示Http隧道服务器

这两个命令创建了两个半桥,它们监听端口10001和10001,并将这些端口的I / O重定向到本地端口5554和5555,它们是仿真器使用的端口(实际上是第一个启动的仿真器-如果您中有几个正在运行,则它们将使用更高的端口号,如本页其他答复所示)。

htc表示Http隧道客户端

这些命令创建丢失的半桥。他们监听本地端口5554和5555,并将这些端口的I / O重定向到我们之前在HostEmulator上创建的半桥

这将重新启动adb,因为否则它不会检测到远程仿真器。它必须在启动时进行一些扫描。然后,它列出了仅用于检查的设备(可用的仿真器)。

  • 然后你去。

您可以像在本地一样使用远程仿真器。您必须使Cygwin终端在两台计算机上均保持打开状态,否则您将杀死创建的半桥。

我在这里将端口10000和10001用于机器/机器交换,但是当然,只要其他端口尚未使用,您就可以使用它们。