Flutter Gradle 插件的已弃用命令式应用
摘要
#为了构建 Android 的 Flutter 应用,必须应用 Flutter 的 Gradle 插件。从历史上看,这是使用 Gradle 的 旧版、命令式 apply 脚本方法 以命令式方式完成的。
在 Flutter 3.16 中,添加了使用 Gradle 的 声明式 plugins {} 块(也称为插件 DSL)应用这些插件的支持,现在这是推荐的方法。从 Flutter 3.16 开始,使用 flutter create
生成的项目使用插件 DSL 应用 Gradle 插件。使用 Flutter 3.16 之前版本的创建的项目需要手动迁移。
使用 plugins {}
块应用 Gradle 插件执行的代码与之前相同,并且应该生成等效的应用二进制文件。
要了解新的插件 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"
id "com.android.application" version "{agpVersion}" apply false
id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false
}
include ":app"
如果您对该文件进行了一些更改,请确保将它们放在 pluginManagement {}
和 plugins {}
块之后,因为 Gradle 强制执行在这些块之前不能放置任何其他代码。
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
中找到的代码进行以下更改。首先,删除以下 2 个使用旧版命令式 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"
现在再次应用插件,但这次使用插件 DSL 语法。在文件的顶部添加
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
最后,如果您的 dependencies
块包含对 "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
的依赖项,则删除该依赖项。
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
如果它是 dependencies
块中唯一的依赖项,则可以完全删除该块。
验证
#执行 flutter run
以确认您的应用已构建并在连接的 Android 设备或模拟器上启动。
示例
#Google 移动服务和 Crashlytics
#如果您的应用正在使用 Google 移动服务和 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 版本中有所不同。有关详细概述,请参阅 问题 #135392。您应该考虑使用最新版本的构建文件。
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新时间:2024-10-03。 查看源代码 或 报告问题.