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

参考资料

相关推荐
炼金术1 小时前
SkyPlayer v1.1.0 - 在线视频播放功能更新
android·ffmpeg
用户276038157811 小时前
鲲鹏+昇腾:开启 AI for Science 新范式——基于PINN的流体仿真加速实践
android
此去正年少2 小时前
编写adb脚本工具对Android设备上的闪退问题进行监控分析
android·adb·logcat·ndk·日志监控
落羽凉笙2 小时前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python
十幺卜入3 小时前
Unity3d C# 基于安卓真机调试日志抓取拓展包(Android Logcat)
android·c#·unity 安卓调试·unity 安卓模拟·unity排查问题
frontend_frank3 小时前
脱离 Electron autoUpdater:uni-app跨端更新:Windows+Android统一实现方案
android·前端·javascript·electron·uni-app
薛晓刚3 小时前
MySQL的replace使用分析
android·adb
DengDongQi3 小时前
Jetpack Compose 滚轮选择器
android
stevenzqzq3 小时前
Android Studio Logcat 基础认知
android·ide·android studio·日志
代码不停4 小时前
MySQL事务
android·数据库·mysql