Struttura di progetto KMP: commonMain, androidMain, iosMain
Comprenda la gerarchia dei source set e come condividere il codice tra le piattaforme di destinazione.
Struttura di progetto KMP: commonMain, androidMain, iosMain è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.
Che cos'è KMP?
Kotlin Multiplatform (KMP) consente di scrivere codice Kotlin condiviso che viene compilato per JVM, Android, iOS (tramite Kotlin/Native) e JS. Il codice specifico della piattaforma risiede in source set separati.
// 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") }Gerarchia dei source set
I source set formano una gerarchia. commonMain è la radice; androidMain e iosMain dipendono da essa. Il codice in commonMain è visibile a tutti i target.
// 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: logica condivisa
Inserisca la logica di business, i modelli di dominio, i repository e i casi d'uso in commonMain. Questo codice viene compilato per tutti i target.
// 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: specifico per Android
androidMain può utilizzare le classi dell'SDK Android. Un uso tipico consiste nel fornire implementazioni specifiche per Android delle dichiarazioni expect/actual.
// 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: specifico per iOS
iosMain ha accesso ai framework Apple tramite l'interoperabilità di Kotlin/Native. Lo utilizzi per le implementazioni iOS delle API expect/actual.
// 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 hereConfigurazione Gradle per i target iOS
Per iOS, in genere si dichiarano tre target: x64 (simulatore su Intel), arm64 (dispositivo) e simulatorArm64 (simulatore su 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) }
}
}Dipendenze condivise in commonMain
Aggiunga le dipendenze condivise (Ktor, SQLDelight, kotlinx.serialization, Koin) a commonMain. I driver specifici della piattaforma vanno inseriti nei source set della piattaforma.
// 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: test condivisi
I test in commonTest vengono eseguiti su tutti i target. Utilizzi la libreria Kotlin test e scriva unit test indipendenti dal target per la logica di business condivisa.
// 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)
}
}Source set intermedi
È possibile creare source set intermedi condivisi tra un sottoinsieme di target, ad esempio nativeMain per tutti i target nativi o appleMain per 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) }
}Struttura dei file del progetto
Un tipico albero di directory di un modulo condiviso KMP, che separa chiaramente le responsabilità.
// 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.ktIntegrazione con CocoaPods / SPM
Il plugin Gradle KMP genera un XCFramework (o un pod CocoaPods) da aggiungere al progetto Xcode, esponendo il codice Kotlin condiviso come framework nativo.
// build.gradle.kts for CocoaPods:
kotlin {
cocoapods {
name = "Shared"
version = "1.0"
ios.deploymentTarget = "14.0"
framework { baseName = "Shared" }
}
}
// Run: ./gradlew :shared:podPublishReleaseXCFrameworkVerifica rapida
Dove devono essere collocati la logica di business condivisa, i modelli di dominio e i casi d'uso in un progetto KMP?
Riepilogo
commonMain contiene la logica condivisa (dominio, repository, casi d'uso). androidMain/iosMain contengono le implementazioni specifiche della piattaforma. commonTest esegue i test su tutti i target. Le dipendenze sono suddivise: API condivise in commonMain, driver specifici della piattaforma nei source set della piattaforma.
Domande Frequenti
La lezione «Struttura di progetto KMP: commonMain, androidMain, iosMain» è gratuita?
Sì — il testo completo di «Struttura di progetto KMP: commonMain, androidMain, iosMain» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.
Cosa imparerò in «Struttura di progetto KMP: commonMain, androidMain, iosMain»?
Comprenda la gerarchia dei source set e come condividere il codice tra le piattaforme di destinazione. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Kotlin Academy?
Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Struttura di progetto KMP: commonMain, androidMain, iosMain»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?
Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Struttura di progetto KMP: commonMain, androidMain, iosMain
- Meccanismo expect/actual per le API di piattaforma
- Condividere i livelli Repository e Use Case
- Dependency injection in KMP con Koin