IntelliJ IDEA 2024.3 K2 模式已发布稳定版,Android Studio Meerkat 预览也正式支持

关于 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-AndroidExposed 这两个开源项目进行了性能测试,可以看到:

  • 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 代码分析、补全和导航速度方面取得了巨大进步,例如下面是官方通过一些闭源和开源项目做的基准测试结果:

上述图片里的结果是越低越好,可以看到,不管是代码分析,提示高亮或者搜索,K2 模式都是"遥遥领先" K1 ,

当然,对于某些 Kotlin 第三方插件而言,在 K2 模式下可能会因为 API 变更等原因需要做一些适配调整,例如在此之前,分析 Kotlin 代码的唯一实用方法是使用 Kotlin 编译器的内部结构,这是一种不安全的 API,不是为了外部使用而设计,而 K2 现在可以通过迁移适配,使用 Analysis API 所提的更简洁的支持:

  • 旧的编译器 API
kotlin 复制代码
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 false

    return descriptor.annotations.hasAnnotation(SPECIAL_ANNOTATION_NAME)
}
  • 新 Analysis API
kotlin 复制代码
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 时代了吗

参考资料

相关推荐
鸿蒙布道师4 小时前
鸿蒙NEXT开发Base64工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
jiet_h4 小时前
Android adb 的功能和用法
android·adb
美狐美颜sdk5 小时前
美颜SDK兼容性挑战:如何让美颜滤镜API适配iOS与安卓?
android·深度学习·ios·美颜sdk·第三方美颜sdk·视频美颜sdk
居然是阿宋5 小时前
深入理解 YUV 颜色空间:从原理到 Android 视频渲染
android·音视频
KevinWang_6 小时前
DialogFragment 不适合复用
android
古鸽100867 小时前
Audio Hal 介绍
android
小叶不焦虑8 小时前
关于 Android 系统回收站的实现
android
木西8 小时前
从0到1搭建一个RN应用从开发测试到上架全流程
android·前端·react native
小橙子20778 小时前
一条命令配置移动端(Android / iOS)自动化环境
android·ios·自动化
和煦的春风9 小时前
案例分析 | SurfaceFlinger Binder RT 被降级到CFS
android