0Pricing
Kotlin Academy · Lección

Estructura de proyectos KMP: commonMain, androidMain, iosMain

Comprenda la jerarquía de conjuntos de código fuente y cómo se comparte el código entre destinos.

Estructura de proyectos KMP: commonMain, androidMain, iosMain es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué es KMP?

Kotlin Multiplatform (KMP) permite escribir código Kotlin compartido que se compila para JVM, Android, iOS (mediante Kotlin/Native) y JS. El código específico de cada plataforma reside en conjuntos de código fuente independientes.

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

Jerarquía de conjuntos de código fuente

Los conjuntos de código fuente forman una jerarquía. commonMain es la raíz; androidMain y iosMain dependen de ella. El código de commonMain es visible para todos los destinos.

// 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: lógica compartida

Coloque la lógica de negocio, los modelos de dominio, los repositorios y los casos de uso en commonMain. Este código se compila para todos los destinos.

// 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: específico de Android

androidMain puede utilizar las clases del SDK de Android. Un uso habitual es proporcionar implementaciones específicas de Android para declaraciones 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: específico de iOS

iosMain tiene acceso a los frameworks de Apple mediante la interoperabilidad de Kotlin/Native. Utilícelo para las implementaciones de APIs expect/actual destinadas a iOS.

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

Configuración de Gradle para destinos iOS

Para iOS, normalmente se declaran tres destinos: x64 (simulador en Intel), arm64 (dispositivo) y simulatorArm64 (simulador en 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) }
    }
}

Dependencias compartidas en commonMain

Añada las dependencias compartidas (Ktor, SQLDelight, kotlinx.serialization, Koin) a commonMain. Los drivers específicos de cada plataforma deben ir en sus respectivos conjuntos de código fuente.

// 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: pruebas compartidas

Las pruebas de commonTest se ejecutan en todos los destinos. Utilice la biblioteca de pruebas de Kotlin y escriba pruebas unitarias independientes del destino para la lógica de negocio compartida.

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

Conjuntos de código fuente intermedios

Puede crear conjuntos de código fuente intermedios compartidos entre un subconjunto de destinos, por ejemplo, nativeMain para todos los destinos nativos o appleMain para iOS y 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) }
}

Estructura de archivos del proyecto

Un árbol de directorios habitual de un módulo compartido de KMP que separa claramente las responsabilidades.

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

Integración con CocoaPods / SPM

El complemento de Gradle de KMP genera un XCFramework (o un pod de CocoaPods) que se añade al proyecto de Xcode y expone el código Kotlin compartido como un framework nativo.

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

Comprobación rápida

¿Dónde debe colocarse la lógica de negocio compartida (modelos de dominio y casos de uso) en un proyecto de KMP?

Repaso

commonMain contiene la lógica compartida (dominio, repositorios y casos de uso). androidMain/iosMain contienen las implementaciones específicas de cada plataforma. commonTest ejecuta las pruebas en todos los destinos. Las dependencias se dividen así: las APIs compartidas van en commonMain y los drivers específicos de cada plataforma, en los conjuntos de código fuente correspondientes.

Preguntas frecuentes

¿La lección «Estructura de proyectos KMP: commonMain, androidMain, iosMain» es gratis?

Sí — el texto completo de «Estructura de proyectos KMP: commonMain, androidMain, iosMain» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Estructura de proyectos KMP: commonMain, androidMain, iosMain»?

Comprenda la jerarquía de conjuntos de código fuente y cómo se comparte el código entre destinos. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Estructura de proyectos KMP: commonMain, androidMain, iosMain»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Estructura de proyectos KMP: commonMain, androidMain, iosMain
  2. Mecanismo expect/actual para API de plataforma
  3. Compartir las capas de repositorio y casos de uso
  4. Inyección de dependencias en KMP con Koin
← Volver a Kotlin Academy