Kotlin Multiplatform 在经历了这么多年迭代后,目前现在已经是一个相对成熟的解决方案了。虽然在内存管理方案还有一些瑕疵,但其『IR 翻译成 Native』设计理念使得整个系统的性能上限很高,理论上能达到接近原生的执行性能。

什么是 KMP
KMP(Kotlin multiplatform)是 Kotlin 语言的一项重要特性,允许将 kotlin 代码运行在不同平台上,通过『一码多端』的方式来节省成本。
而与诸如 Java / React 这类跨端方案不同,KMP 没有采用所谓的虚拟机的思路,而是选择直接将 kotlin 源码编译成目标平台代码运行的方案。

KMP 的优势和限制
KMP 的优势:
相较传统的跨平台框架而言,由于 Kotlin 会将代码编译成目标平台原生代码执行(可以简单理解为将 Kotlin 源码翻译成 java/c++/js 代码),其最大的优势在于进行 FFI(跨语言调用)时几乎没有性能折损,并且执行性能接近于原生系统。
KMP 的限制:
由于早期的 kotlin 是基于 java / android 平台,这些 kotlin 二/三方库在设计时候也不可能考虑过跨平台。考虑到这些情况,kotlin 在编译时使用了 Target Platform 概念,即 kotlin 每个类 / 方法 都是有对应平台的,早期的的 java / android 二三方库只属于 jvm 平台,意味只能在 java / android 平台调用,在其他平台上调用会编译报错。
而对于系统接口,在 KMP 下也是有对应平台限制的,一个简单的判定方法如下:
- 所有 kotlin.*、kotlinx.*包名的接口,都是跨平台的。
- 所有 java.*、sun.* 包名的接口,只能在 jvm 平台使用。
- 所有 android.*包名的接口,只能在 android 平台使用。
- androidx.*比较特殊,部分库可以(比如 Room),部分不行,需要自行查看文档判断。
因此,如果想要将 Android 代码通过 KMP 直接编译成其他平台产物,那基本上是不可能直接成功的。如果没有提前设计隔离层的话,工程中二、三方依赖,以及源码中几乎不可避免的含有 Android / jvm 的平台接口,你很可能需要进行大量的抽象改造才可以完成。
KMP 实现原理
跨平台概述
前面提到,KMP 核心思路,是直接将 kotlin 源码编译成目标平台代码运行。而实现这一能力的关键就是 Kotlin 编译器,其核心职责就是将源码翻译成目标平台代码。

在实现上,kotlin 编译器使用了前后端分离的思路。

简单来说,前端负责语法解析&代码分析、后端负责将前端产物翻译成目标平台代码,二者职责清晰。未来如果如果需要支持一个新平台,添加一个新后端即可。
至于 Optimizer,由于不同目标平台的优化方式不同,在 kotlin 编译器中被放在了后端中。
Kotlin Native 编译器
由于 Kotlin Jvm 大家相对比较熟悉,而 K

最低0.47元/天 解锁文章
177

被折叠的 条评论
为什么被折叠?



