为 Android 项目中的每个 buildType 分别指定 kapt 的参数

问题描述 投票:0回答:1

基本上,当我在调试模式下组装时,我希望我的注释处理器插入某些调试逻辑,而在发布时,我希望生成的代码尽可能快地执行而无需额外检查。

如何为每种构建类型分别指定 kapt 的参数? 当然,我希望它像这样工作:

android {
  buildTypes {
    debug {
      kapt {
        arg("key", "value-for-debug")
      }
    }
    debug {
      kapt {
        arg("key", "value-for-release")
      }
    }
  }
}

但它不起作用,因为

kapt {}
是从
android {}
闭包中调用的,而不是从特定的
buildType
闭包中调用的,所以自然而然地,发布者获胜并被到处使用。

我怀疑我无法通过

kapt {}
调用解决我的问题,因为它确实是插件的全局变量。那么是否有另一种解决方法,比如为特定任务或其他东西指定参数?

android gradle android-gradle-plugin annotation-processing kapt
1个回答
0
投票

好吧,事实证明,自从 Kotlin

1.7.0
以来,它实际上是可以实现的。在该版本中,KAPT 插件公开了一个公共任务接口——
org.jetbrains.kotlin.gradle.tasks.Kapt
,它具有
annotationProcessorOptionProviders
属性。该属性具有
MutableList<Any>
的类型,但实际上它是
MutableList<List<CommandLineArgumentProvider>>
.

所以,可以按照以下方式写一些东西:

// Somewhere in your build.gradle.kts

tasks.withType<Kapt> {
    if (name.startsWith("kaptDebug")) {
        annotationProcessorOptionProviders += listOf(CommandLineArgumentProvider {
            listOf("key", "value-for-debug")
        }
    } else if (name.startsWith("kaptRelease")) {
        annotationProcessorOptionProviders += listOf(CommandLineArgumentProvider {
            listOf("key", "value-for-release")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.