Flutter Gradle 插件的命令式应用已弃用
概述
#要构建 Flutter Android 应用,必须应用 Flutter 的 Gradle 插件。过去,这通常通过 Gradle 的 旧式命令式 apply 脚本方法 以命令式的方式完成。
在 Flutter 3.16 中,已添加对使用 Gradle 的 声明式 plugins {} 块(也称为 Plugin DSL)应用这些插件的支持,现在这已是推荐的做法。自 Flutter 3.16 起,使用 flutter create 生成的项目会使用 Plugin DSL 来应用 Gradle 插件。在 Flutter 3.16 之前的版本创建的项目需要手动迁移。
使用 plugins {} 块应用 Gradle 插件会执行与之前相同的代码,并且应该会生成相同的应用二进制文件。
要了解新的 Plugin DSL 语法相对于旧式 apply 脚本语法的优势,请参阅 Gradle 文档。
将应用生态系统迁移到使用新方法,也将使 Flutter 团队更容易开发 Flutter 的 Gradle 插件,并支持未来令人兴奋的新功能,例如在 Gradle 构建脚本中使用 Kotlin 而不是 Groovy。
迁移
#android/settings.gradle
#首先,找到项目当前使用的 Android Gradle Plugin (AGP) 和 Kotlin 的版本。除非它们已被移动,否则它们很可能定义在 <app-src>/android/build.gradle 文件的 buildscript 块中。例如,考虑此更改之前使用新 Flutter 应用创建的 build.gradle 文件
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}AGP 版本是行 classpath 'com.android.tools.build:gradle:7.3.0' 末尾的数字,在本例中为 7.3.0。同样,Kotlin 版本在行 ext.kotlin_version = '1.7.10' 的末尾,在本例中为 1.7.10。
接下来,用以下内容替换 <app-src>/android/settings.gradle 的内容,记住用先前确定的值替换 {agpVersion} 和 {kotlinVersion}
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0" // apply true
id "com.android.application" version "{agpVersion}" apply false
id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false
}
include ":app"如果您对此文件进行了一些更改,请确保它们位于 pluginManagement {} 和 plugins {} 块之后,因为 Gradle 会强制要求这些块之前不能放置任何其他代码。
Flutter Gradle 插件 (dev.flutter.flutter-plugin-loader) 不应设置为 apply false(默认值为 true),或者应明确设置为 true。
android/build.gradle
#从 <app-src/android/build.gradle 中删除整个 buildscript 块
buildscript {
ext.kotlin_version = '{kotlinVersion}'
repositories {
google()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:gradle-plugin:$kotlin_version"
}
}该文件最终可能如下所示
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}android/app/build.gradle
#默认情况下位于 <app-src>/android/app/build.gradle 中的代码也需要进行以下更改。首先,删除以下两个使用旧式命令式 apply 方法的代码块
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.")
}apply plugin: 'com.android.application'
apply plugin: 'com.jetbrains.kotlin.android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"现在再次应用插件,但这次使用 Plugin DSL 语法。在文件的最顶部添加
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}"dev.flutter.flutter-gradle-plugin" 是项目 Flutter Gradle 插件,它与在 settings.gradle(.kts) 中应用的字符串("dev.flutter.flutter-plugin-loader")不同。
最后,如果您的 dependencies 块包含对 "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 的依赖,请删除该依赖。
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}如果这是 dependencies 块中的唯一依赖项,则可以完全删除该块。
验证
#执行 flutter run 以确认您的应用在连接的 Android 设备或模拟器上能够成功构建和启动。
示例
#Google Mobile Services 和 Crashlytics
#如果您的应用使用了 Google Mobile Services 和 Crashlytics,请从 <app-src>/android/build.gradle 中删除以下行
buildscript {
// ...
dependencies {
// ...
classpath "com.google.gms:google-services:4.4.0"
classpath "com.google.firebase:firebase-crashlytics-gradle:2.9.9"
}
}然后从 <app-src>/android/app/build.gradle 中删除这两行
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'要迁移到 GMS 和 Crashlytics 插件的新声明式 apply 语法,请将它们添加到应用 <app-src>/android/settings.gradle 文件的 plugins 块中。添加的内容应与以下内容类似,但使用您期望的版本,可能与您从 <app-src>/android/build.gradle 文件中删除的版本匹配。
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "{agpVersion}" apply false
id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false
id "com.google.gms.google-services" version "4.4.0" apply false
id "com.google.firebase.crashlytics" version "2.9.9" apply false
}将以下行添加到 <app-src>/android/app/build.gradle
plugins {
id "com.android.application"
id "dev.flutter.flutter-gradle-plugin"
id "org.jetbrains.kotlin.android"
id "com.google.gms.google-services"
id "com.google.firebase.crashlytics"
}时间线
#稳定版支持:3.16.0 稳定版推荐:3.19.0
参考资料
#flutter create 生成的 Gradle 构建文件在不同 Flutter 版本之间存在差异。有关详细概述,请参阅 issue #135392。您应该考虑使用最新的构建文件版本。