要点
本篇是 KMP 的条目式速查,按用途分七组:Gradle 插件、kotlin{} 目标与产物、sourceSets 依赖、Gradle 属性、命令行任务、多平台库坐标、语法关键字与互操作注解;文末有全量速查表,可只搜表定位条目。版本基线:Kotlin 2.2 稳定线、Compose Multiplatform 1.8 线(iOS 自 1.8.0 稳定)。依赖一律用 version catalog 声明,不钉版本号。机制讲解不重复:定位与工程结构见开山篇,expect/actual 与源集原理见《KMP 语法要点》,完整工程见《用 Compose Multiplatform 写一个双端待办》。
Gradle 插件组
模块级 build.gradle.kts 的 plugins 块五件套:kotlin(“multiplatform”)(KMP 核心)、com.android.application(library 模块换成 com.android.library)、org.jetbrains.kotlin.plugin.compose、org.jetbrains.compose、kotlin(“plugin.serialization”)。版本全写进根工程 version catalog,模块只引用别名;漏配任何一个,对应块不识别。
| 插件 |
一句话用途 |
有什么坑 |
| kotlin(“multiplatform”) |
注册 targets/sourceSets/编译任务 |
与 AGP 版本有兼容矩阵,升级先查对应表 |
| com.android.application / library |
Android 目标的宿主与打包 |
compileSdk、namespace 仍在 android{} 块里管 |
| org.jetbrains.kotlin.plugin.compose |
Compose 编译器插件 |
Kotlin 2.0 起随 Kotlin 同版本发布;只加依赖不加插件 = 编译不过 |
| org.jetbrains.compose |
Compose 跨端产物与统一依赖 |
与 AGP 兼容关系较紧(现行 AGP 8.x 需对照官方兼容表) |
| kotlin(“plugin.serialization”) |
@Serializable 的编译期生成 |
只加运行库不加插件,运行时才炸 |
kotlin{} 目标与产物组
双端工程的最小 kotlin{} 配置:
kotlin {
androidTarget() // Android 目标;打包细节走 AGP
iosArm64() // iOS 真机
iosSimulatorArm64() // Apple Silicon 模拟器(M 系列开发机的主力)
iosX64() // Intel 模拟器(老机器才需要)
listOf(iosArm64(), iosSimulatorArm64(), iosX64()).forEach { target ->
target.binaries.framework { // 给 iOS 侧的产物
baseName = "ComposeApp" // Swift 侧 import 的模块名,改了要同步 Xcode
isStatic = true // 静态链接产物小
}
}
jvmToolchain(17) // 编译 JDK,与 AGP/系统 JDK 对齐
}
| 声明 |
一句话用途 |
有什么坑 |
| androidTarget() |
注册 Android 目标 |
旧写法 android() 在新版 KGP 已移除 |
| iosArm64 / iosSimulatorArm64 / iosX64 |
真机与两种架构模拟器 |
Apple 目标只能 macOS 构建机编译,CI 跑 macOS runner |
| binaries.framework { baseName } |
产出 iOS 框架供 Xcode 用 |
baseName 与 Swift 侧 import 名一致,重命名后报找不到模块 |
| binaries.xcframework { } |
产出 .xcframework(多架构合一) |
CI 分发或不走 Gradle 脚本集成时才需要 |
| 默认层级模板 |
iosMain 等中间源集自动合成 |
1.9.20 起默认启用;显式建同名源集前确认没关掉 |
| jvmToolchain(17) |
统一编译 JDK 版本 |
与本机 JDK 不齐时离线环境直接失败 |
sourceSets 与依赖组
依赖按源集声明——这是 KMP 与单端工程最大的行为差异:commonMain 只能放多平台制品,平台专属依赖必须放平台源集。引擎类依赖(Ktor)是典型:
sourceSets {
commonMain.dependencies {
implementation(libs.kotlinx.serialization.json) // 多平台制品才许进这里
implementation(libs.ktor.client.core)
}
androidMain.dependencies {
implementation(libs.ktor.client.android) // 平台引擎放平台源集
}
iosMain.dependencies {
implementation(libs.ktor.client.darwin) // iOS 侧引擎
}
}
| 条目 |
一句话用途 |
有什么坑 |
| commonMain.dependencies |
全目标共享依赖 |
放 Android 专属库直接编译失败——机制即护栏 |
| androidMain / iosMain.dependencies |
平台引擎与平台库 |
依赖放错源集是最常见的”运行时才暴露”错误 |
| commonTest / 平台 Test 源集 |
共享与平台单测 |
commonTest 的用例会在每个目标的 test 任务里各跑一遍 |
| libs.*(version catalog) |
版本集中到 libs.versions.toml |
升级只改一处;没声明的别名整个工程不识别 |
Gradle 属性组
| 属性 |
一句话用途 |
有什么坑 |
| kotlin.native.ignoreDisabledTargets=true |
跳过被当前工具链禁用的目标 |
换 Xcode 版本后报 target disabled,先想到它 |
| kotlin.mpp.stability.now |
锁定当前编译期行为 |
排查升级问题时才加,平时加会错过修复 |
| org.gradle.jvmargs=-Xmx4g |
给 Kotlin/Native 编译留内存 |
iOS 目标内存开销大,默认 2G 常 OOM 且报错模糊 |
命令行任务组
| 任务 |
一句话用途 |
有什么坑 |
| ./gradlew :composeApp:assembleDebug |
Android 调试包 |
iOS 产物不在标准 assemble 里 |
| ./gradlew :composeApp:embedAndSignAppleFrameworkForXcode |
构建 iOS 侧框架 |
由 Xcode Run Script 调用(放 Compile Sources 之前);改了 Kotlin 没生效就手动跑一次 |
| ./gradlew :composeApp:assembleXCFramework |
产出 .xcframework |
需先声明 xcframework binary |
| ./gradlew :composeApp:iosSimulatorArm64Test |
iOS 模拟器单测 |
需要 macOS 与模拟器;跑 commonTest + iosMain 测试 |
| ./gradlew :composeApp:testDebugUnitTest |
Android JVM 单测 |
与上一条互不替代,共享逻辑两处都该绿 |
| ./gradlew :shared:podInstall |
CocoaPods 集成生成 Pod 工程 |
仅走 CocoaPods 插件时存在 |
多平台库坐标组
| 需求 |
坐标(组名一律 org.jetbrains.kotlinx / androidx.* 等,版本进 catalog) |
有什么坑 |
| 网络请求 |
ktor-client-core + content-negotiation + serialization-json;引擎分端放:androidMain 放 ktor-client-android,iosMain 放 ktor-client-darwin |
common 只放 core 不放引擎,运行时才报”找不到引擎” |
| JSON 序列化 |
kotlinx-serialization-json(配 plugin.serialization) |
@Serializable 类放 commonMain 才共享;反射式 JSON 库进不了 Native |
| 异步并发 |
kotlinx-coroutines-core |
Flow/suspend 原样跨端;不要在共享层用线程 API |
| 时间日期 |
kotlinx-datetime |
不是 java.time 全功能替身,够用但少;格式化自己拼 |
| 键值存储 |
androidx.datastore:datastore-preferences(1.1 起官方多平台) |
文件路径各端不同,从平台入口传进来,别写死相对路径 |
| 关系数据库(官方) |
androidx.room:room-runtime + room-compiler(Room 2.7+ 支持 KMP) |
要配 KSP 与 SQLite 驱动,成本高于 DataStore,数据量大再上 |
| 关系数据库(社区) |
app.cash.sqldelight:runtime + android-driver / native-driver |
SQL-first;驱动分端声明,commonMain 只放 runtime |
| ViewModel |
androidx.lifecycle:lifecycle-viewmodel-compose |
官方多平台;共享 ViewModel 不许碰 android.* |
语法关键字与互操作注解组
| 条目 |
一句话用途 |
有什么坑 |
| expect |
声明跨目标契约(fun/val/class) |
不许有实现体;目标数倍增契约数 |
| actual |
平台侧兑现契约 |
同包同名同签名逐字对齐;不能重复默认参数 |
| actual typealias |
平台现成类直接顶替 expect class |
类型必须完全一致;类形态带 Beta 提示 |
| @Throws |
Kotlin 异常过 Swift 边界变 NSError |
不标注就抛 = 崩溃;只对列出的类型生效 |
| @HiddenFromObjC |
声明不进 Obj-C/Swift 头文件 |
需 @OptIn(ExperimentalObjCRefinement::class) |
| @ShouldRefineInSwift |
提示 Swift 侧做 refinement 包装 |
只提示不生成,包装要 Swift 自己写 |
| suspend / Flow |
共享层异步的默认写法 |
无需平台适配;UI 侧 collectAsState 收 |
速查表
| 条目 |
一句话用途 |
有什么坑 |
| kotlin(“multiplatform”) / AGP |
KMP 核心 / Android 宿主 |
版本有兼容矩阵,升级先查表 |
| androidTarget() |
Android 目标 |
旧写法 android() 已移除 |
| iosArm64/SimulatorArm64/X64 |
真机与两种模拟器 |
Apple 目标仅 macOS 可编 |
| binaries.framework { baseName } |
iOS 框架产物 |
baseName 改动要同步 Xcode |
| embedAndSignAppleFrameworkForXcode |
Xcode 集成的框架构建 |
Run Script 必须在 Compile Sources 之前 |
| commonMain.dependencies |
共享依赖 |
只收多平台制品,平台库进平台源集 |
| iosSimulatorArm64Test / testDebugUnitTest |
双端单测 |
互不替代,两处都绿才算过 |
| ktor-client(core + 引擎) |
多平台 HTTP |
引擎按端放,common 只放 core 会运行时炸 |
| kotlinx-datetime / coroutines-core |
时间 / 异步 |
前者非 java.time 全替身;后者原样跨端 |
| datastore-preferences(1.1+) |
官方多平台键值存储 |
文件路径从平台入口传入 |
| Room 2.7+ / SQLDelight |
官方 / 社区多平台 SQLite |
按目标配驱动,数据小先用 DataStore |
| expect / actual / actual typealias |
编译期跨端契约 |
缺目标编译失败;类形态带 Beta 提示 |
| @Throws / @HiddenFromObjC / @ShouldRefineInSwift |
iOS 互操作三注解 |
@Throws 是安全项,其余是 API 洁癖项 |
延伸阅读
expect/actual 与源集机制见KMP 语法要点;配置组合成真实工程的全过程见双端待办实战;串起系列的路径见KMP 学习路线;Kotlin 语言层回Kotlin / Compose 基础知识参考字典。
版本核实(以官方文档为准):基线为 Kotlin 2.2 稳定线与 Compose Multiplatform 1.8 线(截至 2025-07-08,官方发布页口径);默认层级模板(Kotlin 1.9.20 起)、embedAndSignAppleFrameworkForXcode 与 XCFramework 任务、DataStore 1.1 与 Room 2.7 起多平台均为官方文档现行内容;各库版本不钉号,以官方发布页为准。