composecompilerextensionversion 已弃用,其版本由 kotlin 插件严格绑定;需统一多模块 kotlin 版本,仅在含 ui 模块启用 compose 插件并设 buildfeatures.compose = true,依赖须通过 bom 管理且不显式指定版本。

composeCompilerExtensionVersion 已被弃用,别再手动设了
从 Kotlin 1.9.0 和 AGP 8.1 开始,composeCompilerExtensionVersion 已被移除。硬写这个字段会导致构建失败或静默忽略——Gradle 不会报错,但 Compose 编译器实际没生效。
现在 Compose 编译器版本完全由 Kotlin 插件版本决定,且必须严格匹配。比如你用 kotlin-gradle-plugin:2.0.20,它内建的 Compose 编译器就是 2.0.20 对应的那个,不能也不该覆盖。
- 查当前 Kotlin 插件版本:看
gradle/libs.versions.toml里libs.plugins.kotlin的值,或模块级build.gradle.kts中plugins { alias(libs.plugins.kotlin) }引用的版本 - 确认兼容性:访问官方 Compose 与 Kotlin 兼容性表,核对你的 Kotlin 版本是否支持目标 Compose BOM(如
2026.04.01) - 多模块项目要特别注意:所有子模块必须用同一个 Kotlin 插件版本,否则某个模块的
@Composable函数可能因编译器不一致而跳过重组或崩溃
插件声明必须分两级:项目级只声明,模块级才启用
常见错误是直接在项目级 build.gradle.kts 里写 apply(plugin = "org.jetbrains.kotlin.plugin.compose") ——这会让所有模块无差别启用,但某些纯数据模块根本不需要 Compose 支持,反而拖慢编译、触发不必要的注解处理。
正确做法是:
- 项目级
build.gradle.kts(或gradle/plugins.gradle.kts)中只声明插件 ID 和版本:alias(libs.plugins.kotlin.compose) apply false - 仅在真正含 UI 的模块(如
app或feature-login)的build.gradle.kts中启用:alias(libs.plugins.kotlin.compose) - 如果用的是传统 Groovy,对应写法是:
id("org.jetbrains.kotlin.plugin.compose") version "2.0.20" apply false(项目级)和id("org.jetbrains.kotlin.plugin.compose")(模块级)
buildFeatures.compose = true 是开关,不是可选项
即使插件已启用、依赖已引入,android { buildFeatures { compose = true } } 这一行漏掉,Gradle 就不会把 .kt 文件交给 Compose 编译器处理——所有 @Composable 函数会被当成普通函数,预览失效、重组逻辑丢失、remember 不工作,且零编译报错。
这个配置必须出现在启用 Compose 插件的**同一模块**的 android 块里,不能放在其他地方。常见踩坑点:
- 在库模块(
library)里启用了插件但没开compose = true→ 模块能编译,但其他模块引用它的 Composable 时会提示 “unresolved reference” - AGP 升级到 8.5+ 后,
buildFeatures必须显式声明,不能依赖默认值 - 使用
androidApp或androidLibraryGradle DSL 时,buildFeatures是必需项,不写就构建失败
依赖用 BOM 管理,但别混用版本号
用 platform("androidx.compose:compose-bom:2026.04.01") 是对的,但紧接着又写 implementation("androidx.compose.ui:ui:1.7.0") 就会冲突——BOM 已锁定 ui 为 1.7.3,手动指定低版本会触发 Gradle 冲突警告,高版本则可能因 ABI 不兼容 crash。
安全写法只有一条规则:
- 所有 Compose 相关依赖(
ui、material3、foundation等)都只写 group + name,不带版本号,例如:implementation("androidx.compose.ui:ui") - 测试依赖也走 BOM:
androidTestImplementation(platform("androidx.compose:compose-bom:2026.04.01")),否则ui-test-junit4可能拉错版本,导致createComposeRule()找不到 - 如果你非要试新特性(比如还没进 BOM 的
ui-tooling-previewalpha 版),单独加版本号可以,但得确保它和当前 Kotlin 插件兼容,且只限 debugImplementation
最易被忽略的一点:BOM 版本号(如 2026.04.01)里的年份和月份代表发布时间,不是 API 级别。2026.04.01 和 2026.07.01 可能只差几个 bugfix,但跨月升级前务必跑一次 ./gradlew composeCompilerReport 看是否触发新的稳定性警告。











