关于 K2 Mode 在 Android Studio Ladybug 更新里我们简单介绍过,因为 Ladybug 采用的是 IntelliJ IDEA 2024.2 ,所以 AS 也开始支持新的 K2 机制,例如支持 gradle.kts 、KMP 项目、代码突出显示、调试等。
而从 IntelliJ IDEA 2024.3 版本开始,K2 模式正式脱离 Beta 阶段,开始进入稳定版本阶段,K2 模式显著提高了 Kotlin 代码分析的稳定性、内存的消耗效率和 IDE 的整体性能,并支持 Kotlin 2.1 语言功能等。
同理目前的 Android Studio Meerkat 也开始同步支持稳定版本的 K2 mode 。
IntelliJ IDEA 中的 K2 模式是为了解决上一版本的 Kotlin 插件限制而开发的,包括解决了各种性能和稳定性问题,例如它会通过提高代码分析稳定性和性能,来减少 UI 冻结从而提高 Kotlin 插件的生产效率,同时 K2 模式还支持 Kotlin 2.1 及更高版本中引入的新语言功能。
最主要的是,IntelliJ IDEA 的 K2 模式并不依赖于项目构建设置中指定的 Kotlin 编译器版本,K2 模式代表 IDE 中对 Kotlin 支持的几乎完全重写。
“K2” 对应的是 Kotlin 插件包含用于代码分析的 K2 Kotlin 编译器的内部版本,而 K1 模式使用 K1 编译器,IntelliJ IDEA 中内置的 Kotlin 编译器版本完全独立于项目构建文件中指定的版本,但它可能会影响项目中支持的 Kotlin 版本范围。
从目前数据来看, K2 编译器带来的性能提升是十分明显的,例如过去 Kotlin 团队对 Anki-Android 和 Exposed 这两个开源项目进行了性能测试,可以看到:
- K2 编译器带来了高达 94% 的编译速度提升,例如在 Anki-Android 项目里,构建时间从 Kotlin 1.9.23 中的 57.7 秒缩短到 Kotlin 2.0.0 中的 29.7 秒
- 使用 K2 编译器,在初始化阶段的速度提高了 488%,例如在 Anki-Android 项目里,增量构建的初始化阶段从 Kotlin 1.9.23 中的 0.126 秒缩短到 Kotlin 2.0.0 中的仅 0.022 秒
- 与之前的编译器相比,Kotlin K2 编译器在分析阶段的速度提高了 376%,例如在 Anki-Android 项目里,增量构建的分析时间从 Kotlin 1.9.23 中的 0.581 秒缩短到 Kotlin 2.0.0 中的仅 0.122 秒
凭借新的架构,K2 模式在 Kotlin 代码分析、补全和导航速度方面取得了巨大进步,例如下面是官方通过一些闭源和开源项目做的基准测试结果:
- IntelliJ IDEA:IntelliJ IDEA Ultimate 的源代码(闭源)
- kotlinx.coroutines https://github.com/Kotlin/kotlinx.coroutines
- Ktor:https://github.com/ktorio/ktor
上述图片里的结果是越低越好,可以看到,不管是代码分析,提示高亮或者搜索,K2 模式都是“遥遥领先” K1 ,
当然,对于某些 Kotlin 第三方插件而言,在 K2 模式下可能会因为 API 变更等原因需要做一些适配调整,例如在此之前,分析 Kotlin 代码的唯一实用方法是使用 Kotlin 编译器的内部结构,这是一种不安全的 API,不是为了外部使用而设计,而 K2 现在可以通过迁移适配,使用 Analysis API 所提的更简洁的支持:
- 旧的编译器 API
val SPECIAL_ANNOTATION_NAME = FqName("my.app.Special")fun hasAnnotation(declaration: KtDeclaration): Boolean {val bindingContext = declaration.analyze()val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, declaration]?: return falsereturn descriptor.annotations.hasAnnotation(SPECIAL_ANNOTATION_NAME)
}
- 新 Analysis API
val SPECIAL_ANNOTATION_CLASS_ID = ClassId.fromString("my/app/Special")fun hasAnnotation(declaration: KtDeclaration): Boolean {analyze(declaration) {return SPECIAL_ANNOTATION_CLASS_ID in declaration.symbol.annotations}
}
未来计划在 2025.1 版本,官方计划将 K2 模式设为默认选项,所以未来 Android Studio 也将默认使用 K2 Mode ,这对于 Android 开发来说,是一个不可逃避的话题。
其实K2 编译器确实有了不少提升,比如如下代码所示,在 K2 之前是无法被正常识别的,但是 K2 开始在 IDEA 代码分析里, animal
可以直接被处理为 Cat
。
同理,在 K2 之前,provider 是无法被 IDEA 判断为非空,会有类似:Reference has a nullable type '(() -> Unit)?', use explicit '?.invoke()' to make a function-like call instead
的报错。
所以从这两个简单例子也可以看到,K2 模式确实让 Kotlin 得到了不少提升,那么,你做好迎接 K2 时代了吗?
参考资料
-
https://blog.jetbrains.com/idea/2024/11/k2-mode-becomes-stable/
-
https://kotlin.github.io/analysis-api/migrating-from-k1.html
-
https://kotlinlang.org/docs/k2-compiler-migration-guide.html