跳至主要内容

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 文件

groovy
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} 替换为先前确定的值

groovy
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

groovy
buildscript {
    ext.kotlin_version = '{kotlinVersion}'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:gradle-plugin:$kotlin_version"
    }
}

以下是该文件最终可能的样子

groovy
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 方法的代码块

groovy
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.")
}
groovy
apply plugin: 'com.android.application'
apply plugin: 'com.jetbrains.kotlin.android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

现在再次应用插件,但这次使用插件 DSL 语法。在文件的顶部添加

groovy
plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
}

最后,如果您的 dependencies 块包含对 "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 的依赖项,则删除该依赖项。

groovy
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

如果它是 dependencies 块中唯一的依赖项,则可以完全删除该块。

验证

#

执行 flutter run 以确认您的应用已构建并在连接的 Android 设备或模拟器上启动。

示例

#

Google 移动服务和 Crashlytics

#

如果您的应用正在使用 Google 移动服务和 Crashlytics,请从 <app-src>/android/build.gradle 中删除以下行

groovy
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 中删除这两行

groovy
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 文件中删除的版本匹配。

groovy
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

groovy
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。您应该考虑使用最新版本的构建文件。