KMP 开发参考字典:Gradle 配置与常用 API 速查

要点

本篇是 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 起多平台均为官方文档现行内容;各库版本不钉号,以官方发布页为准。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇