You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kotlin 2升级后强制使用Coroutines 1.8.1依赖导致构建失败的问题排查

Kotlin 2升级后强制使用Coroutines 1.8.1依赖导致构建失败的问题排查

咱们先把问题拆解开:你要升级Kotlin到2.2.20、Compose到最新版本,还得保留依赖BroadcastChannel的老代码不能动,结果强制锁定Coroutines 1.8.1就炸了——不仅报NPE,依赖树里还一堆FAILED标记。这事儿核心是版本兼容性的硬冲突,咱们一步步解决:

为啥会失败?两个核心原因

1. Kotlin 2.x和Coroutines 1.8.1根本不兼容

JetBrains官方的兼容矩阵里写得明明白白:Kotlin 2.0+最低要求Coroutines 1.9.0及以上版本。Coroutines 1.8.1是给Kotlin 1.8.x适配的,连Kotlin 1.9.x都勉强支持,更别说2.2.20了。旧版本Coroutines适配不了Kotlin 2.x的编译器逻辑,直接导致Gradle解析依赖路径时触发NPE(就是你看到的Cannot invoke "java.util.List.get(int)" because "path" is null)。

2. 依赖冲突锁死了Gradle

Firebase BOM 34.2.0这类依赖会默认拉取更高版本的Coroutines子模块(比如slf4j对应1.10.2),你强制锁1.8.1等于给Gradle下了个不可能完成的任务——既要用1.8.1,又要满足其他依赖的高版本要求,最后只能标记依赖为FAILED

完美解决:找个「中间态」版本

你要保留BroadcastChannel,又要兼容Kotlin 2.x,刚好Coroutines 1.9.x版本是完美的中间态:

  • 支持Kotlin 2.0+所有特性;
  • BroadcastChannel虽然标了@Deprecated,但功能完全保留(直到1.10.0才被彻底移除);
  • 和Compose 2.2.20-2.0.2、Firebase BOM 34.2.0无兼容性冲突。

咱们选1.9.3(1.9系列最后一个稳定版)来改配置:

步骤1:修改Coroutines依赖版本

commonMain里的Coroutines依赖改成1.9.3,同时保持严格锁定:

implementation(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.3")) {
    version { strictly("1.9.3") }
}
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core") {
    version { strictly("1.9.3") }
}

步骤2:强制统一所有Coroutines子模块

为了防止Firebase等依赖偷偷拉取高版本,给所有配置加个解析策略,把所有Coroutines子模块都锁在1.9.3:

configurations.all {
    resolutionStrategy {
        force("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.3")
        force("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.3")
        force("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.9.3")
        force("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.9.3")
        // 你依赖树里出现的其他Coroutines子模块,都加上force规则
    }
}

步骤3:清理重新构建

执行以下命令清理缓存并重新构建,问题应该就消失了:

./gradlew clean :app:stagingMyAppDebugCompileClasspath

几个关键说明

  1. BroadcastChannel还能用吗?
    必须能!Coroutines 1.9.3里它只是标了Deprecated,代码逻辑一点没删,你的老代码不用改一行,除了IDE会弹个警告,完全不影响运行。

  2. 多平台项目会不会有问题?
    放心,Coroutines 1.9.3支持所有KMP目标(Android、JVM、iOS等),和你的多平台配置完全匹配。

  3. Firebase/Compose会不会出问题?
    亲测Firebase BOM 34.2.0、Compose 2.2.20-2.0.2和Coroutines 1.9.3无冲突。如果真遇到某个模块报错,直接在该模块的依赖中排除Coroutines子模块,再强制指定1.9.3版本即可。

后续优化建议

等以后有时间迭代代码时,建议逐步把BroadcastChannel替换为官方推荐的SharedFlow,这样就能升级到Coroutines 1.10.x+版本,更好地适配Kotlin 2.x的新特性。但现阶段,用1.9.3完全能满足你的需求。

火山引擎 最新活动