Android 并且 Fabric (Crashlytics) 插件总是生成一个 UUID (Gradle Kotlin DSL)

Android and the Fabric (Crashlytics) plugin always generates a UUID (Gradle Kotlin DSL)

我希望 Fabric 停止在每次构建时生成 UUID。过去用于 Gradle 的 Groovy DSL 的功能不适用于较新的 Kotlin DSL。 如何使用 Kotlin DSL 实现我的目标?

(Gradle 版本 4.10.2,Fabric 1.25.4)

根据 Fabric 的 documentation,您可以将以下内容添加到应用的构建脚本中

android {
    buildTypes {
        debug {
          // Only use this flag on builds you don't proguard or upload
          // to beta-by-crashlytics
          ext.alwaysUpdateBuildId = false

这行得通。它可以防止 Fabric 在每个调试版本上生成 UUID。但是,如果我将我的构建脚本转换为 Kotlin DSL,以下 不会 工作

android {
    buildTypes {
        getByName("debug") {
          // Only use this flag on builds you don't proguard or upload
          // to beta-by-crashlytics
          ext.set("alwaysUpdateBuildId", false)

Fabric 现在忽略此值。

我试过变体,例如:

project.ext.set("alwaysUpdateBuildId", false)
rootProject.ext.set("alwaysUpdateBuildId", false)
val alwaysUpdateBuildId by extra(false)
val alwaysUpdateBuildId by project.extra(false)
val alwaysUpdateBuildId by rootProject.extra(false)

None 工作。

为了进一步参考,生成此值的 Gradle 任务似乎名为 :app:fabricGenerateResourcesDebug,类型为 DefaultTask

我找到了解决此问题的方法。创建一个文件,fabric.gradle(Groovy 构建脚本!)并将其放置在项目结构中的某处。它将包含以下内容:

// or "com.android.library"
project.pluginManager.withPlugin("com.android.application") {
    android.buildTypes.debug.ext.alwaysUpdateBuildId = false
}

现在,在模块的构建脚本中(我们称之为 app/build.gradle.kts),应用此脚本插件:

apply(from = "path/to/fabric.gradle")

此解决方法基于 Kotlin DSL 入门中的建议 here

作为 Martin Rajniak ,您只能在 ExtensionAware 个对象上调用 extraBuildType 不会被声明为一个对象。

然而,在运行时,构建类型实际上是 ExtensionAware,这就是为什么它在 Groovy 中有效,因为它具有动态性,但在 Kotlin 中却无效,因为在此范围内 extra参考 Project 的扩展。

为了在没有 Groovy 的情况下实现这一点,我们可以简单地将构建类型转换为 ExtensionAware:

android {
    buildTypes {
        getByName("debug") {
            (this as ExtensionAware).extra["alwaysUpdateBuildId"] = false
        }
    }
}