kotlinoptions.languageversion 控制编译器接受的语言特性(如sealed interfaces、type aliases等),仅影响源码解析,不改变字节码目标;须在模块级build.gradle.kts的kotlinoptions块中声明,与jvmtarget独立但需协同,android推荐设为"2.0"和"11"。

什么是 kotlinOptions.languageVersion
它控制 Kotlin 编译器接受哪些语言特性(比如 val 解构、sealed interfaces、type aliases 等),但不改变生成的字节码目标版本。它只影响源码解析阶段,和 jvmTarget 是两回事。
设置位置与常见错误
必须在模块级 build.gradle.kts 的 kotlinOptions 块中声明,且仅对 Kotlin 源码生效;Java 源码不受影响。常见错误是把它写在 android {} 外层、或误当成 JVM 兼容性开关:
- ❌ 错误:放在
plugins {}后面、未嵌套进kotlinOptions - ❌ 错误:设为
"17"以为能用 Java 17 特性(实际要靠compileOptions) - ✅ 正确写法(Kotlin DSL):
kotlinOptions { languageVersion = "2.0" jvmTarget = "11" }
languageVersion 和 jvmTarget 的关系
二者独立但需协同。例如你设 languageVersion = "2.0"(启用新语法),但 jvmTarget = "8",编译仍成功——只是新语法最终被降级为 JVM 8 兼容字节码。反之,若 jvmTarget = "17" 却没开 languageVersion = "2.0",你依然不能用 sealed interface 这类 2.0+ 语法。
-
languageVersion决定“你能写什么” -
jvmTarget决定“生成的 class 能跑在哪” - Android 项目推荐统一设为
"2.0"+"11"(AGP 8.4+ / Kotlin 2.0+ 默认值)
多模块项目里容易忽略的一点
如果项目含多个子模块(如 :app、:lib、:feature),每个模块的 kotlinOptions 需单独配置。根项目的 build.gradle.kts 中设了不生效。更稳妥的做法是用 subprojects 统一注入:
subprojects {
plugins.withType<org.jetbrains.kotlin.gradle.dsl.kotlinpluginwrapper> {
kotlinOptions.languageVersion = "2.0"
}
}</org.jetbrains.kotlin.gradle.dsl.kotlinpluginwrapper>
不过要注意:某些 KMP 模块可能需要不同值(如 JS 目标不支持 "2.0"),所以全局强设反而容易出错。最稳的方式仍是按模块显式声明。











