Kotlin Multiplatform 跨平台共享逻辑技术调研
用 Kotlin 在多平台之间共享业务逻辑与领域模型
Kotlin Multiplatform 通过 expect/actual 与 commonMain 模式共享核心逻辑,是 Android 团队扩展到 iOS 和桌面的重要技术路线。
Kotlin Multiplatform 跨平台共享逻辑技术调研
Kotlin Multiplatform(KMP)是 JetBrains 推出的 跨平台代码共享 技术,允许在 commonMain 中编写业务逻辑、网络、数据模型与领域层,通过 expect/actual 机制为 Android、iOS、Desktop、Web(Kotlin/Wasm)提供平台实现。2026 年 Google 正式将 KMP 纳入 Android 官方推荐栈,与 Compose Multiplatform、Room KMP 形成 Kotlin 跨端全家桶。
一、 基本信息
| 维度 | 关键指标 / 描述 |
|---|---|
| 技术标签 | 逻辑共享 / Kotlin / expect-actual / Native |
| 开发商 | JetBrains(Google 协同投入) |
| 官方网站 | https://kotlinlang.org/docs/multiplatform.html |
| 官方文档 | https://kotlinlang.org/docs/multiplatform-get-started.html |
| GitHub 仓库 | https://github.com/JetBrains/kotlin |
| 许可协议 | Apache License 2.0 |
| 首次发布 | 2017 年(KMP 稳定化约 2023+) |
| 当前版本 | Kotlin 2.1+(2026 年) |
| 支持平台 | Android、iOS、Desktop、Web、Server |
| 生态成熟度 | 中高(快速增长) |
二、 技术定位与简介
KMP 的核心主张是 「共享逻辑,UI 各端原生」(也可选 Compose Multiplatform 共享 UI):
- commonMain:网络请求、序列化、业务规则、Repository 接口。
- androidMain / iosMain:平台 API、Keychain、SQLite 驱动等
actual实现。 - iOS 产物:
shared.framework或shared.xcframework嵌入 Xcode 工程。
与 Flutter 差异:KMP 默认不共享 UI,各端用 Jetpack Compose / SwiftUI / 原生 UI。与 React Native 差异:KMP 编译为平台原生二进制,无 JS Bridge。与 uni-app 差异:KMP 面向原生 App,非小程序。
适合:Android 团队扩展 iOS、双端共享复杂业务逻辑、已有 Kotlin 资产沉淀。
三、 快速上手安装说明
1. 创建 KMP 项目
使用 Android Studio Kotlin Multiplatform 模板,或 kmp.jetbrains.com Wizard。
2. Gradle 模块结构
// shared/build.gradle.kts 片段
kotlin {
androidTarget()
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
commonMain.dependencies {
implementation("io.ktor:ktor-client-core:3.0.0")
}
androidMain.dependencies {
implementation("io.ktor:ktor-client-okhttp:3.0.0")
}
iosMain.dependencies {
implementation("io.ktor:ktor-client-darwin:3.0.0")
}
}
}3. expect / actual 示例
// commonMain
expect fun platformName(): String
// androidMain
actual fun platformName(): String = "Android"
// iosMain
actual fun platformName(): String = "iOS"4. 构建与集成
./gradlew :shared:assembleSharedXCFramework
# 在 Xcode 中链接 xcframework,Swift 调用 Kotlin 导出 API四、 核心特性
1. 分层共享
可仅共享 domain + data,UI 完全原生。
2. expect / actual
编译期多平台抽象,类型安全优于 C 宏或条件编译。
3. Kotlin/Native
iOS 编译为 LLVM 原生代码,非解释执行。
4. 与 Android 生态互通
Android 模块可直接 implementation(projects.shared)。
5. Kotlin/Wasm 与 JS 目标
Web 端共享逻辑实验性增强(2026 持续演进)。
6. Google 官方库 KMP 化
Room、DataStore、Navigation 等逐步提供 KMP 支持。
五、 适用场景
1. 黄金适用场景
- Android 主力团队需要高质量 iOS 版,共享网络/模型/业务规则。
- 金融科技、电商等复杂领域层,双端逻辑一致性要求高。
- 渐进式迁移:先共享 data 层,UI 保持 SwiftUI/Compose 各写各的。
- Desktop 工具复用同一套 core 模块。
2. 局限适用场景
- 纯 Web/小程序团队,无 Kotlin 积累。
- 极简展示型 App,共享逻辑收益低于工程复杂度。
- 需要快速 MVP 且团队只会 React(考虑 RN/Expo)。
- 依赖大量平台独有 UI 能力且逻辑轻薄。
六、 技术亮点
1. 逻辑一致性
单测运行在 commonTest,双端行为对齐成本低。
2. 原生 UI 体验
iOS 仍用 SwiftUI/UIKit,不牺牲平台交互规范。
3. 类型安全
Kotlin 强类型贯穿共享层,减少双端接口漂移。
4. JetBrains + Google 双引擎
IDE 支持、Android 官方文档、Gradle 工具链成熟。
5. 库生态扩展
Ktor、SQLDelight、Koin、 kotlinx.serialization 一等 KMP 支持。
七、 核心概念与架构
digraph KMP_Arch {
rankdir=TB
node [shape=box, style="rounded,filled", fillcolor="#f0f9ff"]
AndroidUI [label="Android UI\n(Compose/Views)", fillcolor="#bae6fd"]
iOSUI [label="iOS UI\n(SwiftUI/UIKit)"]
Shared [label="shared module\ncommonMain"]
AndroidActual [label="androidMain\n(actual)"]
iOSActual [label="iosMain\n(actual)"]
JVM [label="JVM / ART"]
Native [label="Kotlin/Native\n(iOS framework)"]
AndroidUI -> Shared
iOSUI -> Shared
Shared -> AndroidActual
Shared -> iOSActual
AndroidActual -> JVM
iOSActual -> Native
}边界原则:共享层不引用 android.* 或 UIKit;平台 API 经 expect/actual 或接口注入。
八、 技术局限与边界
- 学习曲线:Gradle KMP 配置、iOS 链接、cinterop 对前端背景开发者陡峭。
- 构建时间:多目标编译显著长于单端 Android。
- iOS 调试:Kotlin/Native 崩溃栈与 Xcode 符号化需额外配置。
- UI 不默认共享:若需共享 UI 需另选 Compose Multiplatform。
- 第三方 SDK:部分 iOS SDK 仅 ObjC/Swift,需写 Swift 桥接层。
- 人才市场:国内精通 KMP + iOS 集成的工程师仍少于 Flutter/RN。
九、 生态地图
| 类别 | 代表 |
|---|---|
| 网络 | Ktor Client |
| 数据库 | SQLDelight、Room KMP |
| DI | Koin、kotlin-inject |
| 序列化 | kotlinx.serialization |
| 日志 | Napier、Kermit |
| 设置存储 | Multiplatform Settings |
| UI(可选) | Compose Multiplatform |
| 测试 | kotlin.test、Turbine |
十、 生态集成
| 方向 | 说明 |
|---|---|
| Android | 标准 Gradle 模块依赖;与 Hilt 共存需规划 DI 边界。 |
| iOS | XCFramework + Swift 互操作;SKIE 改善 Swift API 导出。 |
| CI | GitHub Actions 矩阵构建 Android + iOS;Mac runner 必需。 |
| Firebase | 部分能力走 REST;原生 SDK 放平台层 actual。 |
| Compose MP | 可选统一 UI 层,见 Compose Multiplatform 文档。 |
十一、 开发与工程化
1. 推荐模块划分
shared/
commonMain/ # 领域 + 数据接口
commonTest/
androidMain/
iosMain/
androidApp/
iosApp/2. API 导出
使用 export() 控制暴露给 Swift 的 API 面;避免泄漏内部类型。
3. 版本目录
libs.versions.toml 统一 Kotlin、Ktor、Coroutines 版本。
4. 静态分析
./gradlew check;detekt/ktlint 应用于 shared 模块。
十二、 性能与安全
- Kotlin/Native 冷启动优于 JS Bridge,但 framework 体积需监控。
- 网络层统一 Certificate Pinning 接口,各端 actual 实现。
- 敏感存储用 Keychain/EncryptedSharedPreferences 的 actual 封装。
- 避免在 commonMain 硬编码密钥;配置经
BuildKonfig等注入。 - iOS Release 开启 bitcode 已废弃;关注 Xcode 链接设置。
十三、 技术对比
| 方案 | 共享层 | UI | 语言 | 典型团队 |
|---|---|---|---|---|
| KMP | 逻辑 | 各端原生 | Kotlin | Android 扩展 iOS |
| Compose MP | 逻辑+UI | 共享 Compose | Kotlin | Kotlin 全栈 |
| Flutter | 全栈 | 自绘 | Dart | 跨端 UI 一致 |
| RN | JS 全栈 | RN 组件 | TS | React 团队 |
| Swift+Kotlin 双写 | 无 | 原生 | 双语言 | 大厂分团队 |
十四、 最佳实践
- 先划清
domain/data共享边界,UI 暂缓共享。 expect/actual保持最小面;复杂平台能力用接口 + 注入。commonTest覆盖核心业务规则与序列化契约。- iOS 集成建立 XCFramework 自动化 CI,避免手工拷贝。
- 用 SKIE 或精简导出 API,改善 Swift 调用体验。
- 关注 Kotlin 与 AGP 版本兼容矩阵。
- 评估 Compose MP 前先用 KMP 逻辑共享验证团队 Kotlin 能力。
十五、 学习与社区资源
- 官方入门:https://kotlinlang.org/docs/multiplatform-get-started.html
- Android KMP:https://developer.android.com/kotlin/multiplatform
- KMP Wizard:https://kmp.jetbrains.com/
- Samples:https://github.com/Kotlin/kotlin-multiplatform-samples
- SKIE:https://skie.touchlab.co/
- Touchlab 博客:https://touchlab.co/(KMP 实践)