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
个对象上调用 extra
,BuildType
不会被声明为一个对象。
然而,在运行时,构建类型实际上是 ExtensionAware
,这就是为什么它在 Groovy 中有效,因为它具有动态性,但在 Kotlin 中却无效,因为在此范围内 extra
参考 Project
的扩展。
为了在没有 Groovy 的情况下实现这一点,我们可以简单地将构建类型转换为 ExtensionAware
:
android {
buildTypes {
getByName("debug") {
(this as ExtensionAware).extra["alwaysUpdateBuildId"] = false
}
}
}
我希望 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
个对象上调用 extra
,BuildType
不会被声明为一个对象。
然而,在运行时,构建类型实际上是 ExtensionAware
,这就是为什么它在 Groovy 中有效,因为它具有动态性,但在 Kotlin 中却无效,因为在此范围内 extra
参考 Project
的扩展。
为了在没有 Groovy 的情况下实现这一点,我们可以简单地将构建类型转换为 ExtensionAware
:
android {
buildTypes {
getByName("debug") {
(this as ExtensionAware).extra["alwaysUpdateBuildId"] = false
}
}
}