互连模拟器实例

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

Android 模拟器版本 36.5 及更高版本

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

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

模拟器可以使用网络服务发现 (NSD) 和 WLAN 直连等技术在虚拟网络上相互查找。

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

adb shell ip addr show wlan0

36.5 之前的 Android 模拟器版本

如果您使用的是较低版本的 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