You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:45:25