KMP-Projektstruktur: commonMain, androidMain, iosMain
Verstehen Sie die Hierarchie der Source Sets und wie Code auf mehrere Ziele verteilt wird.
KMP-Projektstruktur: commonMain, androidMain, iosMain ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist KMP?
Kotlin Multiplatform (KMP) ermöglicht es Ihnen, gemeinsam genutzten Kotlin-Code zu schreiben, der für JVM, Android, iOS (über Kotlin/Native) und JS kompiliert wird. Plattformspezifischer Code befindet sich in separaten Source Sets.
// 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") }Hierarchie der Source Sets
Source Sets bilden eine Hierarchie. commonMain ist die Wurzel; androidMain und iosMain hängen davon ab. Code in commonMain ist für alle Targets sichtbar.
// 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: Gemeinsame Logik
Platzieren Sie Geschäftslogik, Domänenmodelle, Repositories und Use Cases in commonMain. Dieser Code wird für alle Targets kompiliert.
// 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-spezifisch
androidMain kann Android-SDK-Klassen verwenden. Typische Verwendung: Android-spezifische Implementierungen von expect/actual-Deklarationen.
// 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-spezifisch
iosMain hat über die Kotlin/Native-Interoperabilität Zugriff auf Apple-Frameworks. Verwenden Sie es für iOS-Implementierungen von expect/actual-APIs.
// 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 für iOS-Targets
Für iOS deklarieren Sie normalerweise drei Targets: x64 (Simulator auf Intel), arm64 (Gerät) und simulatorArm64 (Simulator auf 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) }
}
}Gemeinsame Abhängigkeiten in commonMain
Fügen Sie gemeinsame Abhängigkeiten (Ktor, SQLDelight, kotlinx.serialization, Koin) zu commonMain hinzu. Plattformspezifische Treiber gehören in die jeweiligen Plattform-Source-Sets.
// 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: Gemeinsame Tests
Tests in commonTest werden auf allen Targets ausgeführt. Verwenden Sie die Kotlin-Testbibliothek und schreiben Sie target-unabhängige Unit-Tests für die gemeinsame Geschäftslogik.
// 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)
}
}Zwischenliegende Source Sets
Sie können zwischen mehreren Targets gemeinsam genutzte Source Sets erstellen, zum Beispiel nativeMain für alle nativen Targets oder appleMain für iOS und 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) }
}Dateistruktur des Projekts
Eine typische Verzeichnisstruktur für ein gemeinsames KMP-Modul, in der die Verantwortlichkeiten klar getrennt sind.
// 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.ktCocoaPods-/SPM-Integration
Das KMP-Gradle-Plugin generiert ein XCFramework (oder ein CocoaPods-Pod), das Sie Ihrem Xcode-Projekt hinzufügen. Dadurch wird der gemeinsam genutzte Kotlin-Code als natives Framework bereitgestellt.
// build.gradle.kts for CocoaPods:
kotlin {
cocoapods {
name = "Shared"
version = "1.0"
ios.deploymentTarget = "14.0"
framework { baseName = "Shared" }
}
}
// Run: ./gradlew :shared:podPublishReleaseXCFrameworkKurzer Check
Wo sollten gemeinsam genutzte Geschäftslogik (Domänenmodelle, Use Cases) in einem KMP-Projekt platziert werden?
Zusammenfassung
commonMain enthält die gemeinsame Logik (Domäne, Repositories, Use Cases). androidMain/iosMain enthalten die plattformspezifischen Implementierungen. commonTest führt Tests auf allen Targets aus. Abhängigkeiten werden aufgeteilt: gemeinsame APIs in commonMain, Plattformtreiber in den Plattform-Source-Sets.
Häufig gestellte Fragen
Ist die Lektion „KMP-Projektstruktur: commonMain, androidMain, iosMain“ kostenlos?
Ja — der vollständige Text von „KMP-Projektstruktur: commonMain, androidMain, iosMain“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „KMP-Projektstruktur: commonMain, androidMain, iosMain“?
Verstehen Sie die Hierarchie der Source Sets und wie Code auf mehrere Ziele verteilt wird. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „KMP-Projektstruktur: commonMain, androidMain, iosMain“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- KMP-Projektstruktur: commonMain, androidMain, iosMain
- expect/actual-Mechanismus für Plattform-APIs
- Repository- und Use-Case-Schichten gemeinsam nutzen
- Dependency Injection in KMP mit Koin