Android原生模块(Rust开发)无法访问10.0.2.2以外网络的问题
排查方案:Rust原生模块接入Expo Android后无法访问外部站点
1. 确认Network Security Config配置生效
先检查Android原生项目的配置文件是否正确部署:
- 查看
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">your-target-domain.com</domain> <!-- 添加所有需要访问的外部域名 --> </domain-config> </network-security-config>
- 核对
AndroidManifest.xml的application标签,确保android:networkSecurityConfig="@xml/network_security_config"的路径和文件名无拼写错误。
2. 排查Rust原生模块的请求实现
请求由Rust模块发起,重点检查以下内容:
- 确认使用的Rust网络库(如
reqwest、hyper)没有硬编码代理或请求地址限制,比如是否默认仅允许访问10.0.2.2; - 给Rust请求添加日志输出,打印具体错误信息(如连接超时、DNS解析失败、证书校验错误),直接定位问题根源;
- 检查
Cargo.toml的依赖配置,部分Rust网络库在Android环境下需要启用特定特性(如reqwest的native-tls或rustls-android)才能正常访问外部网络。
3. 同步Expo项目的权限配置
确保Expo配置与Android原生配置同步:
- 在
app.json/app.config.js中声明网络权限:
{ "expo": { "android": { "permissions": ["INTERNET"] } } }
- 修改配置后执行
expo prebuild(预构建模式)或重新构建项目,确保Expo将权限配置同步到Android原生工程。
4. 验证设备/模拟器的网络环境
- 用模拟器自带浏览器打开目标外部站点,确认设备本身能正常访问外部网络;
- 检查模拟器是否设置了代理,或真实设备是否开启VPN/代理工具,这类配置会拦截外部请求。
5. 区分HTTP与HTTPS请求场景
- 若为HTTP明文请求:确认network security config中的域名拼写正确,
includeSubdomains参数是否符合需求; - 若为HTTPS请求:检查目标站点证书是否被Android系统信任,部分Rust库默认严格校验证书,证书异常会直接导致请求失败。可临时关闭证书校验(仅用于测试)确认问题,再通过导入自定义证书等方式解决。
内容的提问来源于stack exchange,提问作者Ohad Dahan
相关产品推荐
相关产品推荐

