Kotlin Multiplatform能否为不同平台定义共享客户端公共模块?
Kotlin Multiplatform 是完全可行的方案,你的模块构想可以通过分层KMP模块实现
你的需求(Android和桌面客户端共享UI/逻辑,同时和后端共享基础模型)完全适配KMP的设计思路,不需要纠结“定义Common-client目标”,而是通过分层独立KMP模块来实现你想要的划分。
具体模块分层方案
把你设想的模块拆成两个层级的共享模块,职责更清晰:
common-core:所有平台(Android、Desktop、Backend)共享的基础代码,比如通信模型、通用工具类client-common:仅客户端(Android、Desktop)共享的代码,包括共享UI逻辑、客户端专属业务逻辑backend:后端JVM模块,依赖common-coreandroid-app:Android客户端,依赖client-commondesktop-app:桌面JVM客户端,依赖client-common
这样client-common就完全承担了你设想的“客户端间共享”的角色,它只面向Android和Desktop两个平台,不会混入后端代码。
配置client-common模块的示例
在client-common的build.gradle.kts里,只声明客户端相关的目标,核心配置如下:
plugins { kotlin("multiplatform") id("com.android.library") // 如果包含Android UI相关代码 } kotlin { // 声明Android目标 androidTarget { compilations.all { kotlinOptions.jvmTarget = "1.8" } } // 声明桌面JVM目标 jvm("desktop") { compilations.all { kotlinOptions.jvmTarget = "17" // 根据你的桌面JDK版本调整 } } sourceSets { // 客户端通用代码放在这里 val commonMain by getting { dependencies { implementation(project(":common-core")) // 依赖基础共享模块 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") // 如果用Compose Multiplatform共享UI,添加依赖: // implementation("org.jetbrains.compose.ui:ui:1.5.1") } } // Android端专属代码/依赖 val androidMain by getting { dependencies { implementation("androidx.core:core-ktx:1.12.0") } } // 桌面端专属代码/依赖 val desktopMain by getting { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.7.3") // Compose Desktop依赖: // implementation("org.jetbrains.compose.desktop:desktop:1.5.1") } } } } android { namespace = "com.yourpackage.clientcommon" compileSdk = 34 defaultConfig { minSdk = 21 } }
关于共享UI的补充
如果要实现Android和桌面的UI共享,首选Jetpack Compose Multiplatform:在client-common的commonMain里编写Compose UI组件,Android和Desktop端可以直接复用,仅需处理少量平台专属的逻辑(比如系统权限、本地文件访问)。
为什么不做单一KMP模块
如果把Backend、Android、Desktop都塞进同一个KMP模块,会导致commonMain混入跨端的无关代码,耦合度极高。分层模块的方式更符合单一职责原则,也和你最初的Common/Common-client划分思路完全匹配。
内容的提问来源于stack exchange,提问作者findusl
相关产品推荐
相关产品推荐

