Introducción
Durante años, los equipos de desarrollo móvil han tenido que elegir entre dos mundos: mantener dos bases de código separadas (una para Android, otra para iOS) o apostar por un framework cross-platform que sacrifica rendimiento o experiencia nativa. Kotlin Multiplatform (KMP) propone un camino intermedio: compartir la lógica de negocio entre plataformas mientras cada una conserva su UI nativa.
Desde que JetBrains declaró KMP estable en producción a finales de 2023, la adopción ha crecido notablemente. En este artículo veremos qué es, cómo funciona y cuándo tiene sentido usarlo.
¿Qué es Kotlin Multiplatform?
Kotlin Multiplatform es una tecnología del ecosistema Kotlin que permite escribir código compartido que se compila para múltiples plataformas destino:
- Android (JVM)
- iOS (mediante Kotlin/Native, genera un framework de Objective-C)
- JVM (servidor, desktop)
- JavaScript / WebAssembly
La clave está en el concepto de expect / actual: defines una interfaz común en el módulo compartido (expect) y cada plataforma proporciona su implementación concreta (actual).
Estructura de un proyecto KMP
Un proyecto típico de Kotlin Multiplatform tiene esta estructura de módulos:
myProject/
├── shared/
│ └── src/
│ ├── commonMain/ ← código compartido
│ ├── androidMain/ ← implementaciones Android
│ └── iosMain/ ← implementaciones iOS
├── androidApp/ ← app Android nativa
└── iosApp/ ← app iOS nativa (Xcode)
El módulo shared contiene todo lo que tiene sentido reutilizar: repositorios, casos de uso, modelos de dominio, llamadas a red, parseo de datos...
Código de ejemplo
El mecanismo expect / actual es la pieza central de KMP. Aquí un ejemplo con el acceso a la hora actual:
// commonMain: declaramos qué queremos
expect fun currentTimeMillis(): Long
// androidMain: implementación Android
actual fun currentTimeMillis(): Long = System.currentTimeMillis()
// iosMain: implementación iOS
actual fun currentTimeMillis(): Long =
NSDate().timeIntervalSince1970.toLong() * 1000
Para las llamadas a red, la librería Ktor es el estándar de facto en KMP y funciona en todas las plataformas sin cambios:
// commonMain — funciona en Android, iOS, JVM y JS
val client = HttpClient {
install(ContentNegotiation) {
json()
}
}
suspend fun fetchUser(id: String): User {
return client.get("https://api.example.com/users/$id").body()
}
¿Cuándo usar KMP y cuándo no?
KMP brilla especialmente cuando:
- Tienes lógica de negocio compleja que no quieres duplicar
- Tu equipo ya usa Kotlin para Android
- Necesitas UIs verdaderamente nativas (no un canvas renderizado)
- Quieres integración con el ecosistema de Android existente
Puede no ser la mejor opción si:
- Tu app es principalmente UI con poca lógica compartible
- Tu equipo iOS no tiene experiencia con Kotlin/Swift interop
- Necesitas soporte de plataformas más exóticas fuera del foco principal de JetBrains
El ecosistema: librerías clave
El ecosistema KMP ha madurado mucho. Estas son las librerías más consolidadas:
- Ktor — cliente HTTP multiplataforma
- SQLDelight — base de datos local con queries tipadas en SQL
- Kotlinx.serialization — serialización JSON y otros formatos
- Kotlinx.coroutines — concurrencia con corrutinas
- Koin — inyección de dependencias
Conclusión
Kotlin Multiplatform no intenta reemplazar las UIs nativas ni competir directamente con Flutter o React Native. Su apuesta es más quirúrgica: compartir exactamente lo que tiene sentido compartir y dejar que cada plataforma haga lo que mejor sabe hacer. Para equipos con una base en Kotlin y necesidad de mantener consistencia entre plataformas en la capa de datos y dominio, KMP es hoy una opción sólida y lista para producción.
Si quieres empezar, el punto de entrada oficial es kmp.jetbrains.com, donde puedes generar un proyecto base con un asistente interactivo.