KMP 项目结构与基本配置
什么是 KMP 项目结构?
Kotlin 多平台(Kotlin Multiplatform, KMP)项目允许开发者在一个代码库中编写共享逻辑,同时针对不同平台(如 JVM、Android、iOS、JavaScript 等)生成原生代码。KMP 项目的核心思想是通过 commonMain 模块定义共享代码,再通过平台特定模块(如 jvmMain、iosMain)实现平台差异化的逻辑。
项目结构解析
一个典型的 KMP 项目目录结构如下:
my-kmp-project/
├── build.gradle.kts # 项目级构建配置
├── settings.gradle.kts # 模块配置
├── commonMain/ # 公共代码
│ ├── kotlin/ # Kotlin 共享代码
│ └── resources/ # 共享资源
├── androidMain/ # Android 平台代码
│ ├── kotlin/ # Android 专用代码
│ └── resources/ # Android 资源
├── iosMain/ # iOS 平台代码
│ ├── kotlin/ # iOS 专用代码
│ └── resources/ # iOS 资源
└── jvmMain/ # JVM 平台代码
├── kotlin/ # JVM 专用代码
└── resources/ # JVM 资源
基本配置步骤
1. 创建 KMP 项目
在 settings.gradle.kts 中启用 KMP 插件并声明目标平台:
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
}
}
plugins {
id("org.jetbrains.kotlin.multiplatform") version "1.9.0"
}
kotlin {
jvm() // JVM 目标
android() // Android 目标
iosX64() // iOS 模拟器 (x86_64)
iosArm64() // iOS 真机 (ARM64)
js(IR) { // JavaScript 目标
browser()
}
}
2. 配置共享模块
在 build.gradle.kts 中定义 commonMain 依赖:
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
}
}
}
3. 配置平台特定模块
为不同平台添加依赖(以 Android 为例):
kotlin {
sourceSets {
val androidMain by getting {
dependencies {
implementation("androidx.core:core-ktx:1.10.1")
}
}
}
}
4. 使用 expect/actual 机制
在 commonMain 中声明预期 API:
// commonMain/kotlin/Platform.kt
expect fun getPlatformName(): String
在平台模块中实现具体逻辑:
// androidMain/kotlin/Platform.kt
actual fun getPlatformName(): String = "Android"
// iosMain/kotlin/Platform.kt
actual fun getPlatformName(): String = "iOS"
常见配置选项
| 配置项 | 说明 |
|---|---|
enablePreviewFeatures | 启用实验性功能(如 K2 编译器) |
compilerOptions | 配置编译器选项(如语言版本、API 版本) |
targetHierarchy | 自定义目标层次结构(Kotlin 1.9+) |
调试与构建
- 运行测试:使用
./gradlew allTests执行所有平台测试 - 构建 iOS 框架:
./gradlew linkDebugFrameworkIosArm64 - 发布 Android 库:
./gradlew publishToMavenLocal
注意事项
- 确保 Android SDK 和 Xcode 已正确安装
- 对于 iOS 目标,需要在 macOS 上开发
- 使用最新稳定版的 Kotlin 插件(1.9.0+ 推荐)
通过以上配置,你的 KMP 项目已经可以开始编写跨平台代码了!下一节我们将深入探讨 expect/actual 机制的具体应用。
