设置 Android 模拟器网络

该模拟器提供了用途广泛的网络功能,供您为自己的应用设置复杂的建模和测试环境。本页将介绍该模拟器的网络架构和功能。

网络地址空间

该模拟器的每个实例都在虚拟路由器或防火墙服务后面运行,这样便将其与开发机器网络接口和设置以及互联网隔离开来。所模拟的设备在网络上无法检测您的开发机器或其他模拟器实例,只会检测到它通过以太网连接到路由器或防火墙。

每个实例的虚拟路由器管理 10.0.2/24 网络地址空间。路由器管理的所有地址都采用 10.0.2.xx 形式,其中 xx 是一个数字。此空间内的地址由该模拟器或其路由器预先分配,具体说明如下:

网络地址 说明
10.0.2.1 路由器或网关地址
10.0.2.2 主机环回接口的特殊别名(开发机器上的 127.0.0.1)
10.0.2.3 第一个 DNS 服务器
10.0.2.4 / 10.0.2.5 / 10.0.2.6 可选的第二个、第三个和第四个 DNS 服务器
10.0.2.15 使用以太网连接时所模拟设备网络
10.0.2.16 使用 Wi-Fi 连接时所模拟设备网络
127.0.0.1 模拟设备回环接口

所有正在运行的模拟器实例都使用相同的地址分配。这意味着,如果您的机器上有两个并发运行的实例,那么每个实例都会有各自的路由器,在路由器后面,每个实例的 IP 地址都将是 10.0.2.15。这两个实例由路由器隔离,在同一网络上无法检测到对方。如需了解如何让模拟器实例通过 TCP/UDP 进行通信,请参阅有关互连模拟器实例的部分。

开发机器上的地址 127.0.0.1 对应于该模拟器的环回接口。如果要访问在开发机器环回接口上运行的服务,请改用特殊地址 10.0.2.2。

为所模拟的设备预先分配的地址是 Android 模拟器专用的地址,在真实设备上可能截然不同(它们也很可能是经过网络地址转换处理的地址,具体来说,就是路由器或防火墙后面的地址)。

本地网络限制

在模拟器中运行的 Android 应用可以连接到工作站上可用的网络。不过,应用通过模拟器连接,而不是直接连接到硬件,模拟器就像工作站上的普通应用一样。这可能会造成一些限制:

  • 与所模拟设备的通信可能会被您的机器上运行的防火墙程序阻止。
  • 与所模拟设备的通信可能会被您的机器连接到的另一个(物理)防火墙或路由器阻止。

模拟器的虚拟路由器应该能够代表模拟设备处理所有出站 TCP 和 UDP 连接和消息,前提是您的开发计算机网络环境允许它这样做。除了主机操作系统和网络施加的限制以外,对端口号或范围没有内置限制。

该模拟器可能无法支持其他协议(例如 ICMP,用于“ping”),具体取决于环境。目前,该模拟器不支持 IGMP 或多播。

使用网络重定向

如要在模拟器实例的虚拟路由器后面与该实例进行通信,请在虚拟路由器上设置网络重定向。这样,客户端就可以连接到路由器上的指定访客端口,而路由器则会将流量定向到该端口以及将流量从该端口定向到所模拟设备的主机端口。

如要设置网络重定向,您可以在模拟器实例上创建主机与访客端口和地址的映射。设置网络重定向的方法有两种:一种是使用模拟器控制台命令,一种是使用 Android 调试桥 (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 目前不提供移除重定向的方法。

配置模拟器 DNS 设置

启动时,该模拟器会读取系统当前使用的 DNS 服务器的列表。然后,它会存储此列表上最多四个服务器的 IP 地址,并根据需要在所模拟的地址 10.0.2.3、10.0.2.4、10.0.2.5 和 10.0.2.6 上为它们设置别名。

在 Linux 和 macOS 上,该模拟器通过解析文件 /etc/resolv.conf 获取 DNS 服务器地址。在 Windows 上,该模拟器通过调用 GetNetworkParams() API 获取相应地址。请注意,这通常意味着该模拟器会忽略“hosts”文件(在 Linux/macOS 上为 /etc/hosts,在 Windows 上为 %WINDOWS%/system32/HOSTS)的内容。

从命令行启动该模拟器时,您可以使用 -dns-server <serverList> 选项来手动指定要使用的 DNS 服务器的地址,其中 <serverList> 是以英文逗号分隔的服务器名称或 IP 地址列表。如果在所模拟的网络中遇到 DNS 解析问题(例如,在使用网络浏览器时出现“Unknown Host error”消息),您可能会发现此选项很有用。

将模拟器与代理一起使用

在许多企业网络上,网络管理员都会拒绝直接连接到互联网。相反,互联网连接必须通过特定代理。如需通过具有代理要求的网络访问互联网,模拟器需要知道存在代理并且需要连接到代理。

由于 HTTP 的性质,网络服务器的直接连接和通过代理建立的连接会产生不同的 GET 请求。模拟器在与代理进行通信之前以透明方式重写来自虚拟设备的 GET 请求,以使其正常工作。

如果您的模拟器必须通过代理服务器访问互联网,您可以在模拟器的 Extended controls 屏幕上配置自定义 HTTP 代理:

  1. 在模拟器打开的情况下,点击 More 图标
  2. 然后点击 SettingsProxy
  3. 定义 HTTP 代理设置。

或者,您可以在启动模拟器时从命令行使用 -http-proxy <proxy> 选项来配置代理。 在这种情况下,您可以采用以下某种格式,在 <proxy> 中指定代理信息:

http://<machineName>:<port>

http://<username>:<password>@<machineName>:<port>

-http-proxy 选项强制模拟器对所有传出 TCP 连接使用指定的 HTTP 或 HTTPS 代理。不支持 UDP 重定向。

或者,您也可以将环境变量 http_proxy 定义为要用于 <proxy> 的值。在这种情况下,您不需要在 -http-proxy 命令中指定 <proxy> 的值,模拟器会在启动时检查 http_proxy 环境变量的值并自动使用其值(如果已定义)。

您可以使用 -debug-proxy 选项来诊断代理连接问题。

互连模拟器实例

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

假设您的环境如下所示:

  • 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。

将语音通话或短信发送到另一个模拟器实例

模拟器会自动将模拟语音通话和短信从一个实例转发到另一个实例。如需发送语音通话或短信,请分别在一个模拟器中使用拨号器应用或短信应用。

如需向另一个模拟器实例发起模拟语音通话,请执行以下操作:

  1. 在发起端模拟器实例上启动拨号器应用。
  2. 输入目标实例的控制台端口号作为要拨打的号码。

    当目标实例在单独的窗口中运行时,您可以通过查看其窗口标题来确定其控制台端口号,而当目标实例在工具窗口中运行时,则无法这样做。窗口标题会以“Android Emulator (<端口>)”的形式报告控制台端口号。

    此外,adb devices 命令也会输出正在运行的虚拟设备及其控制台端口号的列表。要了解详情,请参阅查询设备

  3. 点击拨号按钮。目标模拟器实例中会出现新的来电。

如需将短信发送到另一个模拟器实例,请执行以下操作:

  1. 启动短信应用(如果有)。
  2. 指定目标模拟器实例的控制台端口号作为短信地址。
  3. 输入消息内容。
  4. 发送信息后,系统会将短信传递到目标模拟器实例。
  5. 您也可以连接到模拟器控制台以模拟语音来电或短信。如需了解详情,请参阅电话模拟短信模拟