KMP 构建模型 (SourceSets)
Kotlin Multiplatform (KMP) 改变了 Gradle 的传统 SourceSet 布局。理解它的分层结构是开发跨平台库的基础。
1. 什么是 SourceSet 层次结构?
在 KMP 中,源码不是扁平的。它们形成了一个继承树:
commonMain: 核心逻辑,不依赖具体平台 API。nativeMain: 苹果 (iOS/macOS) 和 Linux 的公共逻辑。iosMain: 仅限 iOS 的逻辑。androidMain: 仅限 Android 的逻辑。
2. 依赖传递逻辑
如果 iosMain 依赖于 commonMain,那么 commonMain 中声明的所有库也会自动提供给 iosMain。
3. 手动定义分层
如果你想定义一个新的中间层(例如:desktopMain 包含 Windows 和 macOS),需要在 build.gradle.kts 中声明:
kotlin
kotlin {
// 自动应用 HMPP (Hierarchical Multiplatform Project)
applyDefaultHierarchyTemplate()
sourceSets {
val commonMain by getting
val desktopMain by creating {
dependsOn(commonMain)
}
val jvmMain by getting {
dependsOn(desktopMain)
}
}
}4. 专家技巧:expect / actual 的映射
Gradle 编译器在编译每个具体平台(Target)时,会自动寻找该 Target 对应的 actual 实现,并与共享层的 expect 声明进行合并。
编译产物
即使你只有一套 Kotlin 源码,Gradle 也会为你生成多个编译 Task(如 compileKotlinAndroid, compileKotlinIosArm64),每个 Task 对应的 classpath 都是隔离的。