React Native安卓访问本地API报qemud:network管道错误
首先明确:修改AndroidManifest等原生配置后必须重新构建项目。React Native的Metro热更新只会同步JS层代码改动,原生层配置变更如果不执行全量重打包,完全不会生效,你之前加的android:usesCleartextTraffic配置大概率从来没被打进过安装包。
你遇到的qemu管道报错和明文流量限制是两个独立问题,按以下顺序排查修复即可:
修复步骤
1. 先执行clean构建,排除配置不生效问题
停掉当前正在运行的Metro服务、模拟器进程,在项目根目录依次执行命令:
# 清理安卓构建缓存 cd android && ./gradlew clean cd .. # 重新打debug包启动 ENVFILE=.env.dev npx react-native run-android
如果构建完成后还是报错,继续往下走。
2. 修正本地接口访问地址
绝大多数场景下这个报错是本地接口地址配置错误导致的:
- 安卓模拟器内部的
127.0.0.1/localhost指向模拟器自身,不是你的Mac开发机 - 访问宿主机上运行的本地接口,请把接口base地址替换为
10.0.2.2(官方AVD模拟器预留的宿主机映射地址),如果用Genymotion模拟器则替换为10.0.3.2 - 确认你本地运行的后端服务监听地址是
0.0.0.0,不要绑定仅127.0.0.1,否则转发请求无法到达后端服务
3. 修复模拟器QEMU网络管道bug
你贴的Failed to open QEMU pipe日志是模拟器自身的网络转发故障,按以下操作处理:
- 打开模拟器的「设置-网络和互联网-互联网」,找到当前连接的WLAN,修改网络高级选项,把代理设置为「无」,保存后冷启动模拟器
- 避开API 31(Android 12)的Google Play版本镜像,这个版本存在已知的网络转发bug,换用同版本的Google APIs镜像,或者直接使用API 30/API 33版本的模拟器镜像
- 启动模拟器前完全退出系统里运行的VPN、代理类工具,这类工具会劫持系统网络栈,导致模拟器的qemu网络管道初始化失败
4. 补充明文流量兼容配置
如果项目targetSdkVersion >=28,仅加usesCleartextTraffic在部分系统版本上可能不生效,补充以下配置:
- 在
android/app/src/main/res/xml路径下新建network_security_config.xml文件,写入:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">10.0.2.2</domain> <domain includeSubdomains="true">localhost</domain> </domain-config> </network-security-config>
- 打开
AndroidManifest.xml,在<application>标签上新增属性:android:networkSecurityConfig="@xml/network_security_config" - 重新执行第一步的clean构建命令即可。
内容的提问来源于stack exchange,提问作者Mathias Bradiceanu
相关产品推荐
相关产品推荐

