必须移除org.jetbrains.kotlin.android插件,因AGP 9.0内置Kotlin支持并自动注册名为“kotlin”的extension,重复声明导致名称冲突报错;所有应用Android插件的模块均需删除该插件及关联配置。

AGP 9.0 升级后,org.jetbrains.kotlin.android 插件必须移除,否则构建直接失败 —— 这不是可选项,是强制要求。
为什么移除 org.jetbrains.kotlin.android 会报错?
AGP 9.0 内置了 Kotlin 编译支持,它会在底层自动注册名为 kotlin 的 Gradle extension。如果你还在模块中手动应用 org.jetbrains.kotlin.android,Gradle 就会报:
Failed to apply plugin 'org.jetbrains.kotlin.android'. > Cannot add extension with name 'kotlin', as there is an extension already registered with that name.
这个错误本质是 extension 名冲突,不是版本没对齐,也不是配置顺序问题 —— 是“同一模块里不允许两个插件抢同一个名字”。
常见误操作包括:
- 只删了
plugins { id "org.jetbrains.kotlin.android" },但忘了删kotlin-android对应的dependencies块里的kapt或implementation引用 - 在
build.gradle.kts中用了alias(libs.plugins.kotlin.android),但没同步删掉libs.versions.toml里对应的声明 - 多模块项目中,只改了 app 模块,漏掉了其他 Android 库模块(比如
feature-login)
怎么安全地迁移 kotlinOptions 和 sourceSets?
AGP 9.0 不再通过 org.jetbrains.kotlin.android 插件暴露 DSL,而是把 Kotlin 相关配置收归到 android 块下统一管理。原来写在 kotlin { ... } 里的内容,现在要挪进去:
-
kotlinOptions.jvmTarget→ 改为android.compileOptions.sourceCompatibility和targetCompatibility(JVM 目标由 Java 编译器控制) -
kotlinOptions.freeCompilerArgs→ 改为android.kotlinOptions.freeCompilerArgs(注意路径变了,且仅限 Kotlin 特有参数,如-Xcontext-receivers) -
kotlin.sourceSets→ 完全废弃;Android 模块的源码集由android.sourceSets管理,Kotlin 文件自动纳入main/debug等变体目录
示例迁移前(Groovy):
kotlin {
jvmTarget = "17"
freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
}
迁移后(KTS):
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
freeCompilerArgs += listOf("-Xopt-in=kotlin.RequiresOptIn")
}
}
哪些模块还能保留 org.jetbrains.kotlin.android?
答案是:**没有一个能留**。只要模块应用了 com.android.application 或 com.android.library,就必须删掉 org.jetbrains.kotlin.android。
例外只存在于纯 JVM 模块(比如 :core:domain)或 KMP 共享模块(:shared),它们不应用 Android 插件,所以仍需保留 org.jetbrains.kotlin.jvm 或 org.jetbrains.kotlin.multiplatform —— 但这类模块本身就不受 AGP 内置 Kotlin 影响。
容易踩坑的点:
- 误以为 “用了 KSP 就还得留 kotlin-android”:错。KSP 只依赖 Kotlin 编译器,不依赖
kotlin-android插件 - 在
buildSrc或自定义 Gradle 插件里引用了KotlinAndroidPlugin类:这类代码在 AGP 9.0 下会 ClassNotFound,必须重写为基于androidComponentsAPI 的逻辑 - CI 脚本里硬编码了
./gradlew build -Pandroid.builtInKotlin=false:这个开关已失效,AGP 9.0 强制启用内置 Kotlin,设为 false 会被忽略
真正麻烦的从来不是删掉一行插件声明,而是那些散落在 buildSrc、自定义 task、甚至 CI 配置里的隐式依赖 —— 它们不会报错,但会让构建行为和本地不一致。











