Kotlin Multiplatform: τι είναι, shared module και expect/actual

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-11 Χρόνος ανάγνωσης: 11 λεπ

Kotlin Multiplatform (KMP) — τεχνολογία της JetBrains που μεταγλωττίζει κοινό κώδικα Kotlin απευθείας για iOS, Android, Web και Desktop. Σε αντίθεση με τα Flutter και React Native, το KMP δεν αντικαθιστά τα εγγενή UI — η κοινή λογική μεταφέρεται στο shared module, και η διεπαφή κάθε εφαρμογής παραμένει εγγενής. Kotlin Multiplatform documentation — ο κύριος οδηγός για τη ρύθμιση των modules και του μηχανισμού expect/actual.

Βασικά σημεία

  • KMP — κοινή λογική σε Kotlin με expect/actual για platform API χωρίς αντικατάσταση του εγγενούς UI
  • Shared module — module Gradle με κώδικα δικτυακών αιτημάτων, βάσεων δεδομένων, επικύρωσης και επιχειρηματικής λογικής για όλες τις πλατφόρμες
  • Expect/actual — μηχανισμός δήλωσης platform API σε κοινό κώδικα με υλοποίηση για κάθε στόχο
  • iOS integration — το shared module μεταγλωττίζεται σε Apple framework μέσω Kotlin/Native
  • KMP vs KMM — το Kotlin Multiplatform Mobile (κινητή εστίαση) είναι πλέον μέρος του γενικού Kotlin Multiplatform

Τι είναι το Kotlin Multiplatform;

Kotlin Multiplatform — τεχνολογία διασταυρούμενης μεταγλώττισης που επιτρέπει τη σύνταξη κοινού κώδικα σε Kotlin και τη μεταγλώττισή του για διαφορετικές πλατφόρμες: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) και εγγενή δυαδικά αρχεία (Linux, Windows). Το KMP δεν είναι πλαίσιο UI — λύνει το πρόβλημα επαναχρησιμοποίησης επιχειρηματικής λογικής, όχι διεπαφών.

Η αρχιτεκτονική του KMP χτίζεται γύρω από το shared module — ένα module Gradle που περιέχει commonMain με κώδικα ανεξάρτητο πλατφόρμας και source sets για κάθε στόχο (androidMain, iosMain, desktopMain). Σύμφωνα με δεδομένα της JetBrains για το 2025, πάνω από το 40% των νέων έργων Kotlin χρησιμοποιούν KMP για κοινή χρήση κώδικα μεταξύ πλατφορμών.

Kotlin Multiplatform Mobile (KMM) — η προηγούμενη ονομασία για το κινητό σενάριο iOS+Android. Από το Kotlin 2.1+, ο όρος KMM αντικαταστάθηκε από το γενικό Kotlin Multiplatform, καθώς η τεχνολογία ξεπέρασε τα όρια της κινητής ανάπτυξης. Οι Netflix, McDonald's και VMware χρησιμοποιούν KMP σε παραγωγή για κοινή χρήση κώδικα μεταξύ κινητών εφαρμογών.

Μηχανισμός expect/actual: αρχιτεκτονική

Expect/actual — ο βασικός μηχανισμός του KMP για εργασία με κώδικα πλατφόρμας. Στο commonMain δηλώνεται μια δήλωση expect (συνάρτηση, κλάση, ιδιότητα), και σε κάθε source set ειδικό για πλατφόρμα (androidMain, iosMain) — η υλοποίηση actual. Ο μεταγλωττιστής ελέγχει ότι για κάθε expect υπάρχει actual σε κάθε πλατφόρμα-στόχο.

kotlin
// commonMain — δήλωση platform API
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

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

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

Ιεραρχία source sets στο KMP επιτρέπει τη δημιουργία ενδιάμεσων επιπέδων: για παράδειγμα, iosArm64Main (φυσικές συσκευές iOS) και iosSimulatorArm64Main (προσομοιωτής) με κοινό iosMain. Ο κώδικας από το commonMain είναι προσβάσιμος σε όλες τις πλατφόρμες, και ο κώδικας από το iosMain μόνο σε στόχους iOS. Αυτό μειώνει την αντιγραφή όταν η υλοποίηση διαφέρει όχι για κάθε πλατφόρμα, αλλά για μια ομάδα πλατφορμών.

Στην πράξη, το expect/actual χρησιμοποιείται για: λήψη τοπικής αποθήκευσης (SharedPreferences vs NSUserDefaults), εργασία με δίκτυο (HttpEngine για κάθε πλατφόρμα), πρόσβαση σε σύστημα αρχείων, κρυπτογραφία και αναλυτική. Η JetBrains συνιστά την ελαχιστοποίηση του αριθμού expect/actual και τη μεταφορά όσο το δυνατόν περισσότερου κώδικα στο commonMain.

Shared module: δομή και Gradle

Shared module — ένα τυπικό module Gradle με το plugin `org.jetbrains.kotlin.multiplatform`. Περιέχει κοινό κώδικα στο `src/commonMain/kotlin/` και υλοποιήσεις πλατφόρμας στο `src/androidMain/kotlin/` και `src/iosMain/kotlin/`. Το έργο KMP συνδέει επίσης τα `androidApp` και `iosApp`, που εξαρτώνται από το 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")
            }
        }
    }
}

Η διαμόρφωση του Gradle για KMP απαιτεί ρητό καθορισμό των στόχων iOS — x64 (προσομοιωτής Intel), arm64 (φυσικές συσκευές) και simulatorArm64 (προσομοιωτής Apple Silicon). Για κάθε στόχο δημιουργείται ξεχωριστό Apple framework. Το plugin `kotlin("multiplatform")` διαμορφώνει αυτόματα τη μεταγλώττιση για JVM και LLVM ανάλογα με τους δηλωμένους στόχους.

Ktor και kotlinx.serialization — οι τυπικές βιβλιοθήκες KMP που υποστηρίζουν κοινό κώδικα. Το Ktor παρέχει HTTP πελάτη με μηχανές για κάθε πλατφόρμα (OkHttp για Android, Darwin για iOS). Η kotlinx.serialization λειτουργεί σε οποιαδήποτε πλατφόρμα χωρίς expect/actual χάρη στην πολυπλατφορμική υλοποίηση στο commonMain.

Ενσωμάτωση με iOS μέσω Kotlin/Native

Kotlin/Native — ο μεταγλωττιστής Kotlin σε εγγενή κώδικα μέσω LLVM. Για iOS, το shared module μεταγλωττίζεται σε Apple framework (.framework) που συνδέεται μέσω Xcode. Η κλήση κοινού κώδικα από Swift/Objective-C γίνεται μέσω παραγόμενων Objective-C headers, επομένως το API του shared module πρέπει να είναι συμβατό με Objective-C.

Περιορισμοί ενσωμάτωσης iOS: Οι συλλογές Kotlin (List, Map) μετατρέπονται σε NSArray/NSDictionary. Οι συναρτήσεις με προεπιλεγμένες παραμέτρους δεν εξάγονται — χρειάζονται overloads. Για τις συναρτήσεις suspend, δημιουργούνται μέθοδοι βασισμένες σε callback με `@ObjCName` και υποστήριξη async/await από Kotlin 2.0+.

swift
// Εφαρμογή iOS: κλήση shared module από 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)")
            }
        })
    }
}

Η ενσωμάτωση του shared module στο Xcode γίνεται μέσω embed-and-framework — το παραγόμενο `.xcframework` προστίθεται στο έργο Xcode. Το plugin Gradle μπορεί να ενημερώνει αυτόματα το framework κατά τη δημιουργία μέσω embedAndSignAppleFrameworkForXcode. Για δοκιμή στον προσομοιωτή, αρκεί το δυαδικό iosSimulatorArm64 ή iosX64.

KMP vs Flutter vs React Native

Η επιλογή μεταξύ KMP, Flutter και React Native εξαρτάται από την προτεραιότητα: επαναχρησιμοποίηση λογικής ή πλήρης πολυπλατφορμικότητα. Το KMP παρέχει εγγενές UI σε κάθε πλατφόρμα, αλλά απαιτεί δύο βάσεις κώδικα για τη διεπαφή. Τα Flutter και React Native χρησιμοποιούν ενιαίο UI, αλλά θυσιάζουν την εγγένεια.

ΧαρακτηριστικόKMPFlutterReact Native
Πλαίσιο UIΕγγενές (Android XML/Jetpack Compose + SwiftUI)Dart + δικός του Skia rendererReact + εγγενή components
Κοινός κώδικαςΕπιχειρηματική λογική, δίκτυο, βάση δεδομένων, επικύρωση100% εκτός από εγγενή plugins100% εκτός από εγγενή modules
ΑπόδοσηΕγγενής (χωρίς ενδιάμεσο στρώμα)Υψηλή (Skia Engine)Μεσαία (JSI Bridge)
Υποστήριξη iOSKotlin/Native (εξαιρετική)ΕξαιρετικήΚαλή
Κατώφλι εισόδουΜεσαίο (Kotlin + εγγενείς πλατφόρμες)Χαμηλό (μία γλώσσα + ένα UI)Χαμηλό (JS/TS + React)

Πότε να επιλέξετε KMP: το έργο απαιτεί UI υψηλής απόδοσης (παιχνίδια, χάρτες, κινούμενα σχέδια), ο υπάρχων εγγενής κώδικας πρέπει να επαναχρησιμοποιηθεί, η ομάδα γνωρίζει ήδη Kotlin και εγγενείς πλατφόρμες. Πότε να επιλέξετε Flutter/RN: MVP ή startup με περιορισμένο προϋπολογισμό, ομάδα ενός προφίλ, το UI δεν απαιτεί βαθιά εγγενή προσαρμογή.

Εργαλεία και βιβλιοθήκες KMP

Το οικοσύστημα εργαλείων KMP περιλαμβάνει βιβλιοθήκες για όλα τα επίπεδα της εφαρμογής: δίκτυο (Ktor), σειριοποίηση (kotlinx.serialization), βάση δεδομένων (SQLDelight), πλοήγηση (Decompose), DI (Koin) και αποθήκευση δεδομένων (multiplatform-settings). Η JetBrains υποστηρίζει το Compose Multiplatform — ένα πλαίσιο UI σε Kotlin που λειτουργεί σε όλες τις πλατφόρμες.

kotlin
// Repository σε KMP με 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 — πλαίσιο UI για KMP βασισμένο στο Jetpack Compose. Επιτρέπει τη σύνταξη διεπαφής σε Kotlin για Android, iOS, Desktop και Web. Το 2025, το Compose Multiplatform έφτασε σε σταθερή κατάσταση για Android και Desktop· ο στόχος iOS είναι σε beta. Για έργα παραγωγής με εγγενές UI, το πλεονέκτημα του KMP παραμένει η κύρια διαφορά από το Flutter.

Συχνές Ερωτήσεις

Σε τι διαφέρει το Kotlin Multiplatform από το Kotlin Multiplatform Mobile;

KMM — είναι το κινητό σενάριο του KMP για iOS και Android. Από την έκδοση Kotlin 2.1+, η JetBrains συνένωσε και τους δύο όρους στο Kotlin Multiplatform, καθώς η τεχνολογία υποστηρίζει όχι μόνο κινητές πλατφόρμες, αλλά και Desktop και Web. Τα έργα KMM συνεχίζουν να λειτουργούν, αλλά τώρα αποτελούν μέρος του γενικού KMP.

Μπορεί να χρησιμοποιηθεί το KMP με SwiftUI;

Ναι. KMP μεταγλωττίζεται σε Apple framework μέσω Kotlin/Native με Objective-C headers. Το SwiftUI εισάγει αυτό το framework ως συνηθισμένη βιβλιοθήκη. Το shared module εξάγει κλάσεις και συναρτήσεις Kotlin που καλούνται από Swift με ορισμένους περιορισμούς (για παράδειγμα, οι συλλογές Kotlin μετατρέπονται σε τύπους Foundation).

Πώς γίνεται δοκιμή του shared module σε iOS;

Στο iOS, το shared module δοκιμάζεται μέσω δοκιμών Kotlin/Native στο source set iosTest. Για δοκιμές UI χρησιμοποιείται XCTest στο Xcode με το εισαγόμενο framework. Οι δοκιμές Kotlin γράφονται σε commonTest με kotlin.test και εκτελούνται στον προσομοιωτή iOS μέσω της Gradle εργασίας iosSimulatorArm64Test.

Ποιες βιβλιοθήκες είναι διαθέσιμες στο KMP;

Κύριες βιβλιοθήκες KMP: Ktor (δίκτυο), kotlinx.serialization (JSON), SQLDelight (βάση δεδομένων), Koin (DI), Decompose (πλοήγηση), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (μέσω KMP-NativeCoroutines). Το Compose Multiplatform παρέχει UI για όλες τις πλατφόρμες.

Υποστηρίζει το KMP το Gradle 8;

Ναι. KMP είναι πλήρως συμβατό με Gradle 8.5+. Από το Kotlin 2.1, τα επίσημα plugins υποστηρίζουν Gradle 8. Η διαμόρφωση μέσω build.gradle.kts με kotlin("multiplatform") απαιτεί Gradle 7.6+, αλλά η έκδοση 8.5 συνιστάται για βέλτιστη απόδοση δημιουργίας.

Σύνοψη

  • Kotlin Multiplatform — πολυπλατφορμική τεχνολογία JetBrains για κοινό κώδικα χωρίς αντικατάσταση του εγγενούς UI
  • Expect/actual — μηχανισμός δήλωσης platform API σε commonMain με υλοποιήσεις για κάθε στόχο
  • Shared module — module Gradle με commonMain και platform source sets (androidMain, iosMain)
  • Kotlin/Native μεταγλωττίζει το shared module σε Apple framework, καλούμενο από Swift και Objective-C
  • KMP vs Flutter/RN — επαναχρησιμοποίηση λογικής + εγγενές UI έναντι ενιαίας βάσης κώδικα και UI
  • Compose Multiplatform — πλαίσιο UI σε Kotlin για Android, iOS, Desktop και Web
  • Οικοσύστημα — Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose για όλα τα επίπεδα της εφαρμογής

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης