You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Multiplatform能否为不同平台定义共享客户端公共模块?

Kotlin Multiplatform 是完全可行的方案,你的模块构想可以通过分层KMP模块实现

你的需求(Android和桌面客户端共享UI/逻辑,同时和后端共享基础模型)完全适配KMP的设计思路,不需要纠结“定义Common-client目标”,而是通过分层独立KMP模块来实现你想要的划分。

具体模块分层方案

把你设想的模块拆成两个层级的共享模块,职责更清晰:

  • common-core:所有平台(Android、Desktop、Backend)共享的基础代码,比如通信模型、通用工具类
  • client-common:仅客户端(Android、Desktop)共享的代码,包括共享UI逻辑、客户端专属业务逻辑
  • backend:后端JVM模块,依赖common-core
  • android-app:Android客户端,依赖client-common
  • desktop-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:13:04