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

Posted

技术标签:

【中文标题】使用 Android 模拟器进行远程调试【英文标题】:Remote debugging with Android emulator 【发布时间】:2010-12-17 18:30:34 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我之前没有尝试过(甚至没有注意到)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指的是remote机器的本地接口。

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

【讨论】:

就像一个魅力,即使在我的带有 Putty SSH 端口转发的 Windows 7 机器上也是如此。谢谢。 @JimMcKeeth:根据上面的网络配置,打开 Putty,进入 Connection > SSH > Tunnels。现在添加一个带有 Source-port: 5556 和 Destination: localhost:5554 的条目。对 Source-port: 5557 和 Destination: localhost:5555 重复相同的操作。干杯! 请记住,您在服务器上也需要killall adb,因为模拟器不会接受多个连接,本地机器将是offline 谁能用英文解释一下?【参考方案2】:

这是我在 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 中设置隧道:连接 -> SSH -> 隧道

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

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

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

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

    我在开发机器上重新启动了 ADB(adb kill-server,然后是adb start-server)。

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

【讨论】:

很好,但我想澄清一下:在第 4 步之后,您必须关闭 putty,然后在第 5 步中再次打开它,配置隧道并重新连接。步骤 6-8:首先启动模拟器,然后启动 adb(在主机中)。第 9 步:您可能希望在客户端计算机中重新启动 adb,然后键入 adb devices 以确保它没问题。常规的 DDMS 和 eclipse 的东西也应该可以工作。 @MisterSmith 非常有效的观点,您为什么不提交编辑? :) @MisterSmith 您能否编辑您的答案以反映此评论,这对问题的成功非常重要。另外,谢谢,我现在可以从我的访客机器连接到我的主机了。【参考方案3】:

我意识到这个问题真的很老了,但我解决问题的方式略有不同,我花了一段时间才弄清楚这个微不足道的解决方案。

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

所以这里是情景:

System-A:运行 android 模拟器的 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 系统连接真正的 android 设备,并从系统 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

【讨论】:

有没有办法做到这一点,而无需在 System-A 上安装 android sdk? (windows机器?) 否,因为 adb 服务器和 USB 驱动程序需要在 System-A 上运行才能与设备通信。 我也这样做了,设置如下:Windows 7(运行模拟器)-> Linux(需要跳,由于网络...)-> 运行 Eclipse 的 OS X。我可以看到带有“adb devices”的设备并使用 Eclipse 中的模拟器。问题是它无法识别模拟器的Android目标,所以我必须在每次运行时手动选择目标。 如果您需要 Mac OS X 的腻子,可以在这里找到:mac-tools.org/putty-fur-mac-os-x/02/2012 对我来说,它可以与该工具配合使用。 @PatrickMcKinnon 事情运行良好,但在 System-B 上,调用“adb devices”时我得到了未经授权。在 System-B 上,“adb devices”显示它工作正常。有什么帮助吗?【参考方案4】:

如果您的两台机器在同一个专用网络中,因此不需要使用 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 隧道服务器

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

HostEclipse 上,输入这些

htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001

htc 表示 Http Tunnel 客户端

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

然后,仍然在 HostEclipse 上,输入这三个命令

adb kill-server
adb start-server
adb devices

这会重新启动 adb,否则它不会检测到远程模拟器。它必须在启动时进行一些扫描。然后它会列出设备(可用的模拟器)以供检查。

你去吧。

您可以像使用本地模拟器一样使用远程模拟器。 你必须在两台机器上保持 Cygwin 终端打开,否则你会杀死你创建的半桥。

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

建议的解决方案都不适合我。 我从 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,一切正常。拯救了我的一周!【参考方案7】:

当您运行 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 Studio 的“选择部署目标”中没有任何设备。我在第二台电脑上使用 Genymotion。 @don-prog 你没有说它是否从命令行为你工作:adb -L tcp:remotehost:1234 devices 如果是这样,那么你需要找出Android Studio是否支持远程ADB -如果它坚持使用本地设备,我不会感到惊讶。【参考方案8】:

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。

【讨论】:

【参考方案9】:

这篇文章包含许多答案,但缺少分步说明。

所以这个答案将解释如何连接两台计算机以在另一台计算机的模拟器上运行一台计算机的项目。


进一步前的要求:

    两台电脑的防火墙都应该关闭。 两台电脑必须连接在同一个网络中。

注意事项:

运行 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 的55545555 端口转发到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_EM 的模拟器现在已在 PC_AS 中检测到。现在您可以在这些模拟器上运行项目并进行远程调试。

| ? 注意:在执行上述过程时,模拟器可以显示一个对话框来信任传入的请求。

【讨论】:

【参考方案10】:

我手头没有第二台带有 SDK 的机器,但我注意到模拟器的侦听端口(默认 5554、5555)正在侦听 0.0.0.0,即可从远程机器访问,并且 adb --help 显示connect &lt;host&gt;:&lt;port&gt; 命令。我认为这会使它出现在adb devices 中,所以adb 命令可以处理它。对于 Eclipse,尝试“运行/运行配置...”并将目标设置为手动。这给了你一个“设备选择器”,我猜如果 adb 连接到它,它会包括一个远程模拟器。值得一试。

【讨论】:

以上是关于使用 Android 模拟器进行远程调试的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio远程连接模拟器调试

使用 PC 端浏览器开发者工具对移动端真机环境 Web 页面进行远程调试

如何使用Mac远程调试iPhone/iPad 中的网页

在Windows中连接到远程调试器时反应本机超时

React Native api 调用不会在远程调试模式之外发生(仅限 iOS)

Android TV 开发安卓电视调试 ( 开启网络远程调试 )