Kotlin Multiplatform: ce este, shared module și expect/actual

Autor: IT Sectr Publicat: 2026-02-11 Timp de citire: 11 min

Kotlin Multiplatform (KMP) — tehnologia JetBrains care compilează codul Kotlin comun direct pentru iOS, Android, Web și Desktop. Spre deosebire de Flutter și React Native, KMP nu înlocuiește interfețele native — logica comună este extrasă în shared module, iar interfața fiecărei aplicații rămâne nativă. Kotlin Multiplatform documentation — ghidul principal pentru configurarea modulelor și mecanismul expect/actual.

Principalele puncte

  • KMP — logică comună în Kotlin cu expect/actual pentru API-uri de platformă fără înlocuirea UI-ului nativ
  • Shared module — modul Gradle cu cod pentru cereri de rețea, baze de date, validare și logică de business pentru toate platformele
  • Expect/actual — mecanism de declarare a API-ului de platformă în codul comun cu implementare pentru fiecare țintă
  • iOS integration — shared module se compilează în Apple framework prin Kotlin/Native
  • KMP vs KMM — Kotlin Multiplatform Mobile (focus mobil) face acum parte din Kotlin Multiplatform general

Ce este Kotlin Multiplatform?

Kotlin Multiplatform — tehnologie de cross-compilare care permite scrierea codului comun în Kotlin și compilarea lui pentru diferite platforme: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) și binare native (Linux, Windows). KMP nu este un framework UI — rezolvă problema reutilizării logicii de business, nu a interfețelor.

Arhitectura KMP se bazează pe shared module — un modul Gradle care conține commonMain cu cod independent de platformă și source sets pentru fiecare țintă (androidMain, iosMain, desktopMain). Conform datelor JetBrains din 2025, peste 40% din noile proiecte Kotlin folosesc KMP pentru partajarea codului între platforme.

Kotlin Multiplatform Mobile (KMM) — denumirea anterioară pentru scenariul mobil iOS+Android. De la Kotlin 2.1+, termenul KMM a fost înlocuit cu Kotlin Multiplatform general, deoarece tehnologia a depășit granițele dezvoltării mobile. Netflix, McDonald's și VMware folosesc KMP în producție pentru partajarea codului între aplicațiile mobile.

Mecanismul expect/actual: arhitectură

Expect/actual — mecanismul cheie al KMP pentru lucrul cu codul de platformă. În commonMain se declară o declarație expect (funcție, clasă, proprietate), iar în fiecare source set specific platformei (androidMain, iosMain) — implementarea actual. Compilatorul verifică dacă pentru fiecare expect există un actual în fiecare platformă țintă.

kotlin
// commonMain — declararea API-ului de platformă
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

// androidMain — actual pentru Android
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"

// iosMain — actual pentru iOS
actual fun getPlatformName(): String =
    UIDevice.currentDevice.systemName

Ierarhia source sets în KMP permite crearea de niveluri intermediare: de exemplu, iosArm64Main (dispozitive fizice iOS) și iosSimulatorArm64Main (simulator) cu iosMain comun. Codul din commonMain este accesibil tuturor platformelor, iar codul din iosMain doar țintelor iOS. Aceasta reduce duplicarea atunci când implementarea diferă nu pentru fiecare platformă, ci pentru un grup de platforme.

În practică, expect/actual este folosit pentru: obținerea stocării locale (SharedPreferences vs NSUserDefaults), lucrul cu rețeaua (HttpEngine pentru fiecare platformă), accesul la sistemul de fișiere, criptografie și analitică. JetBrains recomandă minimizarea numărului de expect/actual și mutarea cât mai multor cod în commonMain.

Shared module: structură și Gradle

Shared module — un modul Gradle standard cu pluginul `org.jetbrains.kotlin.multiplatform`. Acesta conține codul comun în `src/commonMain/kotlin/` și implementările de platformă în `src/androidMain/kotlin/` și `src/iosMain/kotlin/`. Proiectul KMP conectează, de asemenea, `androidApp` și `iosApp`, care depind de shared module.

kotlin
// build.gradle.kts — shared module
plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

kotlin {
    androidTarget()
    
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach {
        it.binaries.framework {
            baseName = "shared"
            isStatic = true
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-core:3.1.0")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-okhttp:3.1.0")
            }
        }
        val iosMain by creating {
            dependencies {
                implementation("io.ktor:ktor-client-darwin:3.1.0")
            }
        }
    }
}

Configurația Gradle pentru KMP necesită specificarea explicită a țintelor iOS — x64 (simulator Intel), arm64 (dispozitive fizice) și simulatorArm64 (simulator Apple Silicon). Pentru fiecare țintă este generat un Apple framework separat. Pluginul `kotlin("multiplatform")` configurează automat compilarea pentru JVM și LLVM în funcție de țintele declarate.

Ktor și kotlinx.serialization — bibliotecile standard KMP care suportă codul comun. Ktor oferă un client HTTP cu motoare pentru fiecare platformă (OkHttp pentru Android, Darwin pentru iOS). kotlinx.serialization funcționează pe orice platformă fără expect/actual datorită implementării multi-platformă în commonMain.

Integrare cu iOS prin Kotlin/Native

Kotlin/Native — compilatorul Kotlin în cod nativ prin LLVM. Pentru iOS, shared module se compilează în Apple framework (.framework) care se conectează prin Xcode. Apelarea codului comun din Swift/Objective-C se face prin antetele Objective-C generate, de aceea API-ul shared module trebuie să fie compatibil cu Objective-C.

Limitări ale integrării iOS: Colecțiile Kotlin (List, Map) sunt convertite în NSArray/NSDictionary. Funcțiile cu parametri impliciți nu sunt exportate — sunt necesare overloads. Pentru funcțiile suspend, sunt generate metode bazate pe callback cu `@ObjCName` și suport async/await din Kotlin 2.0+.

swift
// Aplicație iOS: apelarea shared module din Swift
import shared

class ViewModel: ObservableObject {
    let repository = UserRepository()
    
    func loadUsers() {
        repository.fetchUsers(completionHandler: { result, error in
            if let users = result as? [User] {
                print("Users: \(users.count)")
            }
        })
    }
}

Integrarea shared module în Xcode se face prin embed-and-framework — `.xcframework`-ul generat este adăugat în proiectul Xcode. Pluginul Gradle poate actualiza automat framework-ul la compilare prin embedAndSignAppleFrameworkForXcode. Pentru testare pe simulator, este suficient binarul iosSimulatorArm64 sau iosX64.

KMP vs Flutter vs React Native

Alegerea între KMP, Flutter și React Native depinde de prioritate: reutilizarea logicii sau multi-platformă completă. KMP oferă UI nativ pe fiecare platformă, dar necesită două baze de cod pentru interfață. Flutter și React Native folosesc un UI unic, dar sacrifică nativitatea.

CaracteristicăKMPFlutterReact Native
Framework UINativ (Android XML/Jetpack Compose + SwiftUI)Dart + propriul renderer SkiaReact + componente native
Cod comunLogică de business, rețea, baze de date, validare100% cu excepția pluginurilor native100% cu excepția modulelor native
PerformanțăNativă (fără strat intermediar)Ridicată (Skia Engine)Medie (JSI Bridge)
Suport iOSKotlin/Native (excelent)ExcelentBun
Prag de intrareMediu (Kotlin + platforme native)Scăzut (o singură limbă + un UI)Scăzut (JS/TS + React)

Când să alegeți KMP: proiectul necesită un UI de înaltă performanță (jocuri, hărți, animații), codul nativ existent trebuie reutilizat, echipa cunoaște deja Kotlin și platformele native. Când să alegeți Flutter/RN: MVP sau startup cu buget limitat, echipă cu un singur profil, UI nu necesită personalizare nativă profundă.

Instrumente și biblioteci KMP

Ecosistemul instrumentelor KMP include biblioteci pentru toate straturile aplicației: rețea (Ktor), serializare (kotlinx.serialization), baze de date (SQLDelight), navigare (Decompose), DI (Koin) și stocare date (multiplatform-settings). JetBrains susține Compose Multiplatform — un framework UI în Kotlin care funcționează pe toate platformele.

kotlin
// Repository în KMP cu SQLDelight + Ktor
class UserRepository(
    private val httpClient: HttpClient,
    private val db: AppDatabase
) {
    suspend fun syncUsers(): List<User> {
        val remote = httpClient.get("https://api.example.com/users")
            .body<List<UserDto>>()
        
        db.userQueries.replaceAll(remote.map { it.toDomain() })
        
        return db.userQueries.selectAll().executeAsList()
    }
}

Compose Multiplatform — framework UI pentru KMP bazat pe Jetpack Compose. Permite scrierea interfeței în Kotlin pentru Android, iOS, Desktop și Web. În 2025, Compose Multiplatform a atins status stabil pentru Android și Desktop; ținta iOS este în beta. Pentru proiectele de producție cu UI nativ, avantajul KMP rămâne principala diferență față de Flutter.

Întrebări frecvente

Cu ce se deosebește Kotlin Multiplatform de Kotlin Multiplatform Mobile?

KMM — este scenariul mobil al KMP pentru iOS și Android. De la versiunea Kotlin 2.1+, JetBrains a unit ambii termeni în Kotlin Multiplatform, deoarece tehnologia suportă nu doar platformele mobile, ci și Desktop și Web. Proiectele KMM continuă să funcționeze, dar acum fac parte din KMP general.

Se poate folosi KMP cu SwiftUI?

Da. KMP se compilează în Apple framework prin Kotlin/Native cu antete Objective-C. SwiftUI importă acest framework ca o bibliotecă obișnuită. Shared module exportă clasele și funcțiile Kotlin care sunt apelate din Swift cu anumite limitări (de exemplu, colecțiile Kotlin sunt convertite în tipuri Foundation).

Cum se testează shared module pe iOS?

Pe iOS, shared module se testează prin teste Kotlin/Native în source set iosTest. Pentru teste UI se folosește XCTest în Xcode cu framework-ul importat. Testele Kotlin se scriu în commonTest cu kotlin.test și se execută pe simulatorul iOS prin taskul Gradle iosSimulatorArm64Test.

Ce biblioteci sunt disponibile în KMP?

Principalele biblioteci KMP: Ktor (rețea), kotlinx.serialization (JSON), SQLDelight (baze de date), Koin (DI), Decompose (navigare), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (prin KMP-NativeCoroutines). Compose Multiplatform oferă UI pentru toate platformele.

Suportă KMP Gradle 8?

Da. KMP este complet compatibil cu Gradle 8.5+. Începând cu Kotlin 2.1, pluginurile oficiale suportă Gradle 8. Configurarea prin build.gradle.kts cu kotlin("multiplatform") necesită Gradle 7.6+, dar versiunea 8.5 este recomandată pentru performanță optimă de compilare.

Concluzii

  • Kotlin Multiplatform — tehnologie multi-platformă JetBrains pentru cod comun fără înlocuirea UI-ului nativ
  • Expect/actual — mecanism de declarare a API-urilor de platformă în commonMain cu implementări pentru fiecare țintă
  • Shared module — modul Gradle cu commonMain și source sets de platformă (androidMain, iosMain)
  • Kotlin/Native compilează shared module în Apple framework, apelabil din Swift și Objective-C
  • KMP vs Flutter/RN — reutilizarea logicii + UI nativ contra bazei de cod și UI unice
  • Compose Multiplatform — framework UI în Kotlin pentru Android, iOS, Desktop și Web
  • Ecosistem — Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose pentru toate straturile aplicației

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și