直接升级Kotlin编译器版本是根本解法,因低版本编译器无法解析高版本生成的元数据(如1.7.1读不了1.9.0),强行跳过检查会埋下运行时崩溃隐患;需同步更新插件版本、AGP、Gradle并清理缓存。

直接升级 Kotlin 编译器版本,而不是降级依赖或跳过检查。 这类报错本质是低版本编译器读不了高版本元数据,单向不兼容,强行压制(如 -Xskip-metadata-version-check)只是掩盖问题,后续可能在运行时崩溃或 IDE 功能异常。
为什么 kotlin-stdlib-common-1.9.10.jar 会触发 1.7.1 兼容报错
错误信息里出现 /kotlin-stdlib-common-1.9.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module: ... metadata is 1.9.0, expected version is 1.7.1,说明你项目当前用的是 Kotlin 1.7.1 编译器,但某个依赖(这里是 kotlin-stdlib-common-1.9.10)是用 Kotlin 1.9.0 编译的——而 Kotlin 编译器不支持反向兼容:1.7.x 无法解析 1.9.x 写出的元数据。
- 这不是依赖“写错了”,而是
kotlin-stdlib-common-1.9.10本身要求最低编译器版本为 1.9.x(Kotlin 官方文档明确标注) - 即使你没显式声明
kotlin-stdlib-common,它也可能来自kotlinx-coroutines、kotlinx-serialization或 AGP 自带的工具链 - Gradle 的依赖解析默认取最高版本,所以哪怕你写了
1.7.10,只要某处传递引入了 1.9.10,就会覆盖
如何定位哪个依赖偷偷带入了高版本元数据
别猜,用命令查。在项目根目录执行:
./gradlew app:dependencies --configuration compileClasspath | grep "kotlin-stdlib"
重点关注输出中带 1.9. 或更高版本号的行,尤其是那些没有出现在你 build.gradle 里的路径,比如:
-
+--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10 -> 1.9.10(箭头表示被强制升级) -
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.10(来自某个 kotlinx 库) -
\--- androidx.core:core-ktx:1.12.0 -> 1.12.0 (n)(括号里的n表示该模块未声明 kotlin 依赖,但其 transitive 依赖引入了)
如果看到类似 jetified- 前缀的 jar(如 jetified-kotlin-stdlib-common-1.9.10.jar),基本可以断定是某个 AAR 依赖打包进来的高版本 stdlib。
统一 Kotlin 版本的实操要点
必须同时改三处,缺一不可:
- 在
gradle/libs.versions.toml(推荐)或根build.gradle中定义统一变量:kotlinVersion = "1.9.22" - 在所有模块的
plugins块中使用该版本:id("org.jetbrains.kotlin.android") version "1.9.22" - 确保
android.compileSdk≥ 34(Kotlin 1.9.x 要求最低 API 34),且android.namespace已启用(AGP 8.1+ 强制) - 检查
android.ndkVersion是否被旧配置锁定(某些 NDK 版本与 Kotlin 1.9 不兼容,建议删掉让 AGP 自动选)
特别注意:不要只改 kotlin-stdlib 的 implementation 行——插件版本才是控制编译器行为的关键;stdlib 只是运行时依赖,改了它不影响元数据解析逻辑。
AGP 和 Gradle 版本必须同步升级
Kotlin 1.9.22 不是孤立存在的。它需要配套的构建工具链:
- AGP 最低要求:8.3(官方文档明确标注)
- Gradle 最低要求:8.4(Gradle 8.3 不支持 Kotlin 1.9.22 的新 IR 后端)
- 如果你卡在 AGP 8.1 或 Gradle 8.0,就别硬上 1.9.22——退到 Kotlin 1.8.22 + AGP 8.1.3 + Gradle 8.0 是更稳的选择
- 升级后务必清理:
./gradlew clean && ./gradlew --stop && rm -rf ~/.gradle/caches/transforms-*,否则旧缓存里的.kotlin_module文件仍会被读取
真正容易被忽略的点是:IDE 缓存和 Gradle 缓存是两套系统。即使命令行构建成功,Android Studio 仍可能用旧索引报错——此时要 File → Invalidate Caches and Restart… → Just Restart,而不是 “Clear and Restart”。


















