Android Emulator中Cisco AnyConnect VPN Split DNS失效问题求助
Android Emulator 适配Cisco AnyConnect Split DNS 可行方案
问题根因
Android Emulator 默认在启动时固化读取宿主机DNS配置,自带的虚拟路由层不会正确识别宿主机Cisco AnyConnect下发的Split DNS规则,既不会把对应内网域名的解析请求转发到VPN隧道的内网DNS,也不会正确路由模拟器内部VPN应用的DNS请求,这也是宿主机连VPN后重启模拟器、模拟器内直接装AnyConnect两种方案都失效的核心原因。
实测可用方案
方案1:命令行启动时手动指定内网DNS(成功率最高)
- 先在宿主机上正常连接Cisco AnyConnect VPN,查询VPN下发的内网DNS地址:
- Windows:执行
ipconfig /all,找到Cisco AnyConnect虚拟适配器对应的DNS服务器地址 - macOS:执行
scutil --dns,找到匹配企业内网域名后缀的nameserver地址 - Linux:执行
resolvectl status,找到VPN对应网络链接的DNS服务器地址
- Windows:执行
- 完全关闭所有Android Emulator进程,包括Android Studio托管的后台模拟器进程,确保无残留
- 打开终端/命令提示符,通过命令行带参数启动模拟器,不要直接点Android Studio的模拟器启动按钮:
# Windows示例 %LOCALAPPDATA%\Android\Sdk\emulator\emulator.exe -avd <你的模拟器AVD名称> -dns-server <内网DNS1地址>,<内网DNS2地址> # macOS/Linux示例 ~/Library/Android/sdk/emulator/emulator -avd <你的模拟器AVD名称> -dns-server <内网DNS1地址>,<内网DNS2地址> - 模拟器启动完成后直接测试内网域名访问,绝大多数场景下可直接正常解析。
方案2:模拟器内静态指定DNS(绕开虚拟路由转发)
如果方案1受VPN路由策略限制未生效,可直接修改模拟器内网络配置:
- 启动目标模拟器,进入设置 -> WLAN,长按已连接的
AndroidWifi网络,选择「修改网络」 - 将IP分配模式从DHCP改为静态,IP地址、网关、子网掩码保持原有DHCP分配的值不变,仅将DNS1、DNS2字段手动填写为之前查到的VPN内网DNS地址,保存配置
- 等待网络重连完成后即可测试内网域名访问,该方案直接让模拟器向指定内网DNS发起解析请求,绕开了模拟器虚拟路由的DNS转发逻辑。
方案3:修复模拟器内AnyConnect连接失效问题
如果需要在模拟器内部直接发起VPN连接,可按以下步骤修复配置:
- 带可写系统参数启动模拟器:
emulator -avd <你的模拟器AVD名称> -writable-system - 执行adb命令获取root权限并写入DNS配置:
adb root adb shell setprop net.dns1 <内网DNS1地址> adb shell setprop net.dns2 <内网DNS2地址> - 打开模拟器内安装的Cisco AnyConnect正常发起VPN连接,连接完成后不要切换网络,即可正常解析内网域名。
常见避坑提示
- 尽量使用稳定版(32.1.12及更早版本)的Android Emulator,33.x之后的Canary/Dev版本存在虚拟网络栈和宿主机VPN的兼容bug,会导致DNS路由异常
- Apple Silicon芯片的Mac设备上,Rosetta转译运行的x86_64模拟器存在DNS路由缺陷,建议更换arm64-v8a架构的模拟器镜像测试
内容的提问来源于stack exchange,提问作者Joel Broström
相关产品推荐
相关产品推荐

