Kotlin Multiplatform: mi ez, shared module és expect/actual

Szerző: IT Sectr Megjelenés: 2026-02-11 Olvasási idő: 11 perc

Kotlin Multiplatform (KMP) — a JetBrains technológiája, amely a közös Kotlin kódot közvetlenül iOS, Android, Web és Desktop platformokra fordítja. A Flutter és React Native rendszerekkel ellentétben a KMP nem helyettesíti a natív UI-kat — a közös logika egy shared modulba kerül, és minden alkalmazás felülete natív marad. Kotlin Multiplatform documentation — a modulok konfigurálásának és az expect/actual mechanizmusnak a fő útmutatója.

Főbb pontok

  • KMP — megosztott logika Kotlinban expect/actual segítségével platform API-khoz a natív UI cseréje nélkül
  • Shared module — Gradle modul hálózati kérelmek, adatbázisok, validáció és üzleti logika kódjával minden platformhoz
  • Expect/actual — platform API deklarálásának mechanizmusa a közös kódban implementációval minden célhoz
  • iOS integration — a shared module Kotlin/Native segítségével Apple framework-ké fordítódik
  • KMP vs KMM — a Kotlin Multiplatform Mobile (mobil fókusz) mostantól az általános Kotlin Multiplatform része

Mi az a Kotlin Multiplatform?

Kotlin Multiplatform — cross-compilációs technológia, amely lehetővé teszi közös kód írását Kotlinban és annak lefordítását különböző platformokra: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) és natív binárisok (Linux, Windows). A KMP nem UI keretrendszer — az üzleti logika újrafelhasználásának problémáját oldja meg, nem az interfészekét.

A KMP architektúrája a shared module köré épül — egy Gradle modul, amely commonMain-t tartalmaz platformfüggetlen kóddal és source set-eket minden célhoz (androidMain, iosMain, desktopMain). A JetBrains 2025-ös adatai szerint az új Kotlin projektek több mint 40%-a használja a KMP-t a kód platformok közötti megosztására.

Kotlin Multiplatform Mobile (KMM) — a mobil iOS+Android forgatókönyv korábbi neve. A Kotlin 2.1+-tól kezdve a KMM kifejezést felváltotta az általános Kotlin Multiplatform, mivel a technológia túllépett a mobil fejlesztés határain. A Netflix, a McDonald's és a VMware éles környezetben használja a KMP-t a kód megosztására mobil alkalmazásaik között.

Expect/actual mechanizmus: architektúra

Expect/actual — a KMP kulcsmechanizmusa a platformkóddal való munkához. A commonMain-ben egy expect-deklaráció (függvény, osztály, tulajdonság) kerül deklarálásra, minden platform-specifikus source set-ben (androidMain, iosMain) pedig az actual-implementáció. A fordító ellenőrzi, hogy minden expect-hez tartozik-e actual minden célplatformon.

kotlin
// commonMain — platform API deklarálása
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

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

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

Source set-ek hierarchiája a KMP-ben lehetővé teszi köztes szintek létrehozását: például iosArm64Main (fizikai iOS eszközök) és iosSimulatorArm64Main (szimulátor) közös iosMain-nel. A commonMain-ből származó kód minden platform számára elérhető, az iosMain-ből származó kód pedig csak iOS célok számára. Ez csökkenti a duplikációt, amikor az implementáció nem minden platformon, hanem platformcsoportonként különbözik.

A gyakorlatban az expect/actual a következőkre használatos: helyi tárolás elérése (SharedPreferences vs NSUserDefaults), hálózati munka (HttpEngine minden platformhoz), fájlrendszerhez való hozzáférés, kriptográfia és analitika. A JetBrains azt javasolja, hogy minimalizáljuk az expect/actual számát és minél több kódot helyezzünk át a commonMain-be.

Shared module: struktúra és Gradle

Shared module — egy szabványos Gradle modul az `org.jetbrains.kotlin.multiplatform` pluginnal. Tartalmazza a közös kódot a `src/commonMain/kotlin/` könyvtárban és a platform implementációkat a `src/androidMain/kotlin/` és `src/iosMain/kotlin/` könyvtárakban. A KMP projekt csatlakoztatja a `androidApp` és `iosApp` modulokat is, amelyek függnek a shared modultól.

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

A Gradle konfigurációja KMP-hez megköveteli az iOS célok explicit megadását — x64 (Intel szimulátor), arm64 (fizikai eszközök) és simulatorArm64 (Apple Silicon szimulátor). Minden célhoz külön Apple framework generálódik. A `kotlin("multiplatform")` plugin automatikusan konfigurálja a fordítást JVM és LLVM alá a deklarált célok függvényében.

Ktor és kotlinx.serialization — a KMP szabványos könyvtárai, amelyek támogatják a közös kódot. A Ktor HTTP klienst biztosít motorokkal minden platformhoz (OkHttp Androidhoz, Darwin iOS-hez). A kotlinx.serialization expect/actual nélkül működik bármely platformon a commonMain-ben lévő multiplatform implementációnak köszönhetően.

Integráció iOS-sel Kotlin/Native segítségével

Kotlin/Native — a Kotlin natív kódra fordítója LLVM segítségével. iOS esetén a shared module Apple framework-ké (.framework) fordítódik, amely Xcode-on keresztül csatlakozik. A közös kód meghívása Swift/Objective-C-ből generált Objective-C headereken keresztül történik, ezért a shared module API-nak kompatibilisnek kell lennie az Objective-C-vel.

Az iOS integráció korlátai: a Kotlin kollekciók (List, Map) NSArray/NSDictionary típusokká konvertálódnak. Az alapértelmezett paraméterekkel rendelkező függvények nem exportálódnak — overloads szükséges. A suspend-függvényekhez callback-alapú metódusok generálódnak `@ObjCName`-nel és async/await támogatással Kotlin 2.0+-tól.

swift
// iOS alkalmazás: shared module hívása Swift-ből
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)")
            }
        })
    }
}

A shared module integrációja Xcode-ban embed-and-framework segítségével történik — a generált `.xcframework` hozzáadásra kerül az Xcode projekthez. A Gradle plugin automatikusan frissítheti a framework-ot build közben az embedAndSignAppleFrameworkForXcode segítségével. Szimulátoron való teszteléshez elegendő az iosSimulatorArm64 vagy iosX64 bináris.

KMP vs Flutter vs React Native

A választás KMP, Flutter és React Native között a prioritástól függ: logika újrafelhasználása vagy teljes többplatformúság. A KMP natív UI-t biztosít minden platformon, de két kódbázist igényel a felülethez. A Flutter és a React Native egységes UI-t használ, de feláldozzák a natívságot.

JellemzőKMPFlutterReact Native
UI keretrendszerNatív (Android XML/Jetpack Compose + SwiftUI)Dart + saját Skia renderelőReact + natív komponensek
Közös kódÜzleti logika, hálózat, adatbázis, validáció100% a natív pluginok kivételével100% a natív modulok kivételével
TeljesítményNatív (nincs köztes réteg)Magas (Skia Engine)Közepes (JSI Bridge)
iOS támogatásKotlin/Native (kiváló)Kiváló
Belépési küszöbKözepes (Kotlin + natív platformok)Alacsony (egy nyelv + egy UI)Alacsony (JS/TS + React)

Mikor válasszuk a KMP-t: a projekt nagy teljesítményű UI-t igényel (játékok, térképek, animációk), a meglévő natív kódot újra kell használni, a csapat már ismeri a Kotlin-t és a natív platformokat. Mikor válasszuk a Flutter/RN-t: MVP vagy startup korlátozott költségvetéssel, egységes profilú csapat, a UI nem igényel mély natív testreszabást.

KMP eszközök és könyvtárak

A KMP eszközök ökoszisztémája könyvtárakat tartalmaz az alkalmazás minden rétegéhez: hálózat (Ktor), szerializáció (kotlinx.serialization), adatbázis (SQLDelight), navigáció (Decompose), DI (Koin) és adattárolás (multiplatform-settings). A JetBrains támogatja a Compose Multiplatform-ot — egy Kotlin UI keretrendszert, amely minden platformon működik.

kotlin
// Repository KMP-ben SQLDelight + Ktor segítségével
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 — a Jetpack Compose-on alapuló UI keretrendszer KMP-hez. Lehetővé teszi a felület írását Kotlinban Android, iOS, Desktop és Web platformokra. 2025-ben a Compose Multiplatform stabil státuszt ért el Android és Desktop esetén; az iOS cél béta állapotban van. A natív UI-val rendelkező éles projektek esetében a KMP előnye továbbra is a fő különbség a Flutter-hez képest.

Gyakran Ismételt Kérdések

Miben különbözik a Kotlin Multiplatform a Kotlin Multiplatform Mobile-tól?

KMM — a KMP mobil forgatókönyve iOS és Android rendszerekhez. A Kotlin 2.1+ verziójától kezdve a JetBrains egyesítette a két kifejezést Kotlin Multiplatform néven, mivel a technológia nem csak mobil platformokat, hanem Desktop és Web rendszereket is támogat. A KMM projektek továbbra is működnek, de most az általános KMP részét képezik.

Használható-e a KMP SwiftUI-val?

Igen. KMP Apple framework-ké fordul Kotlin/Native segítségével Objective-C headerekkel. A SwiftUI ezt a framework-ot szokásos könyvtárként importálja. A shared module exportálja a Kotlin osztályokat és függvényeket, amelyek Swift-ből hívhatók bizonyos korlátozásokkal (például a Kotlin kollekciók Foundation típusokká konvertálódnak).

Hogyan teszteljük a shared modult iOS-en?

iOS-en a shared module Kotlin/Native tesztekkel tesztelhető a iosTest source set-ben. UI tesztekhez XCTest használatos Xcode-ban az importált framework-kel. A Kotlin tesztek commonTest-ben íródnak kotlin.test segítségével és az iOS szimulátoron futnak a iosSimulatorArm64Test Gradle feladaton keresztül.

Milyen könyvtárak érhetők el a KMP-ben?

KMP könyvtárak: Ktor (hálózat), kotlinx.serialization (JSON), SQLDelight (adatbázis), Koin (DI), Decompose (navigáció), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (KMP-NativeCoroutines segítségével). A Compose Multiplatform UI-t biztosít minden platformhoz.

Támogatja-e a KMP a Gradle 8-at?

Igen. KMP teljes mértékben kompatibilis a Gradle 8.5+-szal. A Kotlin 2.1-től kezdve a hivatalos pluginek támogatják a Gradle 8-at. A konfiguráció build.gradle.kts segítségével kotlin("multiplatform")-szal Gradle 7.6+-t igényel, de a 8.5-ös verzió ajánlott az optimális build teljesítmény érdekében.

Összefoglalás

  • Kotlin Multiplatform — a JetBrains többplatformos technológiája közös kódhoz a natív UI cseréje nélkül
  • Expect/actual — platform API-k deklarálásának mechanizmusa commonMain-ben implementációkkal minden célhoz
  • Shared module — Gradle modul commonMain-nel és platform source set-ekkel (androidMain, iosMain)
  • Kotlin/Native a shared modult Apple framework-ké fordítja, amely Swift-ből és Objective-C-ből hívható
  • KMP vs Flutter/RN — logika újrafelhasználása + natív UI szemben az egységes kódbázissal és UI-val
  • Compose Multiplatform — UI keretrendszer Kotlinban Android, iOS, Desktop és Web rendszerekhez
  • Ökoszisztéma — Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose az alkalmazás minden rétegéhez

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is