Kotlin Multiplatform超详细介绍,一篇就够了

3,300 阅读14分钟

引言

本文对 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 代码编译为各平台原生二进制文件的方式,这种方式使得最终产出的应用性能接近原生开发水平。对比其他跨平台语言,其优势主要体现在两个方面:

  1. 无 Bridge:

KMP 不像早期的 React Native 一样,与原生通讯需要依赖 JavaScript Bridge 机制,JS ↔ Native 的序列化/反序列化过程有着显著的通信延迟。

  1. 无额外运行环境:

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 精炼的语法提高了开发效率,最终在现有机制上实现了更高层级的跨平台抽象。