跨端方案的讨论长期被 Flutter 和 React Native 占据,但 2026 年真正值得重新评估的是第三条路:KMP + Compose Multiplatform。它和前两者的根本区别在于不接管 UI 而是共享逻辑。本文讲清它共享了什么、适合什么场景,以及落地前必须想清楚的三件事。
跨端方案的讨论长期被 Flutter 和 React Native 占据,但 2026 年真正值得重新评估的,是第三条路:Kotlin Multiplatform(KMP)+ Compose Multiplatform。
它和前两者的根本区别在于:不接管 UI,而是共享逻辑。这个看似保守的定位,恰恰让它在很多场景下比”全栈跨端”更容易落地。
一、版本坐标
截至 2026 年 9 月:
- Kotlin:
2.4.10为当前正式版(2.4.20 已进入 RC 阶段); - Compose Multiplatform:Gradle 插件
1.12.0为当前正式版; - Android:Android 17(API 37)已于 2026 年 6 月发布;
- iOS:iOS 26.6.1 为当前在跑版本,iOS 27 预计 9 月中旬发布。
Kotlin 版本可在 JetBrains/kotlin 的 Release 页面核对,注意 RC / Beta 版本不要进生产。
二、KMP 到底共享了什么
这是最容易被误解的地方,先讲清楚边界。

共享层:业务逻辑,不是 UI
KMP 的核心思路是:把不依赖平台 API 的部分抽到 commonMain,包括数据模型、网络请求、缓存、业务规则、状态机、校验逻辑。这些代码编译到各平台:JVM 字节码(Android)、原生二进制(iOS)、JS/Wasm(Web)。源集结构一目了然:
shared/
├── src/
│ ├── commonMain/kotlin/ // 平台无关:模型、仓库、业务规则
│ │ └── com/app/core/
│ │ ├── OrderRepository.kt // 期望声明 expect
│ │ └── Pricing.kt // 纯 Kotlin,两端直接复用
│ ├── androidMain/kotlin/ // actual 实现:Room、Android SDK
│ └── iosMain/kotlin/ // actual 实现:NSData、Keychain
└── build.gradle.kts // 目标:androidTarget() + iosArm64()/iosSimulatorArm64()
// commonMain 中声明平台差异点,各端提供 actual 实现
expect fun persistToken(token: String)
UI 部分各平台各写各的——Android 用 Compose,iOS 用 SwiftUI 或 UIKit。这是刻意的取舍:牺牲一部分代码复用率,换取完全原生的观感和平台能力接入。
Compose Multiplatform:可选的 UI 共享
如果你愿意连 UI 一起共享,Compose Multiplatform 允许用同一套 Compose 代码渲染到 Android、iOS、桌面和 Web。但要注意:
- Android 端是原生 Compose,观感和性能没有问题;
- iOS 端走的是自绘,本质上是把 Compose 的渲染树画到 Canvas 上,与 SwiftUI 的观感差异需要设计和测试双重确认;
- 与原生 UI 混排是可行的(在 SwiftUI 里嵌入 Compose 视图,或反过来),这也是很多团队采用的渐进路线。
三、和 Flutter / RN 的真实对比
不比”谁更快”,比的是三条不同的取舍路径:
Flutter:自绘一切
优点是各端观感高度一致、性能上限高;代价是与原生 UI 混排成本高,且任何平台新特性都要等框架适配。适合”全新应用、UI 高度定制、追求多端一致”的场景。
React Native:桥接原生控件
优点是有 Web 团队就能上手、生态庞大;代价是桥接层的性能与调试复杂度,深度原生能力接入时仍要写 Native Module。适合”团队以 JS 为主、应用以常规 UI 为主”的场景。
KMP:共享逻辑,UI 原生
优点是UI 完全原生、与既有原生代码零摩擦、可渐进接入;代价是需要同时具备 Android 和 iOS 两端的 UI 开发能力,代码复用率低于前两者。适合”已有成熟原生应用、想消除逻辑层重复实现”的团队。
四、什么场景最适合 KMP
说实话,KMP 不是”全新小应用”的最优解——那种场景 Flutter 更快。它真正发光的场景是下面三个。
1. 已有成熟原生应用,想收敛逻辑重复
典型的痛点是:同一套业务规则在 Android 和 iOS 各实现一遍,然后bug 也各出一遍,且两边行为微妙不一致。把规则层抽到 KMP,UI 保持原生,是收益最高、风险最低的切法。
2. 需要深度平台能力
如果应用重度依赖相机、蓝牙、后台定位、系统级小组件这类能力,保持原生 UI + 共享逻辑远比”用跨端框架再写一堆桥接”省事。
3. 渐进式改造,不能推倒重来
KMP 可以只引入一个模块——先把网络层或数据层换掉,跑顺了再逐步扩散。这个特性决定了它可以被塞进任何既有工程,不需要”全有或全无”的赌注。
五、落地前必须想清楚的三件事
1. iOS 端的集成与调试体验
KMP 编译产物以 Framework 形式接入 Xcode 工程。调试跨语言栈时体验不如纯原生顺滑,断点跳转、崩溃符号化都需要额外配置。团队里如果没人熟悉 Xcode 工程配置,这一步会卡很久。
2. 并发模型差异
Kotlin 协程与 Swift Concurrency 是两套模型,跨边界传递异步结果时要格外小心。常见坑是在共享层暴露挂起函数,Swift 侧回调处理不当导致线程错乱或内存泄漏。建议在边界上定义清晰的同步接口,把并发复杂度留在各自平台内。
3. 团队技能结构
KMP 要求团队同时有 Kotlin 能力和两端原生 UI 能力。如果 iOS 侧无人,这条路走不通——共享出来的逻辑没人接,等于白做。
六、小结
KMP 的价值主张不是”写一次到处跑”,而是”把该共享的共享掉,该原生的保持原生“。它的复用率数字不如 Flutter 好看,但落地摩擦也小得多。
如果你的现状是”两个成熟原生应用,逻辑重复实现,bug 双倍”,那 KMP 大概率是 2026 年最值得评估的方案。如果是全新小应用,那还是先看看 Flutter。
#Kotlin#KMP#跨端开发#移动端

