互连模拟器实例

如需测试涉及多设备交互的应用,您可以连接多个 Android 模拟器实例,以便它们可以相互通信。 建立连接的方法取决于您使用的模拟器版本。

Android 模拟器 36.5 及更高版本

Android 模拟器 36.5 及更高版本提供了一个简化的网络模型,该模型通过共享 Wi-Fi 网络连接实例。

借助此网络堆栈,多个模拟器在同一虚拟 Wi-Fi 网络上显示为不同的设备。这使它们能够使用基于 Wi-Fi 的标准协议自动发现彼此并相互通信。

模拟器可以使用网络服务发现 (NSD) 和 Wi-Fi 直连等技术在虚拟网络上找到彼此。

由于模拟器位于同一 Wi-Fi 网络上,因此您还可以找到模拟器的特定 IP 地址,并直接从另一个模拟器实例连接到该地址。如需获取虚拟 Wi-Fi 接口 (wlan0) 的 IP 地址,请从宿主机运行以下命令:

adb shell ip addr show wlan0

Android 模拟器 36.5 之前的版本

如果您使用的是较早版本的 Android 模拟器,则默认情况下无法在实例之间进行直接通信。每个模拟器实例都在自己的虚拟路由器后面运行,这会将其与本地网络和其他模拟器隔离开来。

如需启用通信,您必须手动设置网络重定向。此过程涉及创建一个映射,该映射会将来自宿主机上特定端口的流量转发到模拟设备上的端口,从而绕过虚拟路由器。

您可以通过以下两种方式配置网络重定向:

  1. 模拟器控制台命令:使用内置控制台为正在运行的模拟器实例设置端口映射。
  2. Android 调试桥 (adb):使用 adb 命令配置必要的端口转发规则。

通过模拟器控制台设置重定向

每个模拟器实例都提供了一个控制台,您可以连接到该控制台来发出专门针对该实例的命令。您可以使用 redir 控制台命令,根据模拟器实例的需要设置重定向。

首先,确定目标模拟器实例的控制台端口号。例如,启动的第一个模拟器实例的控制台端口号为 5554。接下来,连接到目标模拟器实例的控制台,指定其控制台端口号,如下所示:

    telnet localhost 5554

连接后,您必须先进行身份验证,然后才能设置重定向。请参阅 启动和停止控制台会话 ,详细了解如何执行此操作。经过验证后,使用 redir 命令来处理重定向。

如需添加重定向,请使用以下命令:

    redir add <protocol>:<host-port>:<guest-port>

其中,<protocol>tcpudp,而 <host-port><guest- port> 用于设置机器与模拟系统之间的映射。

例如,以下命令设置的重定向用于处理到主机(开发机器)上的端口 127.0.0.1:5000 的所有传入 TCP 连接,它会将这些连接传递到所模拟系统上的端口 10.0.2.15:6000:

    redir add tcp:5000:6000

如需删除重定向,请使用 redir del 命令。如需列出特定实例的所有重定向,请使用 redir list。如需详细了解这些 命令以及其他控制台命令,请参阅发送模拟器控制台 命令

端口号受本地环境的限制。这通常意味着,如果没有特殊的管理员权限,您就无法使用低于 1024 的主机端口号。此外,您也无法为机器上另一个进程已在使用的主机端口设置重定向。在这种情况下,redir 会生成一条错误消息,说明此情况。

通过 adb 设置重定向

Android 调试桥 (adb) 工具提供端口转发功能,这是设置网络重定向的另一种方法。如需了解详情,请参阅 设置 端口转发 文档。adb

adb 目前没有提供移除重定向的方法,除非停止 adb 服务器。

互连模拟器实例

如需让一个模拟器实例与另一个模拟器实例进行通信,请按照以下步骤设置网络重定向。

假设您的环境如下所示:

  • A 是您的开发机器。
  • B 是您的第一个模拟器实例,在 A 上运行。
  • C 是您的第二个模拟器实例,也在 A 上运行。

如果您想在 B 上运行一个服务器,C 将连接到该服务器,请按如下方式进行设置:

  1. 在 B 上设置服务器,监听 10.0.2.15:<serverPort>
  2. 在 B 控制台上,设置从 A: localhost:<localPort> 到 B: 10.0.2.15:<serverPort> 的重定向。
  3. 在 C 上,将客户端连接到 10.0.2.2:<localPort>

例如,如果您要运行一个 HTTP 服务器,请选择 <serverPort> 作为 80 并选择 <localPort> 作为 8080

  • B 监听 10.0.2.15:80
  • 在 B 控制台上,发出 redir add tcp:8080:80
  • C 连接到 10.0.2.2:8080