设置 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 模拟设备网络/以太网接口
127.0.0.1 模拟设备回环接口

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

另请注意,开发计算机上的地址 127.0.0.1 对应于模拟器自己的回环接口。如果要访问在开发计算机回环接口(在开发计算机上也称为 127.0.0.1)上运行的服务,则应改用特殊地址 10.0.2.2。

最后,还应注意,模拟设备的预分配地址是 Android 模拟器专用的地址,并且在真实设备上可能截然不同(它们也很可能是经过 NAT 处理的地址,具体来说,就是路由器/防火墙后面的地址)。

本地网络限制

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

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

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

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

使用网络重定向

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

要设置网络重定向,您可以在模拟器实例上创建主机与访客端口/地址的映射。设置网络重定向的方法有两种:一种是使用模拟器控制台命令,一种是使用 adb 工具,如下所述。

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

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

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

telnet localhost 5554

连接后,使用 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 和 OS X 上,模拟器通过解析文件 /etc/resolv.conf 获取 DNS 服务器地址。在 Windows 上,模拟器通过调用 GetNetworkParams() API 获取相应地址。请注意,这通常意味着,模拟器会忽略“hosts”文件(Linux/OS X 上的 /etc/hosts,Windows 上的 %WINDOWS%/system32/HOSTS)的内容。

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

将模拟器与代理一起使用

在许多企业网络上,除非通过特定代理进行连接,否则无法直接连接到互联网(连接被网络管理员拒绝)。网络浏览器和其他企业应用预配置为使用代理,因此您可以浏览网页。对于常规应用(如模拟器),它们需要知道存在代理并且需要与之连接。

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

如果您的模拟器必须通过代理服务器访问互联网,您可以在模拟器的 Extended controls 屏幕上配置自定义 HTTP 代理。在模拟器打开的情况下,点击 More 图标 ,然后点击 SettingsProxy。在此屏幕上,您可以定义自己的 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 服务器,可以选择 80 作为 <serverPort>,选择 8080 作为 <localPort>

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

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

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

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

  1. 在发起端模拟器实例上启动拨号器应用。
  2. 输入希望呼叫的实例的控制台端口号作为要拨打的号码。要确定目标实例的控制台端口号,您可以查看其窗口标题,在标题中以“Android Emulator (<端口>)”的形式报告了控制台端口号。
  3. 按“Dial”。目标模拟器实例中会出现新的来电。

要将短信发送到另一个模拟器实例,请启动短信应用(如果有)。指定目标模拟器实例的控制台端口号作为短信地址,输入短信文字,然后发送短信。系统会将短信传递到目标模拟器实例。

您也可以连接到模拟器控制台来模拟语音来电或短信。要了解详情,请参阅电话模拟短信模拟