模拟器提供多功能的网络功能,您可以使用这些功能为您的应用设置复杂的建模和测试环境。此页面介绍模拟器网络架构和功能。
网络地址空间
模拟器的每个实例都在虚拟路由器或防火墙服务之后运行,该服务将其与您的开发机器网络接口和设置以及互联网隔离开。模拟设备无法检测到网络上的开发机器或其他模拟器实例。它只会检测到它通过以太网连接到路由器或防火墙。
每个实例的虚拟路由器管理 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 | 模拟设备环回接口 |
所有正在运行的模拟器实例都使用相同的地址分配。这意味着,如果您在机器上同时运行两个实例,则每个实例都将拥有自己的路由器,在其之后,每个实例都将拥有 10.0.2.15 的 IP 地址。实例由路由器隔离,无法在同一网络上检测到彼此。有关如何让模拟器实例通过 TCP/UDP 通信的信息,请参阅关于 互连模拟器实例 的部分。
您开发机器上的 127.0.0.1 地址对应于模拟器的环回接口。要访问在您的开发机器环回接口上运行的服务,请使用特殊地址 10.0.2.2。
模拟设备的预分配地址特定于 Android 模拟器,在真实设备上可能会有很大差异(真实设备也可能进行网络地址转换,特别是在路由器或防火墙之后)。
本地网络限制
在模拟器上运行的 Android 应用可以连接到您工作站上可用的网络。但是,应用是通过模拟器连接的,而不是直接连接到硬件,模拟器就像您工作站上的普通应用一样。这可能会导致一些限制。
- 与模拟设备的通信可能会被您机器上运行的防火墙程序阻止。
- 与模拟设备的通信可能会被连接您机器的另一个(物理)防火墙或路由器阻止。
模拟器的虚拟路由器应该能够代表模拟设备处理所有出站 TCP 和 UDP 连接和消息,前提是您的开发机器网络环境允许它这样做。对端口号或范围没有内置限制,只有您的主机操作系统和网络施加的限制。
根据环境的不同,模拟器可能无法支持其他协议(例如用于“ping”的 ICMP)。目前,模拟器不支持 IGMP 或多播。
使用网络重定向
要与虚拟路由器后面的模拟器实例通信,请在虚拟路由器上设置网络重定向。然后,客户端可以连接到路由器上的指定访客端口,而路由器则将流量定向到该端口与模拟设备主机端口之间。
要设置网络重定向,请在模拟器实例上创建主机和访客端口以及地址的映射。有两种方法可以设置网络重定向:使用模拟器控制台命令和使用 Android 调试桥(adb
)工具,如下节所述。
通过模拟器控制台设置重定向
每个模拟器实例都提供一个控制台,您可以连接到该控制台并向其发出特定于该实例的命令。使用 redir
控制台命令根据需要为模拟器实例设置重定向。
首先,确定目标模拟器实例的控制台端口号。例如,启动的第一个模拟器实例的控制台端口号为 5554。接下来,连接到目标模拟器实例的控制台,指定其控制台端口号,如下所示:
telnet localhost 5554
连接后,您必须进行身份验证才能设置重定向。请参阅 启动和停止控制台会话,了解如何执行此操作的详细信息。身份验证后,使用 redir
命令处理重定向。
要添加重定向,请使用:
redir add <protocol>:<host-port>:<guest-port>
其中 <protocol>
为 tcp
或 udp
,<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 解析问题(例如,使用 Web 浏览器时出现的“未知主机错误”消息),您可能会发现此选项很有用。
将模拟器与代理一起使用
在许多公司网络中,网络管理员会拒绝直接连接到互联网。相反,互联网连接必须通过特定的代理。要在需要代理的网络上访问互联网,模拟器需要知道存在代理并且需要连接到它。
由于 HTTP 的性质,直接 Web 服务器连接和通过代理连接会导致不同的 GET 请求。模拟器会在与代理通信之前透明地重写来自虚拟设备的 GET 请求,因此它可以正常工作。
如果您的模拟器必须通过代理服务器访问互联网,您可以从模拟器的“扩展控件”屏幕配置自定义 HTTP 代理。
- 打开模拟器后,点击“更多” 。
- 点击“设置”和“代理”。
- 定义您的 HTTP 代理设置。
或者,您可以在启动模拟器时使用 -http-proxy <proxy>
选项从命令行配置代理。在这种情况下,请使用以下格式之一在 <proxy>
中指定代理信息:
http://<machineName>:<port>
或
http://<username>:<password>@<machineName>:<port>
-http-proxy
选项强制模拟器对所有传出的 TCP 连接使用指定的 HTTP 或 HTTPS 代理。不支持 UDP 的重定向。
或者,您可以使用您想要用于 <proxy>
的值定义环境变量 http_proxy
。在这种情况下,您不需要在 -http-proxy
命令中为 <proxy>
指定值——模拟器在启动时检查 http_proxy
环境变量的值,如果已定义,则会自动使用其值。
您可以使用 -debug-proxy
选项来诊断代理连接问题。
互连模拟器实例
要让一个模拟器实例与另一个模拟器实例通信,请按如下所述设置网络重定向。
假设您的环境表示如下:
- A 是您的开发机器。
- B 是您在 A 上运行的第一个模拟器实例。
- C 是您也在 A 上运行的第二个模拟器实例。
如果您想在 B 上运行一个 C 将连接到的服务器,请按如下方式设置:
- 设置 B 上的服务器,侦听 10.0.2.15:<serverPort>。
- 在 B 控制台上,从 A:localhost:<localPort> 到 B:10.0.2.15:<serverPort> 设置重定向。
- 在 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。
向另一个模拟器实例发送语音呼叫或短信
模拟器会自动将模拟的语音呼叫和短信从一个实例转发到另一个实例。要发送语音呼叫或短信,请分别使用其中一个模拟器的拨号器应用或短信应用。
要发起到另一个模拟器实例的模拟语音呼叫:
- 启动源模拟器实例上的拨号器应用。
作为要拨打的号码,输入目标实例的控制台端口号。
如果目标实例在单独的窗口中运行,则可以通过检查其窗口标题来确定其控制台端口号,但如果它在工具窗口中运行,则无法确定。控制台端口号报告为“Android Emulator (<port>)”。
或者,
adb devices
命令会打印正在运行的虚拟设备及其控制台端口号的列表。有关更多信息,请参阅 查询设备。- 点击拨号按钮。目标模拟器实例中会出现一个新的传入呼叫。
要向另一个模拟器实例发送短信: