日志日期 · 周一
Kotlin 2.4.20:JVM 元数据默认写入注解等变化
Kotlin 2.4.20 默认在 JVM 元数据中读写注解并新增元数据标志,升级后应核对发布包里的元数据。
当天发生了什么
2026-09-07T10:31Z(UTC),JetBrains/kotlin 仓库发布了 Kotlin 2.4.20,JetBrains 博客同日发布了版本介绍。变更日志中与编译产物相关的条目包括:KT-75736 在 JVM 上默认启用元数据中注解的读写;KT-84802 为 JVM 元数据新增合成类标志;KT-86464 将 isPublicAbi 元数据标志扩展到匿名类和合成局部类。其他条目包括:Kotlin/Native 默认开启增量编译(KT-86657),Kotlin/Wasm 默认开启范围检查(KT-73452),K1 编译器被标记弃用(KT-75372),Swift 导出新增密封类和跨语言子类型等支持。博客还提到 Build Tools API 支持 Kotlin 元数据目标以及 Gradle 9.7.0 支持。
对保护应用逻辑的人意味着什么
Kotlin 元数据记录了源码层面的声明信息,反编译工具常借助它恢复 Kotlin 风格的签名;在 Android 上,R8 会依据保留规则处理这些元数据。编译器默认行为的变化意味着,即使你的代码一行未改,发布包里携带的元数据内容也可能不同。需要谨慎的是,变更日志条目很简短,没有说明具体会多写入哪些数据,也没有说明与 R8 的交互,因此我们不对影响大小做判断,只建议实测。对于 KMP 项目,Swift 导出生成的接口会成为 iOS 二进制中可见的公共表面,同样值得纳入盘点。
可以做的检查
第一,把 Kotlin 升级作为独立变更,并在升级前后各构建一次发布版 APK 或 AAB,对比类文件中的元数据注解和保留下来的类名。第二,确认 R8 的元数据处理与保留规则仍按预期工作,尤其是使用反射或序列化的模块。第三,对 KMP 项目,检查 Swift 导出生成的公共符号是否暴露了不必要的内部概念。第四,在混淆后的发布构建上运行完整测试,而不只是调试构建。
行动清单
- 升级前后对比发布包中的 Kotlin 元数据与类名
- 确认 R8 元数据处理与保留规则仍符合预期
- 检查 Swift 导出暴露的公共符号
原始资料
- GitHub: JetBrains/kotlin release v2.4.20 · 资料日期 2026-09-07 · 核对于 2026-10-12
- The Kotlin Blog: Kotlin 2.4.20 Released · 资料日期 2026-09-07 · 核对于 2026-10-12