Flutter项目Gradle构建报错:Jar.destinationDir()方法签名不匹配
问题解决:Flutter Android构建报错
No signature of method: org.gradle.api.tasks.bundling.Jar.destinationDir() 错误本质
该报错核心是Gradle版本与Flutter Gradle插件不兼容:Gradle 7.x及以上版本中,Jar任务的destinationDir属性已被移除,替换为destinationDirectory,而旧版Flutter插件仍在调用废弃API。同时项目配置存在多处不合理设置,加剧了冲突。
修复步骤
1. 修正根目录build.gradle的错误配置
根目录build.gradle是项目级配置,不能包含App级的插件和Android配置。删除其中所有apply plugin: 'com.android.application'及后续的android代码块,修正后的完整内容如下:
buildscript { ext { kotlin_version = '1.8.22' // 升级到兼容Gradle 7.x的版本 compileSdkVersion = 33 } repositories { google() mavenCentral() // 替换已废弃的jcenter() gradlePluginPortal() } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' // 升级到稳定兼容版本 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.4.0' // 升级到最新稳定版 classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.12.10, 0.99.99]' } } allprojects { repositories { google() mavenCentral() // 替换jcenter() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" }
2. 修正app/build.gradle的配置问题
- 升级
buildToolsVersion与compileSdk版本匹配 - 修正Material库的无效版本号
- 移除已废弃的
kotlin-android-extensions插件 - 统一使用Flutter定义的版本号
- 替换为AndroidX测试 runner
修正后的完整内容:
def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } // 调整插件应用顺序,确保Flutter插件在核心插件之后 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply plugin: 'com.google.gms.google-services' apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin' android { compileSdk 33 buildToolsVersion '33.0.2' // 匹配compileSdk版本 defaultConfig { applicationId "com.example.abc.test" minSdkVersion 21 targetSdkVersion 33 versionCode flutterVersionCode.toInteger() // 统一使用Flutter定义的版本号 versionName flutterVersionName // 统一使用Flutter定义的版本名 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 替换为AndroidX版本 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { manifestPlaceholders = [applicationName: "android.app.Application"] } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } flutter { source '../..' } dependencies { implementation platform('com.google.firebase:firebase-bom:32.2.0') // 升级到最新稳定BOM版本 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" // 使用jdk8替代jdk7 implementation 'com.onesignal:OneSignal:[4.0.0, 4.99.99]' implementation 'com.google.android.material:material:1.9.0' // 修正Material库版本 }
3. 清理缓存并重新构建
- 执行终端命令:
flutter clean - 在Android Studio中点击
File > Sync Project with Gradle Files - 重新运行或构建项目
额外注意事项
- 严格区分项目级(根目录)和模块级(app/)
build.gradle的配置范围,不要混淆 - 优先使用
mavenCentral()替代已废弃的jcenter()仓库 - 若使用旧版Flutter,建议升级到3.13+稳定版,确保Flutter Gradle插件与Gradle版本兼容
内容的提问来源于stack exchange,提问作者Amjad Khoulani
相关产品推荐
相关产品推荐

