IntelliJ IDEA 2025.1 發布 ,默認 K2 模式 | Android Studio 也將跟進

2025.1 版本已經發布,在此之前我們就聊過該版本的 《Terminal 又發布全新重構版本》,而現在 2025.1 中的 K2 模式也成為了默認選項。

可以預見,這個版本可能會包含不少大坑,為下個 Android Studio 祈禱。

首先有一點可以確定,隨著 K2 模式成為默認選項,雖然 K1模式仍可使用,但后續 K1 將不再支持新語言特性和 IDE 優化,所以在 2025.1 里,你依然可以在 Language & FRameworks > Kotlin 里關閉 K2 模式,但是只能說「逃得了一時是一時」:

“K2” 對應的是 Kotlin 插件包含用于代碼分析的 K2 Kotlin 編譯器的內部版本,而 K1 模式使用 K1 編譯器,IntelliJ IDEA 中內置的 Kotlin 編譯器版本完全獨立于項目構建文件中指定的版本,但它可能會影響項目中支持的 Kotlin 版本范圍。

在之前的《K2 模式已發布穩定版》我們提到過,IntelliJ IDEA 的 K2 模式并不依賴于項目構建設置中指定的 Kotlin 編譯器版本,K2 模式代表 IDE 中對 Kotlin 編輯場景支持的幾乎完全重寫,而使用 K2 編譯器可以帶來:

  • 高達 94% 的編譯速度提升
  • 在初始化階段的速度提高了 488%
  • 與之前的編譯器相比,Kotlin K2 編譯器在分析階段的速度提高了 376%
  • ····

所以基于 K2 編譯器能力的 K2 模式,在 Kotlin 代碼分析、補全和導航速度方面取得了巨大進步,這體現在全新 IDE 下就是:

  • 提高代碼分析的性能(如高亮、補全速度)
  • 更快的查找和跳轉
  • 支持 Kotlin 2.0 及以上版本的新語言特性

而 IDE 一直以來都深度依賴 K1 ,所以其實在遷移到 K2 的過程中,會有大量的重寫和功能重構,這也是 K2 到現在還一直需要打磨的原因。

而在 K1 到 K2 的變化里,其中最大的就是全新的 Kotlin Analysis API ,它提供了一種清晰穩定的方式來訪問代碼信息,并且不需要依賴編譯器內部結構

Kotlin Analysis API 在 K2 模式里采用模塊化架構,支持 IDE 功能(如補全、檢查)獨立調用編譯器的特定分析階段(如解析或類型檢查),避免不必要的全量分析,從而提升性能。

K2 編譯器放棄了 K1 中隱式的 laziness,轉而采用顯式的分階段代碼分析架構, K2 編譯器會分階段分析代碼(如 SUPER_TYPES 計算類的 supertypes ,TYPES 處理函數 signature types),每個階段逐步為抽象語法樹(AST)添加語義信息。

另外,在 K1 模式里 Kotlin Analysis API 的分析操作通常受限于單一的全局解析鎖(global resolution lock),例如 Find Usages 等功能會持有全局鎖,導致其他功能(如代碼高亮、補全)無法并行執行,造成性能瓶頸。

而 K2 編譯器的解析邏輯是并發容忍(concurrency-tolerant),Kotlin Analysis API 利用這一特性,消除了全局鎖,API 現在支持同時分析多個聲明(declarations),即使在復雜場景(如兩個函數相互調用)中也能高效處理:

image-20250417140125624

雖然 K2 編譯器目前還是使用單線程分析(因為多模塊并行編譯已利用多核),但是目前的并發容忍設計為未來的多線程分析奠定了基礎,后續 Kotlin Analysis API 可無縫適配。

而在插件遷移適配上,Kotlin Analysis API 也起到了很大作用,它封裝了所有復雜的解析邏輯,并提供具有清晰且可預測行為的記錄抽象,開發者只需請求他需要的語義代碼信息片段,API 會處理所有延遲和并行分析并緩存結果。

例如要獲取表達式類型,開發者只需調用庫提供的 KtExpression.expressionType 擴展屬性 ,如果類型尚不清楚,則將自動分析包含聲明的 body :

fun KtExpression.hasStringType(): Boolean {analyze(this) {return expressionType == builtinTypes.string}
}

而事實上,不管你的項目是不是 K2 ,都可以享受到新 IDE 在 K2 模式下帶來的性能提升,而如果你開發或使用的是插件,那么可能會需要將部分依賴舊的 Kotlin 插件進行遷移,例如:

  • 舊的編譯器 API
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}
}

另外,就像前面說的,關于一些新特性,比如 Kotlin 2.1 的新支持就會僅限于 K2 模式的 IDE,例如:

  • Non-local 的 break/continue :
fun processList(elements: List<Int>): Boolean {for (element in elements) {val variable = element.nullableMethod() ?: run {log.warning("Element is null or invalid, continuing...")continue // 在早期不能在 forEach 的 lambda 中直接使用 continue}if (variable == 0) return true // If variable is zero, return true}return false
}
  • 在 when 里使用 guard condition:
sealed interface Animal {data class Cat(val mouseHunter: Boolean) : Animal {fun feedCat() {}}data class Dog(val breed: String) : Animal {fun feedDog() {}}
}fun feedAnimal(animal: Animal) {when (animal) {// Branch with only the primary condition. Returns `feedDog()` when `Animal` is `Dog`is Animal.Dog -> animal.feedDog()// Branch with both primary and guard conditions. Returns `feedCat()` when `Animal` is `Cat` and is not `mouseHunter`is Animal.Cat if !animal.mouseHunter -> animal.feedCat()// Returns "Unknown animal" if none of the above conditions matchelse -> println("Unknown animal")}
}
  • 多美元字符串插值,通過初始 $$ 表示需要兩個美元符號 ($$) 來觸發插值,防止 $schema$id$dynamicAnchor 被解釋為插值標記:
val KClass<*>.jsonSchema : Stringget() = $$"""{"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://example.com/product.schema.json","$dynamicAnchor": "meta""title": "$${simpleName ?: qualifiedName ?: "unknown"}","type": "object"}"""

最后,未來即將更新的 Android Studio 也會一樣默認開始 K2 模式,所以作為 Android 開發,對于下一個版本的 AS 更新還需要慎重,因為你也不知道會有什么坑在等著你。

當然,最后還是要強調:

  • K2 編譯器是 Kotlin 語言的新一代編譯器
  • K2 Mode 是 IntelliJ IDEA 的一種運行模式

K2 Mode 是 IDEA 利用 K2 編譯器的前端(解析和語義分析部分)來增強 IDE 的 Kotlin 代碼理解能力,但不直接參與項目的實際編譯,功能范圍僅限于 IDE 的交互體驗。

所以理論上,你項目用 K1,也不影響你體驗 K2 Mode ,但是如果你項目使用 K2,那么強烈建議開始 K2 Mode 來體驗全新的特性。

那么,你已經體驗過 K2 模式了么?

參考資料

  • https://blog.jetbrains.com/idea/2025/04/k2-mode-in-intellij-idea-2025-1-current-state-and-faq/

  • https://blog.jetbrains.com/idea/2025/04/the-story-behind-k2-mode-and-how-it-works/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77519.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云效部署實現Java項目自動化部署圖解

前言 記錄下使用云效部署Java項目&#xff0c;實現java項目一鍵化自動化部署。 云效流程說明&#xff1a; 1.云效拉取最新git代碼后 2.進行maven編譯打包后&#xff0c;上傳到指定服務器目錄 3.通過shell腳本&#xff0c;先kill java項目后&#xff0c;通過java -jar 啟動項…

國際數據加密算法(IDEA)詳解

以下是修正后的準確版本,已解決原文中的術語、符號及技術細節問題: ?國際數據加密算法(IDEA)? IDEA是一種分組加密算法,由Xuejia Lai(來學嘉)和James Massey于1990年設計。IDEA使用128位密鑰對64位明文分組進行加密,經過8輪迭代運算后生成64位密文分組。其安全性基于…

TensorFlow介紹

TensorFlow 是由 Google 開發 的開源機器學習框架&#xff0c;主要用于構建、訓練和部署機器學習模型。它支持深度學習、傳統機器學習和數值計算&#xff0c;適用于圖像識別、自然語言處理&#xff08;NLP&#xff09;、推薦系統、強化學習等多種任務。 核心特性 基于 數據流…

百級Function架構集成DeepSeek實踐:Go語言超大規模AI工具系統設計

一、百級Function系統的核心挑戰 1.1 代碼結構問題 代碼膨脹現象&#xff1a;單個文件超過2000行代碼路由邏輯復雜&#xff1a;巨型switch-case結構維護困難依賴管理失控&#xff1a;跨Function依賴難以追蹤 // 傳統實現方式的問題示例 switch functionName { case "fu…

嵌入式芯片中的 SRAM 內容細講

什么是 RAM&#xff1f; RAM 指的是“隨機存取”&#xff0c;意思是存儲單元都可以在相同的時間內被讀寫&#xff0c;和“順序訪問”&#xff08;如磁帶&#xff09;相對。 RAM 不等于 DRAM&#xff0c;而是一類統稱&#xff0c;包括 SRAM 和 DRAM 兩種主要類型。 靜態隨機存…

標準的JNI (Java Native Interface) 加載函數 JNI_OnLoad

1.JNI_OnLoad 在 Android Native 開發中&#xff0c;JNI_OnLoad 是動態注冊本地方法的標準入口點。以下是一個標準實現示例及其說明&#xff1a; JNI_OnLoad 標準實現 #include <jni.h> #include <string>// 聲明本地方法對應的 C/C 函數 jint native_add(JNIEnv…

算法導論思考題

2-1 在歸并排序中對小數組采用插入排序 c. 假定修改后的算法的最壞情況運行時間為 Θ \Theta Θ(nknlg(n/k))&#xff0c;要使修改后的算法與標準的歸并排序具有相同的運行時間&#xff0c;作為n的一個函數&#xff0c;借助 Θ \Theta Θ記號&#xff0c;k的最大值是什么&#…

JavaScript 性能優化

JavaScript 性能優化是提高 Web 應用性能的關鍵步驟,特別是在處理大量數據、復雜計算或頻繁的 DOM 操作時。以下是一些常見的 JavaScript 性能優化技巧和策略: 文章目錄 @[TOC]一、代碼層面優化1. **減少全局變量**2. **避免使用 `with` 語句**3. **使用局部變量**4. **減少 …

NLP高頻面試題(四十七)——探討Transformer中的注意力機制:MHA、MQA與GQA

MHA、MQA和GQA基本概念與區別 1. 多頭注意力(MHA) 多頭注意力(Multi-Head Attention,MHA)通過多個獨立的注意力頭同時處理信息,每個頭有各自的鍵(Key)、查詢(Query)和值(Value)。這種機制允許模型并行關注不同的子空間上下文信息,捕捉復雜的交互關系。然而,MHA…

51單片機的原理圖和PCB繪制

51單片機最小系統原理圖 加了兩個led燈和按鍵檢測電路。 PCB中原件擺放位置 成品 資源鏈接&#xff1a;https://download.csdn.net/download/qq_61556106/90656365

使用注解方式整合ssm時,啟動tomcat掃描不到resource下面的xxxmapper.xml

解決org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.方法 在Spring與Mybatis整合時&#xff0c;可能會遇到這樣的報錯 原因&#xff1a; 其原因為mapper路徑的映射錯誤&#xff0c;表示在嘗試執行某個 Mapper 接口的方法時…

提示詞設計:動態提示詞 標準提示詞

提示詞設計:動態提示詞 標準提示詞 研究背景:隨著人工智能與司法結合的推進以及裁判文書公開數量增多,司法摘要任務愈發重要。傳統司法摘要方法生成質量有待提升,大語言模型雖有優勢,但處理裁判文書時存在摘要結構信息缺失、與原文不一致等問題。研究方法 DPCM方法:分為大…

Jenkins 多分支管道

如果您正在尋找一個基于拉取請求或分支的自動化 Jenkins 持續集成和交付 (CI/CD) 流水線&#xff0c;本指南將幫助您全面了解如何使用 Jenkins 多分支流水線實現它。 Jenkins 的多分支流水線是設計 CI/CD 工作流的最佳方式之一&#xff0c;因為它完全基于 git&#xff08;源代…

跨境電商管理轉型:日事清通過目標管理、流程自動化助力智優美科技項目管理升級與目標落地復盤

1.客戶背景介紹 深圳市智優美科技有限公司是一家專業從事外貿B2C的電子商務公司&#xff0c;公司總部位于深圳市寶安區&#xff0c;旗下擁有三家子公司。目前銷售的品類有&#xff1a;家居用品、電子產品、電子配件產品等&#xff0c;在深圳外貿電商行業銷售額穩居行業前10名。…

基于Docker+k8s集群的web應用部署與監控

項目架構圖 server ip master 192.168.140.130 node1 192.168.140.131 node2 192.168.140.132 ansible 192.168.140.166 jumpserver 192.168.100.133 firewall 192.168.1.86 nfs 192.168.140.157 harbor 192.168.140.159 Promethethus 192.168.140.130 Jen…

量子計算與經典計算融合:開啟計算新時代

一、引言 隨著科技的飛速發展&#xff0c;計算技術正迎來一場前所未有的變革。量子計算作為前沿技術&#xff0c;以其強大的并行計算能力和對復雜問題的高效處理能力&#xff0c;吸引了全球科技界的關注。然而&#xff0c;量子計算并非要完全取代經典計算&#xff0c;而是與經典…

【HarmonyOS 5】makeObserved接口詳解

【HarmonyOS 5】makeObserved接口詳解 一、makeObserved接口是什么&#xff1f; makeObserved 接口&#xff08;API version 12 起可用&#xff09;用于將非觀察數據轉為可觀察數據&#xff0c;適用于三方包類、Sendable 裝飾的類、JSON.parse 返回的對象、collections.Array…

豆瓣圖書數據采集與可視化分析(二)- 豆瓣圖書數據清洗與處理

文章目錄 前言一、查看數據基本信息二、拆分pub列三、日期列處理四、價格列處理五、出版社列處理六、評價人數列處理七、缺失值處理八、重復數據處理九、異常值處理十、完整代碼十一、清洗與處理后的數據集展示 前言 豆瓣作為國內知名的文化社區&#xff0c;擁有龐大且豐富的圖…

Wasm -WebAssembly簡介

WebAssembly 是什么&#xff1f; WebAssembly/wasm WebAssembly 或者 wasm 是一個可移植、體積小、加載快并且兼容 Web 的全新格式 WebAssembly&#xff08;簡稱 Wasm&#xff09;是一種二進制指令格式&#xff0c;設計用于在現代 Web 瀏覽器中高效運行程序。它可以被認為是一…

驅動開發硬核特訓 · Day 15:電源管理核心知識與實戰解析

在嵌入式系統中&#xff0c;電源管理&#xff08;Power Management&#xff09;并不是“可選項”&#xff0c;而是實際部署中影響系統穩定性、功耗、安全性的重要一環。今天我們將以 Linux 電源管理框架 為基礎&#xff0c;從理論結構、內核架構&#xff0c;再到典型驅動實戰&a…