如何将Android模拟器的域名请求重定向到本地主机
我完全理解你的需求——就是想让Android模拟器里访问my.great-website.local时,和你笔记本上的配置一样,指向本地开发环境,而不是去互联网解析。你尝试的两种思路其实都是可行的,只是遇到了一些小坑,下面我把修正后的方案整理出来:
方案一:修改模拟器的/etc/hosts文件(解决Device must be bootloader unlocked报错)
你之前的步骤已经接近正确,但因为较新的Android版本启用了AVB验证,直接adb remount会失败,需要补充几个关键步骤:
关闭现有模拟器,以可写系统模式启动
进入你的${ANDROID_HOME}/emulator目录,执行以下命令:# 查看可用的模拟器列表 ./emulator -list-avds # 用可写系统模式启动目标模拟器 ./emulator -avd <你的模拟器名称> -writable-system关闭AVB验证并重启模拟器
进入${ANDROID_HOME}/tools目录(或确保adb已加入系统PATH),执行:# 获取模拟器root权限 adb root # 关闭AVB验证,这是解决remount报错的核心步骤 adb disable-verity # 重启模拟器让设置生效 adb reboot重新挂载系统分区为可写
等模拟器重启完成后,再次执行:adb root adb remount这次应该不会再弹出解锁提示了。
修改并推送hosts文件
# 将模拟器的hosts文件拉取到本地Downloads目录 adb pull /system/etc/hosts ~/Downloads/hosts # 添加域名映射,10.0.2.2是模拟器指向本地主机的特殊别名 echo '10.0.2.2 my.great-website.local' >> ~/Downloads/hosts # 将修改后的hosts文件推回模拟器 adb push ~/Downloads/hosts /system/etc/hosts重启模拟器生效
adb reboot重启后,模拟器里访问
my.great-website.local就会指向你的本地主机了。
方案二:用自定义DNS服务器解决(修复dnsmasq权限问题)
你尝试用dnsmasq时遇到的权限错误,通常是因为它需要绑定特权端口(53)或者没有监听权限,以下是修正后的配置步骤:
安装并配置dnsmasq(MacOS环境)
如果还没安装,先用Homebrew安装:brew install dnsmasq编辑dnsmasq的配置文件(路径一般是
/usr/local/etc/dnsmasq.conf),添加以下内容:# 把目标域名映射到模拟器指向本地的特殊IP address=/my.great-website.local/10.0.2.2 # 允许监听本地回环和局域网IP,避免权限问题 listen-address=127.0.0.1,192.168.x.x # 替换成你的本地局域网IP解决dnsmasq的权限问题
执行以下命令让dnsmasq拥有绑定特权端口的权限:sudo chown root:wheel /usr/local/sbin/dnsmasq sudo chmod u+s /usr/local/sbin/dnsmasq重启dnsmasq服务
sudo brew services restart dnsmasq启动模拟器时指定自定义DNS
用以下命令启动模拟器,指定dnsmasq所在的IP(比如本地回环地址127.0.0.1,或者你的局域网IP):emulator @Nexus_5X_API_23 -dns-server 127.0.0.1这样模拟器就会通过你的本地dnsmasq解析域名,实现和笔记本一致的映射效果。
额外小技巧(仅针对自研应用)
如果你只是想让自己开发的应用实现这个跳转,还可以在代码里给网络库加拦截器——比如用OkHttp的Interceptor,把请求中的my.great-website.local替换成10.0.2.2,这种方式不需要修改模拟器系统配置,只对当前应用生效。
备注:内容来源于stack exchange,提问作者Michał J. Gąsior

