模拟器提供多功能的网络功能,您可以使用这些功能为您的应用设置复杂的建模和测试环境。此页面介绍了模拟器网络架构和功能。
网络地址空间
模拟器的每个实例都在虚拟路由器或防火墙服务后面运行,该服务将其与您的开发机器网络接口和设置以及互联网隔离开。模拟设备无法检测到网络上的开发机器或其他模拟器实例。它仅检测到它通过以太网连接到路由器或防火墙。
每个实例的虚拟路由器管理 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
命令会打印正在运行的虚拟设备及其控制台端口号的列表。有关更多信息,请参阅 查询设备。- 点击拨号按钮。目标模拟器实例中会出现一个新的传入呼叫。
要向另一个模拟器实例发送短信