Flutter Android发布版APK构建失败:R8编译异常求助
咱们一步步来解决你遇到的这个Release构建失败问题——Debug正常但Release卡在R8编译,从你给出的错误信息和配置文件来看,有几个明确的问题需要修正:
1. 先修复配置文件的低级语法错误
看你app/build.gradle里的这段代码:
def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0'4 throw new GradleException("versionName not found. Define flutter.versionName in the local.properties file.") }
这里flutterVersionName = '1.0'4多了个多余的4,明显是笔误,改成flutterVersionName = '1.0',不然Gradle解析配置时就会出错。
2. 解决AndroidX与旧Support库混用的冲突
你的依赖里同时混用了AndroidX库(比如androidx.appcompat:appcompat:1.1.0)和旧的Support库(com.android.support:support-v4:28.0.0、com.android.support:support-fragment:28.0.0),这会导致字节码冲突,直接触发R8编译失败。必须统一用AndroidX版本:
- 把
implementation "com.android.support:support-v4:28.0.0"替换为:implementation "androidx.legacy:legacy-support-v4:1.0.0" - 把
implementation "com.android.support:support-fragment:28.0.0"替换为:implementation "androidx.fragment:fragment:1.2.5"
(可以根据需要替换为最新稳定版)
3. 移除冲突的R8单独依赖
在project/build.gradle里你单独指定了classpath 'com.android.tools:r8:1.6.84',但你用的Gradle插件是com.android.tools.build:gradle:3.4.2,Gradle插件已经内置了对应版本的R8,单独指定反而会导致版本不兼容。直接删掉这一行即可:
classpath 'com.android.tools:r8:1.6.84' // 删掉这行
4. 清理重复应用的插件
在app/build.gradle的末尾,你重复应用了io.fabric和com.google.gms.google-services插件,已经在顶部应用过了,重复应用会导致构建异常。删掉末尾的这几行:
// firebase_crashlytics apply plugin: 'io.fabric' apply plugin: 'com.google.gms.google-services'
5. 配置R8/ProGuard规则(保留代码压缩的前提下)
你开启了minifyEnabled true但注释掉了ProGuard配置,R8需要正确的规则来避免混淆Flutter框架和第三方库的必要代码:
- 在
app目录下创建proguard-rules.pro文件,添加以下基础规则:# Flutter核心规则 -keep class io.flutter.app.** { *; } -keep class io.flutter.plugin.** { *; } -keep class io.flutter.util.** { *; } -keep class io.flutter.view.** { *; } -keep class io.flutter.** { *; } -keep class io.flutter.plugins.** { *; } # 第三方库规则 -keep class com.google.firebase.** { *; } -keep class com.crashlytics.** { *; } -keep class com.facebook.** { *; } - 在
buildTypes的release块里取消注释ProGuard配置:proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
6. 临时验证方案:禁用代码压缩
如果上面的步骤还没解决,或者想快速验证是否是R8压缩导致的问题,可以执行以下命令构建:
flutter build apk --release --no-shrink
这只是临时方案,建议还是完成上面的配置来保留代码压缩,减小APK体积。
完成以上步骤后,重新执行flutter build apk --release应该就能正常构建了。
内容的提问来源于stack exchange,提问作者LiveRock

