Flutter发布版APK中DIO无法调用服务问题求助
解决方案:Release版Flutter应用DIO无法调用服务的排查与修复
1. 检查网络安全配置
你的AndroidManifest.xml里配置了android:networkSecurityConfig="@xml/network_security_config",这个文件直接控制Android的网络访问规则,Release模式下默认会限制非HTTPS请求或未授权域名:
- 若使用HTTP接口,在
network_security_config.xml中允许明文流量:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
- 若使用HTTPS接口,需确保服务域名被加入信任列表,或配置自定义证书:
<network-security-config> <domain-config> <domain includeSubdomains="true">你的服务域名</domain> <trust-anchors> <certificates src="@raw/你的证书文件" /> </trust-anchors> </domain-config> </network-security-config>
2. 修复ProGuard/R8混淆规则
即使关闭混淆,默认R8优化仍可能破坏DIO核心类。在android/app/proguard-rules.pro中添加保护规则:
# 保护DIO及相关依赖类不被混淆 -keep class com.dio.** { *; } -keep class com.dio.http.** { *; } -keep class retrofit2.** { *; } -keepclasseswithmembers class * { @retrofit2.http.* <methods>; } -keepclasseswithmembers class * { @com.google.gson.annotations.SerializedName <fields>; }
同时确保android/app/build.gradle的混淆配置正确:
buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
3. 验证HTTPS证书有效性
Release模式下Android会严格校验HTTPS证书,若证书自签名/过期,DIO请求会直接失败:
- 优先确保服务端使用正规CA签发且未过期的证书
- 测试环境需用自签名证书时,在DIO中添加信任逻辑:
ByteData certData = await rootBundle.load('assets/certs/your_cert.pem'); SecurityContext securityContext = SecurityContext.defaultContext; securityContext.setTrustedCertificatesBytes(certData.buffer.asUint8List()); Dio dio = Dio(BaseOptions(baseUrl: "https://你的域名")); dio.httpClientAdapter = HttpClientAdapter()..onHttpClientCreate = (client) { client.badCertificateCallback = (cert, host, port) => true; return client; };
注意:正式环境禁止跳过证书校验,会带来安全风险。
4. 检查BaseUrl与环境配置
确认Release模式使用的接口地址和Debug一致,避免环境切换配置错误:
// 检查这里的生产环境地址是否正确 String baseUrl = kReleaseMode ? "https://prod-api.example.com" : "https://dev-api.example.com";
5. 抓取Release模式日志定位问题
通过adb命令或Firebase Crashlytics查看具体错误信息:
adb logcat -s Flutter:D Dio:D
日志会明确显示失败原因,比如证书错误、网络超时、域名解析失败等,针对性修复即可。
内容的提问来源于stack exchange,提问作者Diego Castaño
相关产品推荐
相关产品推荐

