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 时代了吗

参考资料

相关推荐
weixin_438150991 分钟前
广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!
android·单片机
CheungChunChiu41 分钟前
Android10 rk3399 以太网接入流程分析
android·framework·以太网·eth·net·netd
木头没有瓜1 小时前
ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
android·java·okhttp
键盘侠0071 小时前
springboot 上传图片 转存成webp
android·spring boot·okhttp
江上清风山间明月2 小时前
flutter bottomSheet 控件详解
android·flutter·底部导航·bottomsheet
Crossoads4 小时前
【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应
android·开发语言·数据库·深度学习·机器学习·计算机外设·汇编语言
sunphp开发者4 小时前
黑客攻击网站,篡改首页问题排查修复
android·js
我又来搬代码了5 小时前
【Android Studio】创建新项目遇到的一些问题
android·ide·android studio
ggs_and_ddu9 小时前
Android--java实现手机亮度控制
android·java·智能手机
zhangphil14 小时前
Android绘图Path基于LinearGradient线性动画渐变,Kotlin(2)
android·kotlin