- 网络模式简介:Android 模拟器支持哪些网络模式,它们分别是什么意思。
- 如何配置网络:在创建模拟器和运行时如何选择和切换网络模式。
- 常见网络问题及解决方案:解决模拟器无法上网、连接缓慢、无法访问本地服务(如 localhost)等问题的方法。
- 高级网络配置:如何配置端口转发、自定义 DNS 等。
- 性能优化建议:如何让模拟器网络速度更快。
网络模式简介
Android 模拟器在启动时,会通过一个虚拟网络适配器与你的宿主机(也就是你运行 Android Studio 的电脑)进行通信,这个适配器通常是 Android Virtual Device (AVD) Network Adapter 或 Hyper-V Virtual Ethernet Adapter(在 Windows 上),基于这个基础,模拟器提供了几种不同的网络模式:

| 网络模式 | 中文名称 | 描述 | 适用场景 |
|---|---|---|---|
| Default | 默认模式 | 这是最常用、最推荐的模式,模拟器通过宿主机的网络(通过 NAT - 网络地址转换)访问外部网络,它会优先使用你的 Wi-Fi 或以太网连接。 | 绝大多数开发场景,开发和测试需要访问互联网的应用。 |
| No network | 无网络 | 模拟器完全断开网络连接。 | 测试应用在无网络环境下的行为。 |
| Emulator-only | 仅模拟器 | 创建一个独立的网络,只有正在运行的模拟器实例可以访问,这对于创建一个隔离的测试环境非常有用,比如测试需要多台设备通信的 P2P 应用。 | 测试 P2P 应用、需要设备间通信的联机游戏等。 |
| Bridged | 桥接模式 | 将模拟器的虚拟网卡直接桥接到你的物理网络(如 Wi-Fi 或以太网),模拟器在局域网中会获得一个独立的 IP 地址,就像一台真实的物理设备。 | 模拟器需要作为局域网中的一员被其他设备访问,或者需要直接访问局域网中的其他设备(如访问本地服务器、局域网打印机等)。 |
如何配置网络
A. 在创建模拟器时配置
- 打开 Android Studio,点击 Tools > AVD Manager。
- 选择一个设备(或点击 "Create Virtual Device" 创建新设备),然后点击右侧的 "Edit" 或 "Next"。
- 在 "System Image" 选择页面,点击 "Advanced Settings"(高级设置)。
- 在 "Emulated Performance" 部分,你会找到 "Network" 下拉菜单。
- 从下拉菜单中选择你需要的网络模式(Default, No network, Emulator-only, Bridged)。
- 完成模拟器的创建和配置。
B. 在运行时切换网络模式
对于已经创建好的模拟器,你也可以在不重启的情况下切换网络模式:
- 确保模拟器正在运行。
- 点击模拟器右侧的 (More) 按钮。
- 选择 "Settings" (设置)。
- 在 "Settings" 窗口中,选择 "Cellular & network" > "Wi-Fi"。
- 在右上角的齿轮图标 ⚙️ 处,点击进入 "Advanced" (高级) 设置。
- 你可以找到 "Network speed" 和 "Network latency" 的调节滑块,以及一个 "Network mode" 的选项(部分版本可能不提供此选项,此时需要通过命令行或
adb切换)。
更通用的运行时切换方法(通过 adb):
你可以使用 adb 命令来动态改变模拟器的网络状态,这非常灵活。
-
开启/关闭 Wi-Fi:
(图片来源网络,侵删)# 开启模拟器 Wi-Fi adb shell svc wifi enable # 关闭模拟器 Wi-Fi adb shell svc wifi disable
-
开启/关闭飞行模式:
# 关闭飞行模式 (开启网络) adb shell settings put global airplane_mode_on 0 adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false # 开启飞行模式 (关闭网络) adb shell settings put global airplane_mode_on 1 adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
常见网络问题及解决方案
模拟器无法上网 (无法解析主机名)
这是最常见的问题,通常由以下几个原因造成:
- 宿主机网络问题:检查你自己的电脑是否能正常上网。
- 防火墙或杀毒软件拦截:防火墙可能会阻止 Android Emulator Network Adapter 的通信,请尝试暂时关闭防火墙或杀毒软件,看是否能解决问题,如果可以,请将 Android Emulator Network Adapter 添加到防火墙的允许列表中。
- 代理设置冲突:如果你在电脑上设置了代理(如公司网络、VPN、Charles/Fiddler 等抓包工具),可能会干扰模拟器的网络,尝试关闭所有代理后再启动模拟器。
- 模拟器网络服务异常:可以尝试重启模拟器或 Android Studio。
模拟器无法访问宿主机的 localhost 或 0.0.1
这是一个非常经典的“坑”,在模拟器内部,localhost 指的是模拟器自己,而不是你的电脑,要访问你电脑上运行的服务(比如本地 Web 服务器、本地数据库),你需要使用 0.2.2 这个特殊的 IP 地址。
- 为什么是
0.2.2? 这是 Android 模拟器预留的别名,它总是指向宿主机的回环地址。0.2.1是模拟器的虚拟路由器。0.2.2是宿主机。0.2.3是默认的 DNS 服务器。
示例:
如果你的电脑上运行了一个 Tomcat 服务器,端口是 8080,在模拟器的浏览器或 App 中访问它,应该使用:
http://10.0.2.2:8080
而不是 http://localhost:8080。

模拟器网络速度慢
模拟器的网络性能天然不如真机,但过慢通常是配置问题。
- 关闭硬件加速:如果硬件加速配置不当或显卡驱动不兼容,反而会拖慢速度,尝试在模拟器的 "Settings" > "About phone" 中连续点击 "Build number" 7次,开启 "Developer options",然后关闭 "Hardware graphics" 或将其设置为 "Software - GLES 2.0"。
- 检查宿主机网络:确保你的电脑网络本身没有瓶颈。
- 重置模拟器:有时候模拟器的状态文件损坏会导致各种问题,可以尝试在 AVD Manager 中 "Cold boot"(冷启动)模拟器,或者直接删除并重新创建。
高级网络配置
A. 端口转发
如果你想在宿主机上访问模拟器中运行的服务(比如模拟器里跑了一个 Web 服务器),或者反过来,可以使用 adb 进行端口转发。
-
从宿主机访问模拟器内的服务: 假设模拟器内的 App 在
8080端口上监听。# 将宿主机的 6100 端口转发到模拟器的 8080 端口 adb forward tcp:6100 tcp:8080
在宿主机的浏览器中访问
http://localhost:6100,就相当于访问了模拟器内http://localhost:8080的服务。 -
从模拟器访问宿主机的服务: 如前所述,直接使用
0.2.2即可,无需端口转发。
B. 自定义 DNS
如果你需要为模拟器配置特定的 DNS 服务器(用于测试某些 DNS 解析逻辑或解决某些 DNS 污染问题),可以通过 adb 命令设置。
# 设置 DNS 为 8.8.8.8 adb shell settings put global private_dns_mode hostname adb shell settings put global private_dns_specifier dns.google # 或者更直接的方式 (需要 root) # adb shell 'echo "nameserver 8.8.8.8" > /system/etc/resolv.conf' # (注意:直接修改系统文件通常需要 root 权限,不推荐)
更推荐的方法是使用 -dns-server 参数来启动模拟器,但这通常在命令行中完成。
性能优化建议
- 使用硬件加速:如果你的 CPU 和显卡支持,务必在模拟器设置中开启硬件加速(
Hardware - GLES 2.0或更高),这能极大地提升图形渲染和网络 I/O 性能。 - 关闭不需要的功能:在模拟器的高级设置中,关闭不常用的传感器(如 GPS、加速度计)可以略微提升性能。
- 选择合适的系统镜像:对于日常开发,使用
x86_64或armeabi-v7a的 "Google Play" 系统镜像通常比 "Google APIs" 镜像更轻量、启动更快。 - 定期更新:确保你使用的是最新版本的 Android Studio 和 Android Emulator,Google 持续对其进行性能优化。
- 首选模式:对于 99% 的情况,使用 Default 模式即可。
- 访问宿主机:在模拟器中访问宿主机服务,IP 地址固定为
0.2.2。 - 问题排查:网络不通时,顺序检查:宿主机网络 -> 防火墙/代理 -> 模拟器设置。
- 动态控制:善用
adb shell svc wifi enable/disable等命令,可以快速在代码测试中切换网络状态。
希望这份详细的指南能帮助你更好地使用 Android 模拟器进行开发和测试!
