配置编译器参数



我正在寻找一种方法,在我的Android应用程序项目的build.gradle文件中配置Kotlin编译器参数。

我在Kotlin官方文档中看到,可以为每个构建风格(如调试、发布)配置编译器参数。

项目级建筑.gradle

buildscript {
ext.kotlin_version = '1.1.51'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-rc1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

应用程序级构建.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.myapp.myapplication"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
// The interesting part : configure the compileReleaseKotlin task
// to include compiler arguments when building releases
compileReleaseKotlin {
kotlinOptions {
freeCompilerArgs = [
'Xno-param-assertions',
'Xno-call-assertions',
'Xno-receiver-assertions'
]
}
}
dependencies {
// The usual Android dependencies, omitted for brievety
}

在构建项目时,我得到以下错误:

Could not find method compileReleaseKotlin() for arguments [build_7b4e2sfm3830f9z4br95gfme2$_run_closure2@7ed96f28] on project ':app' of type org.gradle.api.Project.

compileReleaseKotlin块是否放错地方或拼写错误?安卓工作室建议我使用这种方法。

编辑2022

自从我发布这个答案以来,Android和Kotlin发生了很多变化。Kotlin-Gradle脚本现在是配置Gradle构建的一种更安全的方式。以下代码段的等效*.gradle.kts,以及其他修复程序,因为它一直都是错误的

android {
// Options are applied to all build types
kotlinOptions {
freeCompilerArgs += listOf(
"-Xno-param-assertions",
"-Xno-call-assertions",
"-Xno-receiver-assertions",
)
}
}

@gmk57指出,不能在buildTypes块中配置特定于给定构建类型的特定编译器参数。kotlinOptions应直接在android块中定义,并且适用于所有构建类型

在撰写本文时,拥有构建类型特定配置的唯一方法是在afterEvaluate:中配置compileReleaseKotlin任务(以及风味变体,如果有的话)

afterEvaluate {
tasks.compileReleaseKotlin {
kotlinOptions {
freeCompilerArgs += listOf(
"-Xno-param-assertions",
"-Xno-call-assertions",
"-Xno-receiver-assertions",
)
}
}

// For flavor dimension full + release
tasks.named<KotlinCompile>("compileFullReleaseKotlin") {
kotlinOptions {
// Same options as above, omitted for brevity
}
}
}

注意,从Android Gradle插件7.0.0开始,有一些有趣的新扩展点允许在插件创建时配置构建变体。DslExtension可能允许Kotlin Android插件与构建类型无缝集成。


原始答案

经过几天的搜索和实验,我终于找到了一种基于构建变体配置编译器的方法。

以下是对我有效的方法:

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// Configure Kotlin compiler optimisations for releases
kotlinOptions {
freeCompilerArgs += [
'-Xno-param-assertions',
'-Xno-call-assertions',
'-Xno-receiver-assertions'
]
}
}
}
}

Gradle Kotlin Android插件的文档似乎不正确:虽然它说编译器可以通过添加compileReleaseKotlin闭包来配置,例如,对于Android,你必须在release中放置一个kotlinOptions块,如上所示。

请注意,对于常规Kotlin项目(没有Android),文档中描述的compileKotlin块按预期工作。

希望它能有所帮助!

编辑为参数添加了-前缀,否则编译器将自动忽略它们。

编辑2=更改为+=,以避免覆盖其他配置中的编译器选项。

对于任何在2020年寻找如何将编译器arg添加到Kotlin Android项目的快速信息的人(我需要它来启用实验序列化API),我就是这样做的:

(应用程序build.gradle文件)

android {
...
compileOptions {
...
kotlin {
kotlinOptions {
freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
}
}
}
}

安卓工作室不提供这些建议。

所有构建类型的Kotlin编译器选项都应在android闭包中指定。这是Android Studio 4.1默认放置kotlinOptions { jvmTarget = '1.8' }的位置:

android {
...
kotlinOptions {
jvmTarget = '1.8'
freeCompilerArgs += ['-Xno-param-assertions']
}
}

特定构建类型的编译器选项应在根级别进行配置,封装在afterEvaluate中,因为只有在Android Gradle插件创建特定构建变体时才会注册任务,而这仅在afterEvaluate阶段完成:

afterEvaluate {
compileReleaseKotlin {
kotlinOptions {
freeCompilerArgs += ['-Xno-param-assertions']
}
}
}

最新更新