引言
本文对 KMP 做了详细介绍,包含它的基础能力以及编译过程。并从开发者最关注的性能、灵活性、生态、可靠性几个角度,简述了 KMP 的优势。包含了多个大厂的实战案例,和 Kotlin,KMP 的发展历史,以佐证其可靠性。阅读此文你将全方位了解 KMP 技术。
一、跨平台开发背景
💡 跨平台趋势
当前软件领域有个明显的趋势:跨平台开发逐渐成为构建应用的首选方案。随着设备多样性提高,开发者不仅要适配 Android、iOS、Windows 等主流系统,还要适配 HarmonyOS 等新兴操作系统,这直接导致了开发复杂性的多倍增长。
💡 多平台开发痛点
在这样的环境下,传统解决方案需要让开发者为每个平台单独编写大量重复代码,代码复用程度很低。并且不同平台的应用很容易出现体验不一致的问题。
💡 逻辑复用的缺失
在移动开发领域,UI 层的跨平台解决方案已经相对成熟。像 Flutter 和 ReactNative 这样的框架,主要解决了跨平台 UI 开发与界面渲染统一性的问题。但是,目前跨平台方案对业务逻辑的复用支持仍显不足,而KMP就是处理业务逻辑跨平台的技术。
二、KMP 介绍
2.1 核心能力
💡 什么是 KMP
Kotlin Multiplatform(简称 KMP)是 JetBrains 推出的开源跨平台开发框架。
它可以通过共享 Kotlin 编写的业务逻辑代码实现多平台复用。
💡 支持平台
从应用场景来看,KMP 不仅局限于移动端,它支持 iOS、Android、Web、桌面端(Windows/macOS/Linux)以及服务器端的代码共享。这种扩展性使得开发者能够用同一套代码库构建全平台应用,大幅提升开发效率。
2.2 编译目标
💡 三大编译目标
KMP 有三大编译目标,分别是: Kotlin/JVM、Kotlin/Native、Kotlin/JS。通过编译不同的目标文件实现各端的跨平台能力。除此之外,KMP 还实验性地支持 WebAssembly(Kotlin/Wasm)编译目标,不过目前实际应用场景相对较少。
💡 KMP 编译器
我们知道,一个语言的编译需要经过词法分析和语法分析,解析成抽象语法树 AST。
而 KMP 为了将 Kotlin 源代码编译成不同的目标平台代码,就需要将 Kotlin 的编译产物进一步向不同的平台转化。
Kotlin 语言的编译,与向不同的平台转化,明显是不同的职责,需要解耦,所以 KMP 的编译器必然有两个部分,也就是编译器前端(Frontend)与编译器后端(Backend)。
Frontend 会将 AST 进一步转换为 Kotlin IR(Kotlin Intermediate Representation),是 Kotlin 源代码的中间表示形式,Kotlin IR 是编译器前端的输出,也是编译器后端的输入。
Backend 则会吧 Kotlin IR 转换为不同平台的中间表示形式,最终生成目标代码。
💡 编译产物
- Kotlin/Native
服务于代码最终编译为原生机器码,无虚拟机的场景,如 iOS 移动端和 Windows/macOS/Linux 等桌面端。
Kotlin/Native 首先会把 Kotlin 代码编译为 LLVM IR,LLVM IR 全称是:Low Level Virtual Machine Intermediate
Representation ,是一种与平台无关的统一的中间表示, 是高级语言与机器码之间的桥梁。
同一份 LLVM IR 可编译为 x86、ARM、RISC-V 等不同架构的机器码,进一步实现在不同架构的机器间跨平台。
- Kotlin/JVM:
主要服务于 Android 与服务器端。
Kotlin/JVM 会把 Kotlin IR 转换成 JVM IR,最终生成 JVM 字节码,之后会随着应用打包到 DEX 内。服务端则会编译成 JAR 包,在项目中依赖使用。
由于 Android 系统内置的 ART/Dalvik 虚拟机本质上是 JVM 的衍生实现,后端服务通常也运行在传统 JVM 环境中,所以 Kotlin/JVM 可以同时支撑移 Android 和服务端业务逻辑。
- JS 目标:Kotlin/JS
服务于 Web 开发场景。
Kotlin/JS 将 Kotlin IR 转换成 JS IR,最终生成 .js 文件,在 JS 工程中引用后即可调。
- Wasm 目标:Kotlin/Wasm
服务于 WebAssembly 的开发场景
WebAssembly 是一种可以运行在现代 web 浏览器中的新型代码,可以将 C/C++等型语言编译成紧凑的二进制格式,通过该的二进制格式和硬件优化,执行速度可达原生代码的 80% 以上。
该方案将将 Kotlin 代码编译为 WebAssembly 字节码,运行于支持 Wasm 的浏览器环境。
三、优势
3.1 性能
上面我们提到,KMP 采用将 Kotlin 代码编译为各平台原生二进制文件的方式,这种方式使得最终产出的应用性能接近原生开发水平。对比其他跨平台语言,其优势主要体现在两个方面:
- 无 Bridge:
KMP 不像早期的 React Native 一样,与原生通讯需要依赖 JavaScript Bridge 机制,JS ↔ Native 的序列化/反序列化过程有着显著的通信延迟。
- 无额外运行环境:
Flutter 需要捆绑渲染引擎和 Dart VM,会导致应用包体积膨胀和初始化耗时增加。独立引擎运行时也会占用更多内存。而 KMP 生成的代码直接依赖目标平台的原生运行时,不存在上述问题。
此外,Kotlin 还支持支持协程,非阻塞式挂起机制可以充分利用 CPU 资源。
3.2 灵活性
💡 自定义范围
我们可以启动一个全新的项目,将数据层和业务层全部使用 KMP 来编写,或者自由选择应用 KMP 应用范围。
也可以在已有项目中选择某段逻辑使其跨平台,将其作为微库连接到现有项目中。
使用 KMP 非常灵活,可以将其理解为仅是一个集成到主项目中的共享 SDK,由你决定 SDK 的内容。
💡 UI 跨平台搭配
可以仅使用 KMP 实现业务逻辑层的跨平台复用。
也可以与现有 Flutter、React Native、Compose Multiplatform 等技术的结合,实现"业务逻辑层+平台 UI 层"的全面跨平台,使整体代码复用率大幅提升。
💡 平台差异处理
当遇到平台特性差异时,比如某个功能在 Android 端需用特定 API 实现,而 iOS 需调用原生框架,KMP 提供了优雅的解决方案:通过 expect/actual 机制声明统一接口与平台实现。
3.3 生态
KMP 提供了丰富的标准库支持,包括跨平台的并发编程模型、网络通信库等超过 1500 个活跃库的生态。
下图为官方给出的支持 KMP 的库数量:
这些库可以覆盖大多数的开发场景,下面来介绍几个经典的库:
- Ktor:KMP 生态中主流的网络请求框架,支持多平台 HTTP 通信。开发者可编写统一的 API 调用逻辑,并在不同平台复用,同时兼容原生网络库。它支持 HTTP、WebSocket 等协议,基于 Kotlin 协程实现异步非阻塞通信。
- SQLDelight:JetBrains 推荐的跨平台数据库框架,通过生成类型安全的 Kotlin 代码,实现 SQLite 等数据库操作的共享。支持 Android Room、iOS CoreData 等平台原生存储引擎的无缝集成
- Koin:轻量级依赖注入框架,适用于 KMP 项目。通过模块化定义依赖关系,简化跨平台业务逻辑的依赖管理,减少平台适配代码
- Kotlinx.serialization:官方序列化库,支持 JSON、Protobuf 等格式,兼容 KMP。
- Reaktive:响应式编程库,类似 RxJS/RxJava,支持 KMP。
官方提供了 Kotlin 包检索网站,可搜索支持 KMP 的库和版本
并且 Google 也在逐渐将 Android Jetpack 也在逐步适配 KMP,支持多平台共享。
可以在 Android 开发者平台 查看支持 KMP 的 Jetpack 组件
3.4 可靠性
💡 强大后台
KMP 由 JetBrains 主导开发,Google 也是重要的合作方,不仅作为核心合作方深度参与技术演进,Android 生态支持,更是将 KMP 确定为长期技术投资方向。
💡 稳定等级
- 2023年11月,随着kotlin 1.9.2 发布,KMP 进入稳定阶段
- KMP 在最常用的 Android、iOS、桌面端、Web JS 的场景已达到 Stable 等级
- 2024年5月,kotlin2.0 发布,kmp 使用的 Kotlin2 编译器(K2 编译器)也进入了 Stable 等级,并且经过大量真实项目的检验
💡 大厂使用情况
根据官方透露,国内外多家企业已成功采用 KMP 实施不同代码共享策略,验证了其实践价值。
- 百度
Wonder App 是百度于 2021 年 12 月 15 日 推出的泛信息服务平台,专为年轻用户群体设计,主打“一站式满足学习、生活与娱乐需求
2021 年 11 月,百度使用 KMP 在 Wonder APP 中开发并推出了第一个功能——“冲浪”频道。
目前,Wonder App 使用 KMP 技术统一了多个模块的业务逻辑,覆盖了多个核心业务场景,同时保留了原生 UI 的出色用户体验。
该开发团队说: KMP 技术的集成真正统一了 iOS 和 Android 开发的业务逻辑,降低了代码检查和维护成本,并显著提高了生产力。
- 美团
美团餐饮系统有 6 个不同的 App,包含美团收银、点餐助手、平板点餐。其共有模块逻辑层基本一致。
美团餐饮系统使用 KMP 在 Android、iOS、windows 平台共享业务逻辑,减少了重复开发成本。
- 快手
快手的快影 APP 存在明显跨平台差异问题,最典型的表现是:使用 Android 客户端创建的模板文件,在 iOS 设备上完全无法正常使用。
于是快影中使用了 KMP,解决了由于 iOS 和 Android 平台的核心数据结构和业务逻辑存在差异,导致的用户在修改视频模板时的体验问题。
快手 APP 借鉴快影的落地经验,使 KMP 编译器适配了鸿蒙端。
使用 KMP 覆盖了 70% 鸿蒙业务,迁移代码占鸿蒙总代码 40%+,整体提效 30%+。
KMP 本身不支持鸿蒙端,这里快手对 KMP 编译器做了适配,支持了鸿蒙业务。
💡 发展历史
从 2010 至今,KMP 的发展历史可以分为四个阶段,分别是起源阶段、多平台扩张阶段、优化稳定阶段和成熟阶段,下面我整理了一些 KMP 在启动开发以来,每个阶段的一些里程碑性质的事件
起源阶段(2010-2016)
- 2010-启动开发: Kotlin 由 JetBrains 团队于 2010 年启动开发,目标是解决 Java 开发中的痛点:
语法冗长:Java 代码量过大,维护成本高
空指针问题:Java 缺乏空安全机制,导致高频崩溃
现代化特性缺失:函数式编程、扩展方法等现代语言特性缺失
- 2011-项目公开:JetBrains 公开 Kotlin 项目,定位为 JVM 语言的现代化替代,兼容 Java 生态
- 2012-开源:Kotlin 开源,并在 M2 版本首次实验性支持 JavaScript 编译(非核心目标)
- 2016-1.0 发布:发布 Kotlin 1.0 稳定版。主打 100%兼容 Java,迅速成为 Android 开发的热门语言
可以看到,kotlin 的起源还是比较早的,主要用于化替 JVM 语言,一经发布就成为了 Android 开发的热门语言。
多平台扩张阶段(2017-2019)
- 2017.05-Android 普及:Google 在 I/O 大会上宣布 Kotlin 为 Android 一级开发语言,推动其普及
- 2017.11-KMP 诞生:Kotlin 1.2 发布,首次引入 KMP 功能,支持 JVM、JS。Kotlin/JS 由于工具链不完善导致早期反响有限
- 2018.10-1.3 发布,首次携带了 Kotlin/Native Beta 版本,可将 Kotlin 代码直接编译为原生二进制文件
- 2019.12-KMP 独立:在 KotlinConf 大会上,KMP 正式成为独立技术方向,成为核心战略,目标是通过代码共享减少多平台重复开发
这个阶段 Kotlin 逐渐站稳了在 Android 开发中的地位,并逐渐扩张其跨平台能力,确立了 KMP 跨平台的核心战略。
优化稳定阶段(2020-2023)
- 2020.08-1.4 发布:对 KMP 进一步优化,并且优化了开发流程,构建工具链。
- 2020.09-KMM 推出:推出 Kotlin Multiplatform Mobile(KMM)子项目,聚焦 Android 与 iOS 平台共享业务逻辑,发布 Alpha 版本及 Android Studio 插件
- 2021.05-1.5 发布:优化了 KMP 编译器,提高了编译速度
- 2022.06-1.7 发布:支持了 K2 编译器的 Alpha 版本,为 JVM、JS 和 Native 平台提高了编译速度
- 2022.10:KMM 进入 Beta 阶段
- 2023.04-1.8.2 发布:新增实验性的 Kotlin/Wasm 目标
- 2023.07-1.9 发布:K2 编译器现已进入 Beta 阶段。并继续优化 KMP。
- 2023.08-KMM 废弃:弃用 KMM 名称,统一为 KMP,解决命名混乱问题,明确其覆盖全平台的定位。
- 2023.11-1.9.2 发布:KMP 进入 Stable 阶段
- 2023.12:Kotlin/Wasm 进入 Alpha 阶段
可以看到,这个阶段 JetBrains 逐渐在优化 KMP,提升性能,并推出了稳定版的 KMP。
成熟阶段(2024 至今)
- 2024.05:Google 宣布将 KMP 作为长期投资项目,推动 Jetpack 库对 KMP 的支持。
- 2024.05-2.0 发布:包含 K2 编译器 Stable 版本,编译速度提高了两倍。Kotlin 也已成为 Android 开发的主要语言,排名前 1000 的 Android 应用中有 95% 包含 Kotlin 代码。
- 2024.11-2.1 发布:Kotlin/Native 改进了对 iosArm64 的支持以及其他更新。Kotlin/Wasm:多项更新,包括对增量编译的支持。
- 2025.03-2.1.2 发布:Kotlin/Native 优化了运行时性能。
此时,KMP 已经相对完善,经历了市场的检验,拥有着较为完善的生态,并且还在稳步优化中。
四、总结
最后再来总结一下 KMP 的优势:
跨平台技术可以降低多平台应用的开发成本和维护负担,已经成为软件开发行业的明显趋势。
在这样的大环境下,KMP 又契合 Android 的 Kotlin 优先策略, 极大降低了 Android 开发者的学习成本,使得其在安卓端的落地如顺水推舟。
可贵的是,KMP 将代码编译为平台原生格式,使它的运行性能接近原生开发,使用其跨平台开发不用担心牺牲性能。
除了技术优势,KMP 由知名 IDE 厂商 JetBrains 主导开发,并获得了 Google 的深度支持,拥有强大的技术后盾。
并且国内外多家企业使用了 KMP 实施了跨平台方案,有效验证了 KMP 的工程可靠性。
从 2010 年至今,KMP 已经经过了 10 多年的迭代。可以看到,kotlin 的每个大版本,都在不断地对 KMP 进行优化。随着时间的推移,KMP 逐渐稳定,编译性能逐渐优化,社区也在不断的完善,已经成为了一个成熟的技术。
个人认为,KMP 是站在巨人肩膀上的跨平台技术,是基于跨平台的跨平台技术。
- LLVM 为不同架构(x86、ARM)生成机器码,解决了硬件差异;
- JVM 让 Java 代码跨平台运行,同时提供高级语言特性、内存管理和沙箱安全机制;
- JavaScript 引擎 通过浏览器实现跨端,并有着不错的态性和灵活性。
这些技术各自针对特定领域完成了历史使命,而 KMP 并未摒弃它们的价值,没有重复“造轮子”,而是通过复用现有能力实现多平台适配。
因此,KMP 更像是一种“跨平台整合” —— 它既继承了原有跨平台技术的优势,又通过 Kotlin 精炼的语法提高了开发效率,最终在现有机制上实现了更高层级的跨平台抽象。