KMP-projektstruktur: commonMain, androidMain, iosMain
Forstå hierarkiet for source sets, og hvordan kode deles på tværs af targets.
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 LoggeriosMain: 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 hereGradle-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.ktIntegration 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:podPublishReleaseXCFrameworkHurtigt 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.
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
- KMP-projektstruktur: commonMain, androidMain, iosMain
- expect/actual-mekanismen til platform-API'er
- Deling af Repository- og Use Case-lag
- Dependency injection i KMP med Koin