Skip to content

Kotlin Multiplatform

Kotlin Multiplatform(KMP)允许在 Android、iOS、JVM、JS 等多平台共享代码。

build.gradle.kts

kotlin
plugins {
    kotlin("multiplatform") version "1.9.22"
    id("com.android.library") version "8.2.1"
}

kotlin {
    // JVM 目标
    jvm {
        testRuns["test"].executionTask.configure {
            useJUnitPlatform()
        }
    }
    
    // Android 目标
    androidTarget {
        compilations.all {
            kotlinOptions { jvmTarget = "17" }
        }
    }
    
    // iOS 目标
    iosX64()
    iosArm64()
    iosSimulatorArm64()
    
    // JS 目标
    js(IR) {
        browser { testTask { useKarma { useChromeHeadless() } } }
        nodejs()
    }
    
    sourceSets {
        // 所有平台共享代码
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
            }
        }
        
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }
        
        // JVM 特有代码
        val jvmMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-cio:2.3.7")
            }
        }
        
        // Android 特有代码
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-android:2.3.7")
            }
        }
        
        // iOS 特有代码
        val iosMain by creating {
            dependsOn(commonMain)
            dependencies {
                implementation("io.ktor:ktor-client-darwin:2.3.7")
            }
        }
    }
}

共享业务逻辑

kotlin
// commonMain/kotlin/com/example/shared/ApiClient.kt
package com.example.shared

expect class Platform() {
    val name: String
}

class ApiClient {
    private val platform = Platform()
    
    fun getPlatformInfo(): String = "Running on ${platform.name}"
}
kotlin
// jvmMain/kotlin/com/example/shared/Platform.jvm.kt
actual class Platform {
    actual val name: String = "JVM ${System.getProperty("java.version")}"
}

下一步