2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Workspace 投资并提供技术支持。
当然,Kotlin Multiplatform 和 Compose Multiplatform 虽然都是 JetBrains 维护的项目,它们经常被一起提及,但是他们其实是两个项目 :
- Kotlin Multiplatform:提供了 Kotlin 的跨平台
- Compose Multiplatform:Compose UI 的跨平台框架,提供 UI 跨平台能力
用 JB 官方的话说就是:借助 Compose Multiplatform,开发者可以将 Kotlin Multiplatform 的代码共享能力推向应用逻辑之外。
而在 2024 年 Google 和 JetBrains/Kotlin 为许多 Jetpack 库添加了 Kotlin 多平台支持, 例如:
- Ktor 通过处理 REST 服务消耗来简化网络任务
- kotlinx.serialization 将数据转换为 JSON 等格式
- Okio 管理基本的文件 I/O
- SKIE 适配了类型和协程在 iOS 上的使用
- CocoaPods 集成支持使用 iOS 特定的依赖项
- Room 从版本 2.7.0-alpha01 开始 支持 Android、PC和 iOS
- Datastore 从版本 1.1.0 开始添加 KMP 支持
- Lifecycle 和 ViewModel 从 2.8.7 开始支持 Android、PC 和 iOS
- ····
回到 KMP 的迭代更新上,在今年年初,Kotlin/Wasm 发布 Alpha 版,支持将 Kotlin 代码编译为 WebAssembly, 同步 Compose Multiplatform也开始支持 Kotlin/Wasm
另外 Compose Multiplatform 在 2024 具有典型意义的更新有:
-
从 Compose Multiplatform 1.6.10 开始:
-
iOS 进入 Beta 阶段,适用于 ProMotion 120 Hz,增加原生风格控件适配
-
Web Alpha
-
Compose 编译器已合并到 Kotlin 代码库中,从而让项目支持 Kotlin 2.0 的迁移
-
-
从 1.7.0 开始:
-
iOS 相关性能优化,触摸交互优化等:
-
桌面支持
dragAndDropSource
和dragAndDropTarget
的拖放功能:
-
另外一个重大更新就是 Kotlin 2.0 系列发布,引入了 K2 编译器,统一了 Kotlin 支持的所有平台,所有编译器后端现在都共享大量逻辑和统一的管道,例如开发 KMP 库分发的下一代格式,让 KMP 库的开发和 JVM 库开发一样简单。
还有随着 IntelliJ IDEA 2024.3 版本开始,K2 模式正式脱离 Beta 阶段,开始进入稳定版本阶段,K2 模式显著提高了 Kotlin 代码分析的稳定性、内存的消耗效率和 IDE 的整体性能,并支持 Kotlin 2.1 语言功能等。
K2 模式代表 IDE 中对 Kotlin 支持的几乎完全重写。
K2 模式下除了编译性能的巨大提升之外,在 Kotlin 代码分析、补全和导航速度方面也取得了巨大进步:
其实这些年随着 Kotlin 的发展,其本身的性能表现已经相当不错,例如在 bddicken/languages 的语言基准测试比较的图形化展示上看,Kotlin 的整体性能表现就挺不错:
还有一个有意思的更新在于,Kotlin Multiplatform 未来将采用基于 JetBrains Fleet 定制的独立 IDE ,而在官方调整过的 Kotlin Multiplatform Roadmap 优先关键事项里,可以看到其中就包含了「独立的 Kotlin Multiplatform IDE,专为多平台开发量身定制的开发环境」的相关内容:
其实在此之前, Kotlin Multiplatform 官方就开始推荐使用 JetBrains Fleet 作为开发工具,而这次是更激进的采用基于 JetBrains Fleet 的独立 Kotlin Multiplatform IDE 的计划,其核心在于:
- Fleet 里可以在 Kotlin 代码直接跳转到对应的 Swift 代码:
- Fleet 里 rename 操作可以自动同时关联 Swift 和 Kotlin :
- 在 Fleet 里 debug 断点可以同时作用 Swift 和 Kotlin :
最后就是 klibs.io 平台发布,Klibs.io 作为 KMP Package 的 Web 服务,支持查找选定平台(JVM、Android JVM、Wasm、JS、Kotlin/Native)的特定用途的 Kotlin 多平台库,而网站的数据为来自 GitHub 和 Maven Central 的数据编制索引,并使用 AI 生成的元数据来增强搜索结果,它的目的是通过提供 KMP 相关信息来更轻松地评估库:
满足条件的情况下 klibs.io 平台自动爬出统计
当然,既然是跨平台,肯定少不了 2024 主角之一的鸿蒙, 在 2024 Kotlin 中文开发者大会里,许多大厂都分享了 KMP 适配鸿蒙的事件,而这在过去一段时间已经引起了官方的注意,Kotlin 编译组的 lead 表示,他们也在研究如何在 KMP 中支持 Harmony0S:
目前群组的讨论大概分成两部分:
- 一方提议可以通过重新使用 Kotlin/JS 编译器,直接生成 ArkTS (而不是JS),这样做可以重新使用 Kotlin/JS 生态系统中已经拥有的 TypeScript 互操作性,另一个好处是将重新使用 HarmonyOS 工具链的所有其他部分,而通过 Kotlin/Native 会有两个运行时和两个独立的垃圾回收器,维护成本更高,同时也有大佬表示,在他们 Top 级别应用下 Kotlin/JS 转换下的性能还不错。
- 而另一方则认为 Kotlin/JS 整体性能较差,国内 Top 企业在鸿蒙适配中,经常使用 C API 而不是 TS API ,因为它可以带来更好的性能,这也是为什么 Kotlin/Native 在适配中被更多 Top 企业作为最终方案的理由,所以明显 Compose + Kotlin/Native 的路线更合适,比如 ArkTS(release) 和 Kotlin/Native(release) 之间 n 体问题的性能测试下,Kotlin/Native 性能甚至可以比 ArkTS 快 10 倍。
当然最终 KMP 官方是否会确认支持,或者说才去 Kotlin/JS 还是 Kotlin/Native 方案,具体还要等 2025 的最终讨论结果。
最后,到 2025 年,JetBrains 将专注于增强 Kotlin Multiplatform 生态系统,包括将 Compose Multiplatform for iOS 升级到稳定版、Kotlin-to-Swift 导出支持和前面提到的一体化 KMP IDE 的公开版本等。
希望 2025 年 KMP 和 Compose 能正式全平台落地,感谢这个百花齐放的时代~