React Native Release构建中HTTP请求失败,需支持HTTP/HTTPS双协议
React Native Release构建下HTTP请求失败排查方案
问题背景
React Native应用在Release构建模式(模拟器、真机均出现此问题)下,HTTP请求会抛出空异常并失败,但相同请求在Development构建中完全正常;HTTPS请求则没有任何异常。已经在AndroidManifest.xml中设置了android:usesCleartextTraffic="true",使用的构建命令为npx react-native build-android --mode=release。
排查与解决步骤
1. 检查自定义网络安全配置
如果项目中配置了res/xml/network_security_config.xml,即使开了usesCleartextTraffic,也可能被这个文件限制明文流量:
- 确保配置文件里明确允许明文:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
- 同时确认AndroidManifest的
<application>标签已经关联这个配置:
<application ... android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="true">
2. 修正ProGuard/R8混淆规则
Release构建时,混淆工具可能会把网络请求相关的核心类(比如OkHttp、Retrofit的代码)给混淆掉,导致请求逻辑出错:
- 打开
android/app/proguard-rules.pro,添加对应网络库的混淆排除规则,以OkHttp为例:
# OkHttp相关类不混淆 -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } -dontwarn okhttp3.** # Okio依赖不混淆 -keep class okio.** { *; } -dontwarn okio.**
如果用的是Fetch API或者其他网络库,也要把对应的核心类加入不混淆列表。
3. 适配Android 11+的域名访问限制
Android 11(API 30)及以上版本,针对API 30+的应用,需要在AndroidManifest.xml里声明允许访问的域名或网络scheme:
<queries> <!-- 允许HTTP、HTTPS协议的访问 --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <!-- 也可以直接指定你的HTTP请求域名 --> <domain android:name="your-target-domain.com" /> </queries>
4. 开启Release构建调试定位异常
如果上面的方法都没解决,可以临时开启Release构建的调试模式,抓具体的错误日志:
- 修改
android/app/build.gradle里的release构建配置:
buildTypes { release { debuggable true // 临时开启调试 minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
然后用adb logcat命令查看设备日志,找到网络请求相关的错误信息,就能定位空异常的具体原因了(上线前记得把debuggable改回false)。
内容的提问来源于stack exchange,提问作者Bibin
相关产品推荐
相关产品推荐

