kmp需要技能
A. 只做 Android + 写共享层(大多数场景)
-
不需要写 iOS UI 或 Swift。
-
建议掌握这点“最低 iOS 常识”(一天能补齐):
-
Xcode 打包/跑模拟器:会用
gradlew :shared:packForXcode
或生成 XCFramework,导入 Xcode 运行。 -
桥接概念:
suspend
到 Swift 的调用需要 completion 或用 KMP-NativeCoroutines(知道名字即可)。 -
expect/actual 在 iOS 侧放个最小实现(如设备名、文件路径)。
-
线程/主线程:iOS UI 只能在主线程更新(Shared 里避免直接触 UI)。
-
内存管理:知道 Kotlin/Native 的对象在 Swift 侧是强引用,避免循环引用(基本不会碰到就好)。
-
这个级别足够你:独立产出 shared 模块、在 Android 落地、把 iOS 产物交给同事集成。
B. 你还要负责把 shared 真正接到 iOS App(少数场景)
-
需要会一点 Swift/SwiftUI 基础(调用 framework、把结果喂给 View)。
-
会选一个依赖管理策略:SwiftPM(优先)/CocoaPods。
-
会处理 协程到 Swift 的桥接(推荐 KMP-NativeCoroutines)。
C. 你要做跨端负责人/独立开发者
-
再补:Swift 并发(
async/await
)、Xcode 构建配置、崩溃定位(Xcode Organizer)、签名与发布流程。
实操建议(给你最省力的路线)
-
现在就按 A 路线:先把 shared 跑通到 Android;
-
抽 2 小时补齐“iOS 最小集合”(上面 5 点);
-
需要你亲自接 iOS 时,再补 B 路线 的 Swift 基础即可。
判断题(帮你拍板)
-
团队里有 iOS 同学负责集成 → 你不必会 iOS,只需会最小集合 ✅
-
你得自己把 shared 接到 iOS App → 学一点 Swift/SwiftUI(B)✅
-
你要主导跨端架构、发包、排坑 → 学到 C ✅
如果你愿意,我可以按 A 路线 给你一份“iOS 最小集合速记卡”(含命令、Gradle 任务、Xcode 导入步骤、Swift 调用样例),直接照着走就能把 shared 给到 iOS。
您说:
kmp 要懂的语言和技术
ChatGPT 说:
下面这份清单直接回答“做 KMP 需要懂哪些语言与技术”,按必备 → 进阶 → 可选分层,适合你(Android 背景)快速上手与落地。
必备(必须会)
语言/语法
-
Kotlin:协程(
suspend
/Flow
)、sealed class
、inline
、expect/actual
、多平台编译基础。 -
Gradle KTS:能读写
build.gradle.kts
,配置kotlin { targets / sourceSets }
与依赖。
KMP 核心
-
Source Sets:
commonMain/commonTest
(共享)、androidMain/iosMain
(平台实现)。 -
Targets:
androidTarget()
、iosArm64/iosSimulatorArm64/iosX64
。 -
expect/actual:公共层声明接口,平台层提供实现。
-
并发/内存:了解 Kotlin/Native 新内存模型(避免跨线程共享可变对象;倾向不可变+消息传递)。
基础库(跨平台通用)
-
Coroutines(
kotlinx-coroutines-core
) -
Serialization(
kotlinx-serialization-json
) -
网络:Ktor Client(
core
+ Android 用okhttp
、iOS 用darwin
) -
(可选但常用)SQLDelight 作为跨平台 DB
工具链
-
Android Studio/Gradle 跑 Android
-
Xcode 能编译 iOS framework(会打开模拟器/真机运行)
进阶(强烈建议)
平台胶水
-
iOS 最小集合:Xcode 基本操作、Swift 调用 Kotlin framework 的方法。
-
协程到 Swift 桥接:了解回调/
KMP-NativeCoroutines
把suspend/Flow
暴露成async/Combine
。
工程化
-
多模块化:把网络、数据、domain 拆为多 MPP 模块。
-
测试:
commonTest
写单元测试;用Turbine
测 Flow;对 expect/actual 做契约测试。 -
版本管理:BOM/版本对齐(Kotlin、AGP、Ktor、Serialization、SQLDelight)。
-
发布产物:产出 XCFramework(iOS);产出 Maven 包(Android/多平台)。
平台能力抽象
-
日志、时间、文件、加密、网络检测:在
commonMain
定义接口,在androidMain/iosMain
提供实现。
可选(按需掌握)
-
Compose Multiplatform(想共享 UI 时再学;否则先共享数据/业务层)
-
Koin/Dagger/Hilt(KMP 常用 Koin;或先用简易工厂/Service Locator)
-
Web/桌面:Kotlin/JS、Kotlin/JVM 桌面(Compose for Desktop)按项目需要补
-
CI/CD:GitHub Actions / Fastlane(iOS 发包)、Gradle 缓存与构建优化
-
本地存储:
Settings
、Okio
、Ktor-logging
、Napier
(多平台日志)
技术栈组合建议(直接照抄就能用)
-
网络:Ktor (
core
+okhttp
(Android)/darwin
(iOS)) -
JSON:kotlinx-serialization
-
并发:kotlinx-coroutines(
Flow
作为状态流) -
数据库:SQLDelight(或先不引 DB,内存/文件持久化)
-
日志:Napier(多平台)
-
依赖注入:Koin(或手写简单注入)
-
Swift 桥接:KMP-NativeCoroutines(把
suspend/Flow
暴露给 Swift)
能“交付一个 KMP 模块”的能力清单(自检)
-
会在
commonMain
写Repository
,用 Ktor + Serialization 拉数据并返回Flow
-
在
androidMain/iosMain
写 1–2 个actual
(如设备信息、文件存取) -
Android 端接入 shared 并展示数据
-
用 Gradle 产出 iOS XCFramework,在 Xcode 引用并能在 Swift 调用一个
suspend
方法 -
至少 2 个
commonTest
能跑过(模型序列化 + 业务逻辑)
典型坑位与速解
-
版本不匹配:Kotlin/AGP/库版本对齐;优先升级 Kotlin,再对齐各库。
-
iOS 崩溃/卡住:UI 更新必须在主线程;跨线程共享可变对象要避免。
-
二进制导出:优先 XCFramework;SwiftPM 集成最顺手,其次 CocoaPods。
-
Flow 在 iOS:用
KMP-NativeCoroutines
暴露成AsyncSequence
/Combine
。
学习顺序(最短路径)
-
Kotlin 协程 & Flow 复习
-
KMP 工程骨架(
shared
+androidApp
) -
在
commonMain
写:Ktor 请求 + 序列化模型 + Repository + Flow -
写 1 个
expect/actual
(如PlatformInfo
) -
Android 接入跑通
-
产出 iOS XCFramework,在 Swift 调一次
suspend
(用 KMP-NativeCoroutines) -
补测试与多模块化
如果你需要,我可以按上面的栈给你一个最小可编译的示例仓库结构(含 Gradle 配置、Ktor/Serialization、expect/actual、Android 入口、iOS 调用样例),你直接改包名就能用。
您说:
我发现,好像只要会kotlin 就行了
ChatGPT 说:
你感觉对了——Kotlin 占了 80%。但要把 KMP 真正落地,剩下 20% 的“非语法知识” 也很关键:
不止 Kotlin,还需要这点点
-
Gradle KTS & KMP 配置
-
认识
kotlin { targets … sourceSets … }
-
会在
commonMain / androidMain / iosMain
放依赖
kotlin { androidTarget() iosArm64(); iosX64(); iosSimulatorArm64() sourceSets { val commonMain by getting { dependencies { implementation("io.ktor:ktor-client-core:…") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:…") } } } }
-
KMP 专属概念
-
source set:共享 vs 平台代码
-
expect / actual:公共声明 + 各平台实现
// commonMain expect fun deviceName(): String // androidMain actual fun deviceName() = "${android.os.Build.MANUFACTURER} ${android.os.Build.MODEL}" // iosMain actual fun deviceName() = platform.UIKit.UIDevice.currentDevice.name
-
协程/Flow + 库的跨平台用法
-
kotlinx-coroutines
、kotlinx-serialization
-
Ktor Client(Android 用 OkHttp,iOS 用 Darwin)
-
(常用)SQLDelight / Napier 等多平台库
-
最小 iOS 常识(如果要给 iOS 用)
-
用 Gradle 产出 XCFramework 并在 Xcode 引入
-
suspend/Flow
在 Swift 侧的调用方式(可用KMP-NativeCoroutines
简化)
不写 iOS UI 也能做 KMP,但这点点“会用”能让你交付顺畅。
超短上手路径(只会 Kotlin 也能跑)
-
用模版建 :shared(KMM 模板),在
commonMain
写Repository
(Ktor+Serialization)。 -
在
androidMain/iosMain
各写一个actual
(如deviceName()
)。 -
Android 端直接依赖
:shared
跑起来;若需要 iOS,就导出 XCFramework 给同事接。
自检:只会 Kotlin 是否够用?
-
我会改
build.gradle.kts
加 targets/sourceSets/依赖 -
我能写一个
expect/actual
并在两端编过 -
我能在
commonMain
用 Ktor 拉数据并返回Flow
-
[ ](可选)我能产出 XCFramework,并在 Xcode 里被调用一次
👉 结论:会 Kotlin 是必要条件,但要顺利交付 KMP,至少把上面 20% 补齐。
如果你愿意,我可以给你一个“只改包名即可编译”的最小 KMP 骨架(含上述点)。