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

embedded/2024/11/24 2:14:07/

关于 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


http://www.ppmy.cn/embedded/139258.html

相关文章

bpmn.js显示流程图

目标&#xff1a;vue2 接口返回xml - 弹窗显示流程图 - 根据需求高亮节点 一、安装依赖 npm i bpmn-js 添加上的版本是 "bpmn-js": "^11.5.0" 二、只读显示流程图 <div ref"canvas" style"width:100%;height: calc(100vh…

VueDPlayer视频插件的使用

VueDPlayer 是一个基于 DPlayer 的 Vue 封装组件&#xff0c;DPlayer 是一个 HTML5 视频播放器&#xff0c;支持弹幕、视频倍速播放、视频预加载等功能。 以下是如何在 Vue.js 项目中使用 VueDPlayer 的步骤&#xff1a; 1.安装 VueDPlayer&#xff1a; 使用 npm 或 yarn 安装…

第九章:TDengine 如何修改root默认密码

TDengine 如何修改root默认密码 目标 掌握TDengine 中root默认密码的修改docker容器启动指定的密码是无效的TDengine docker启动密码 taosdataTDengine 是一个高性能的时间序列数据库,常用于物联网 (IoT) 和其他数据密集型应用。如果您正在使用 Docker 部署 TDengine 并希望修…

.NET 9 运行时中的新增功能

本文介绍了适用于 .NET 9 的 .NET 运行时中的新功能和性能改进。 文章目录 一、支持修剪的功能开关的属性模型二、UnsafeAccessorAttribute 支持泛型参数三、垃圾回收四、控制流实施技术.NET 安装搜索行为性能改进循环优化感应变量加宽Arm64 上的索引后寻址强度降低循环计数器可…

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…

除了电商平台,还有哪些网站适合进行数据爬取?

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;而网络爬虫技术成为获取数据的重要手段。除了电商平台&#xff0c;还有许多其他类型的网站适合进行数据爬取&#xff0c;以支持市场研究、数据分析、内容聚合等多种应用场景。本文将探讨除了电商平台外&#xff0c;还有…

self-host a private Docker registry

You can create a private Docker registry to serve as your own “Docker Hub” for internal use, which can be cost-effective and give you full control over your images. Setting up a self-hosted Docker registry is straightforward and can be hosted on your own…

CentOS 升级 gcc 版本

CentOS 升级 gcc 版本 1. 安装步骤 CentOS7 默认的 gcc 版本是4.8&#xff0c;有时候需要更高版本&#xff0c;这里介绍一下如何将 gcc 版本升级到 8.3.1 安装 centos-release-scl yum install centos-release-scl安装devtoolset&#xff0c;注意&#xff0c;如果想安装 9.* …