0Pricing
Kotlin Academy · Leçon

Structure d’un projet KMP : commonMain, androidMain, iosMain

Comprenez la hiérarchie des ensembles de sources et la manière dont le code est partagé entre les cibles.

Structure d’un projet KMP : commonMain, androidMain, iosMain est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.

Qu'est-ce que KMP ?

Kotlin Multiplatform (KMP) vous permet d'écrire du code Kotlin partagé qui se compile pour JVM, Android, iOS (via Kotlin/Native) et JS. Le code spécifique à chaque plateforme réside dans des ensembles de sources distincts.

// 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") }

Hiérarchie des ensembles de sources

Les ensembles de sources forment une hiérarchie. commonMain en est la racine ; androidMain et iosMain en dépendent. Le code de commonMain est visible par toutes les cibles.

// 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 : logique partagée

Placez la logique métier, les modèles de domaine, les référentiels et les cas d'utilisation dans commonMain. Ce code se compile pour toutes les cibles.

// 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 : spécifique à Android

androidMain peut utiliser les classes du SDK Android. Utilisation courante : fournir les implémentations spécifiques à Android des déclarations 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 Logger

iosMain : spécifique à iOS

iosMain a accès aux frameworks Apple grâce à l'interopérabilité de Kotlin/Native. Utilisez-le pour les implémentations iOS des 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 here

Configuration Gradle pour les cibles iOS

Pour iOS, vous déclarez généralement trois cibles : x64 (simulateur sur processeur Intel), arm64 (appareil) et simulatorArm64 (simulateur sur 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) }
    }
}

Dépendances partagées dans commonMain

Ajoutez les dépendances partagées (Ktor, SQLDelight, kotlinx.serialization, Koin) à commonMain. Les pilotes spécifiques à chaque plateforme vont dans les ensembles de sources correspondants.

// 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 : tests partagés

Les tests de commonTest s'exécutent sur toutes les cibles. Utilisez la bibliothèque de tests Kotlin et écrivez des tests unitaires indépendants de la cible pour la logique métier partagée.

// 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)
    }
}

Ensembles de sources intermédiaires

Vous pouvez créer des ensembles de sources intermédiaires partagés entre un sous-ensemble de cibles, par exemple nativeMain pour toutes les cibles natives ou appleMain pour iOS et 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) }
}

Organisation des fichiers du projet

Voici une arborescence typique du répertoire d'un module partagé KMP, qui sépare clairement les responsabilités.

// 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

Intégration CocoaPods / SPM

Le plugin Gradle KMP génère une XCFramework (ou un pod CocoaPods) que vous ajoutez à votre projet Xcode, en exposant le code Kotlin partagé sous la forme d'une bibliothèque native.

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

Vérification rapide

Où faut-il placer la logique métier partagée (modèles de domaine, cas d'utilisation) dans un projet KMP ?

Récapitulatif

commonMain contient la logique partagée (domaine, référentiels, cas d'utilisation). androidMain/iosMain contiennent les implémentations propres aux plateformes. commonTest exécute les tests sur toutes les cibles. Les dépendances sont séparées : les API partagées dans commonMain et les pilotes propres aux plateformes dans les ensembles de sources correspondants.

Questions Fréquemment Posées

La leçon « Structure d’un projet KMP : commonMain, androidMain, iosMain » est-elle gratuite ?

Oui — le texte complet de « Structure d’un projet KMP : commonMain, androidMain, iosMain » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Structure d’un projet KMP : commonMain, androidMain, iosMain » ?

Comprenez la hiérarchie des ensembles de sources et la manière dont le code est partagé entre les cibles. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Kotlin Academy ?

Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Structure d’un projet KMP : commonMain, androidMain, iosMain » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?

Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Structure d’un projet KMP : commonMain, androidMain, iosMain
  2. Mécanisme expect/actual pour les API de plateforme
  3. Partager les couches de dépôt et de cas d’utilisation
  4. Injection de dépendances dans KMP avec Koin
← Retour à Kotlin Academy