Kotlin Academy · Lektion

KMP-projektstruktur: commonMain, androidMain, iosMain

Forstå hierarkiet for source sets, og hvordan kode deles på tværs af targets.

Lektion 1 af 413 trin

KMP-projektstruktur: commonMain, androidMain, iosMain er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad er KMP?

Kotlin Multiplatform (KMP) lader dig skrive delt Kotlin-kode, der kompileres til JVM, Android, iOS (via Kotlin/Native) og JS. Platformspecifik kode ligger i separate kildekodesæt.

// Typical KMP module structure:
// shared/
//   src/
//     commonMain/kotlin/   <- shared code
//     androidMain/kotlin/  <- Android-only
//     iosMain/kotlin/      <- iOS-only
//     commonTest/kotlin/   <- shared tests
fun main() { println("KMP: one codebase, many targets") }

Hierarki for kildekodesæt

Kildekodesæt danner et hierarki. commonMain er roden, og androidMain og iosMain afhænger af den. Kode i commonMain er synlig for alle målplatforme.

// build.gradle.kts (Kotlin DSL)
kotlin {
    androidTarget()
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        val commonMain by getting {
            dependencies { /* shared deps */ }
        }
        val androidMain by getting
        val iosMain by getting
    }
}

commonMain: Delt logik

Placér forretningslogik, domænemodeller, repositoryer og anvendelsestilfælde i commonMain. Denne kode kompileres til alle målplatforme.

// commonMain/kotlin/com/example/domain/User.kt
data class User(val id: String, val name: String, val email: String)

// commonMain/kotlin/com/example/repository/UserRepository.kt
interface UserRepository {
    suspend fun getUser(id: String): User?
    suspend fun saveUser(user: User)
}

androidMain: Android-specifikt

androidMain kan bruge klasser fra Android SDK'et. Typiske anvendelser er Android-specifikke implementeringer af expect/actual-erklæringer.

// androidMain/kotlin/com/example/platform/PlatformLogger.kt
import android.util.Log
class AndroidLogger : Logger {
    override fun log(msg: String) = Log.d("App", msg)
}
// androidMain/kotlin/com/example/di/PlatformModule.kt
// Koin or Hilt module that binds AndroidLogger to Logger

iosMain: iOS-specifikt

iosMain har adgang til Apple-rammeværker via Kotlin/Native-interoperabilitet. Brug det til iOS-implementeringer af expect/actual-API'er.

// iosMain/kotlin/com/example/platform/PlatformLogger.kt
import platform.Foundation.NSLog
class IosLogger : Logger {
    override fun log(msg: String) = NSLog(msg)
}
// iOS uses Kotlin/Native runtime; no JVM here

Gradle-konfiguration for iOS-mål

Til iOS erklærer du typisk tre mål: x64 (simulator på Intel), arm64 (enhed) og simulatorArm64 (simulator på Apple Silicon).

// build.gradle.kts
kotlin {
    iosX64()
    iosArm64()
    iosSimulatorArm64()
    sourceSets {
        val iosMain by creating {
            dependsOn(commonMain.get())
        }
        val iosX64Main by getting { dependsOn(iosMain) }
        val iosArm64Main by getting { dependsOn(iosMain) }
        val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
    }
}

Delte afhængigheder i commonMain

Føj delte afhængigheder (Ktor, SQLDelight, kotlinx.serialization, Koin) til commonMain. Platformspecifikke drivere placeres i platformens kildekodesæt.

// commonMain dependencies example:
// implementation("io.ktor:ktor-client-core:2.3.0")
// implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
// implementation("io.insert-koin:koin-core:3.4.0")

// androidMain:
// implementation("io.ktor:ktor-client-okhttp:2.3.0")
// iosMain:
// implementation("io.ktor:ktor-client-darwin:2.3.0")

commonTest: Delte test

Test i commonTest køres på alle målplatforme. Brug Kotlin-biblioteket til test, og skriv enhedstest, der er uafhængige af målplatformen, for den delte forretningslogik.

// commonTest/kotlin/UserRepositoryTest.kt
import kotlin.test.Test
import kotlin.test.assertEquals
class UserRepositoryTest {
    @Test
    fun testUserCreation() {
        val user = User("1", "Alice", "alice@example.com")
        assertEquals("Alice", user.name)
    }
}

Mellemliggende kildekodesæt

Du kan oprette mellemliggende kildekodesæt, der deles mellem en delmængde af målplatformene, f.eks. nativeMain til alle native-målplatforme eller appleMain til iOS + macOS.

// Create appleMain shared between iOS and macOS:
sourceSets {
    val appleMain by creating { dependsOn(commonMain.get()) }
    val iosMain by getting { dependsOn(appleMain) }
    val macosMain by getting { dependsOn(appleMain) }
}

Projektets filstruktur

Et typisk katalogtræ for et delt KMP-modul, der adskiller ansvarsområder tydeligt.

// shared/
//   build.gradle.kts
//   src/
//     commonMain/kotlin/
//       domain/           User.kt, Post.kt
//       repository/       UserRepository.kt
//       usecase/          GetUserUseCase.kt
//     androidMain/kotlin/
//       repository/       RoomUserRepository.kt
//     iosMain/kotlin/
//       repository/       CoreDataUserRepository.kt
//     commonTest/kotlin/  GetUserUseCaseTest.kt

Integration med CocoaPods / SPM

KMP Gradle-plugin'et genererer en XCFramework (eller en CocoaPods-pod), som du føjer til dit Xcode-projekt og dermed eksponerer den delte Kotlin-kode som et oprindeligt rammeværk.

// build.gradle.kts for CocoaPods:
kotlin {
    cocoapods {
        name = "Shared"
        version = "1.0"
        ios.deploymentTarget = "14.0"
        framework { baseName = "Shared" }
    }
}
// Run: ./gradlew :shared:podPublishReleaseXCFramework

Hurtigt tjek

Hvor skal delt forretningslogik (domænemodeller, anvendelsestilfælde) placeres i et KMP-projekt?

Opsummering

commonMain indeholder delt logik (domæne, repositoryer, anvendelsestilfælde). androidMain/iosMain indeholder platformspecifikke implementeringer. commonTest kører test på alle målplatforme. Afhængigheder opdeles: delte API'er i commonMain, platformspecifikke drivere i platformens kildekodesæt.

Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “KMP-projektstruktur: commonMain, androidMain, iosMain” gratis?

Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “KMP-projektstruktur: commonMain, androidMain, iosMain”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “KMP-projektstruktur: commonMain, androidMain, iosMain”?

Forstå hierarkiet for source sets, og hvordan kode deles på tværs af targets. Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kotlin Academy?

Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “KMP-projektstruktur: commonMain, androidMain, iosMain”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?

Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. KMP-projektstruktur: commonMain, androidMain, iosMain
  2. expect/actual-mekanismen til platform-API'er
  3. Deling af Repository- og Use Case-lag
  4. Dependency injection i KMP med Koin
← Tilbage til Kotlin Academy