Skip to content

KMP 构建模型 (SourceSets)

源:Kotlin 多平台项目配置

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 都是隔离的。