Kotlin Multiplatform: bu nədir, shared module və expect/actual

Müəllif: IT Sectr Dərc olunub: 2026-02-11 Oxuma vaxtı: 11 dəq

Kotlin Multiplatform (KMP) — JetBrains texnologiyası, ümumi Kotlin kodunu birbaşa iOS, Android, Web və Desktop üçün kompilyasiya edir. Flutter və React Native-dən fərqli olaraq, KMP yerli UI-ləri əvəz etmir — ümumi məntiq shared module-ə çıxarılır və hər tətbiqin interfeysi yerli olaraq qalır. Kotlin Multiplatform documentation — modulların qurulması və expect/actual mexanizmi üzrə əsas məlumat mənbəyidir.

Əsas məqamlar

  • KMP — platforma API-ləri üçün expect/actual ilə Kotlin-də ümumi məntiq, yerli UI-i əvəz etmədən
  • Shared module — bütün platformalar üçün şəbəkə sorğuları, verilənlər bazası, validasiya və biznes məntiqi kodu olan Gradle modulu
  • Expect/actual — hər hədəf üçün tətbiq ilə ümumi kodda platforma API-ni bəyan etmə mexanizmi
  • iOS integration — shared module Kotlin/Native vasitəsilə Apple framework-ə kompilyasiya olunur
  • KMP vs KMM — Kotlin Multiplatform Mobile (mobil fokus) indi ümumi Kotlin Multiplatform-un bir hissəsidir

Kotlin Multiplatform nədir?

Kotlin Multiplatform — ümumi kodu Kotlin-də yazmağa və müxtəlif platformalar üçün kompilyasiya etməyə imkan verən çarpaz kompilyasiya texnologiyası: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) və yerli binary fayllar (Linux, Windows). KMP UI freymvorku deyil — o, interfeysləri deyil, biznes məntiqinin təkrar istifadəsi problemini həll edir.

KMP arxitekturası shared module — platformadan asılı olmayan kodu olan commonMain və hər hədəf üçün source sets (androidMain, iosMain, desktopMain) ehtiva edən Gradle modulu ətrafında qurulur. JetBrains-in 2025-ci il məlumatlarına görə, yeni Kotlin layihələrinin 40%-dən çoxu platformalar arasında kod paylaşmaq üçün KMP-dən istifadə edir.

Kotlin Multiplatform Mobile (KMM) — iOS+Android mobil ssenarisi üçün əvvəlki ad. Kotlin 2.1+-dan etibarən KMM termini ümumi Kotlin Multiplatform ilə əvəz olunub, çünki texnologiya mobil inkişaf hüdudlarından çıxıb. Netflix, McDonald's və VMware mobil tətbiqlər arasında kod paylaşmaq üçün KMP-dən istehsalatda istifadə edir.

Expect/actual mexanizmi: arxitektura

Expect/actual — platforma kodu ilə iş üçün KMP-nin əsas mexanizmi. commonMain-də expect-bəyannamə (funksiya, sinif, property) elan edilir, hər platform-specific source set-də (androidMain, iosMain) isə actual-tətbiq. Kompilyator hər expect üçün hər hədəf platformada actual-ın mövcud olduğunu yoxlayır.

kotlin
// commonMain — platforma API-nin bəyannaməsi
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

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

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

Source sets iyerarxiyası KMP-də aralıq səviyyələr yaratmağa imkan verir: məsələn, iosArm64Main (fiziki iOS cihazları) və iosSimulatorArm64Main (simulyator) ümumi iosMain ilə. commonMain-dən gələn kod bütün platformalar üçün əlçatandır, iosMain-dən gələn kod isə yalnız iOS hədəfləri üçün. Bu, tətbiq hər platforma üçün deyil, platformalar qrupu üçün fərqli olduqda təkrarlanmanı azaldır.

Təcrübədə expect/actual aşağıdakılar üçün istifadə olunur: yerli yaddaş əldə etmək (SharedPreferences vs NSUserDefaults), şəbəkə ilə iş (hər platforma üçün HttpEngine), fayl sisteminə giriş, kriptoqrafiya və analitika. JetBrains expect/actual sayını minimuma endirməyi və mümkün qədər çox kodu commonMain-ə çıxarmağı tövsiyə edir.

Shared module: struktura və Gradle

Shared module — `org.jetbrains.kotlin.multiplatform` plugin-i ilə standart Gradle modulu. O, ümumi kodu `src/commonMain/kotlin/`-də və platforma tətbiqlərini `src/androidMain/kotlin/` və `src/iosMain/kotlin/`-də ehtiva edir. KMP layihəsi həmçinin shared modulundan asılı olan `androidApp` və `iosApp`-i birləşdirir.

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

KMP üçün Gradle konfiqurasiyası iOS hədəflərinin — x64 (Intel simulyatoru), arm64 (fiziki cihazlar) və simulatorArm64 (Apple Silicon simulyatoru) açıq şəkildə göstərilməsini tələb edir. Hər hədəf üçün ayrıca Apple framework yaradılır. `kotlin("multiplatform")` plugin-i elan edilmiş hədəflərdən asılı olaraq avtomatik olaraq JVM və LLVM altında kompilyasiyanı konfiqurasiya edir.

Ktorkotlinx.serialization — ümumi kodu dəstəkləyən standart KMP kitabxanaları. Ktor hər platforma üçün mühərriklərlə (Android üçün OkHttp, iOS üçün Darwin) HTTP klienti təmin edir. kotlinx.serialization commonMain-də çoxplatformalı tətbiq sayəsində expect/actual olmadan istənilən platformada işləyir.

iOS ilə Kotlin/Native vasitəsilə inteqrasiya

Kotlin/Native — LLVM vasitəsilə Kotlin-i yerli koda kompilyasiya edən kompilyator. iOS üçün shared module Apple framework (.framework) şəklində kompilyasiya olunur və Xcode vasitəsilə birləşdirilir. Swift/Objective-C-dən ümumi kodun çağırılması yaradılmış Objective-C başlıqları vasitəsilə baş verir, buna görə də shared module API-si Objective-C ilə uyğun olmalıdır.

iOS inteqrasiyasının məhdudiyyətləri: Kotlin kolleksiyaları (List, Map) NSArray/NSDictionary-ə çevrilir. Standart parametrləri olan funksiyalar ixrac olunmur — overloads lazımdır. Suspend-funksiyalar üçün `@ObjCName` ilə callback-əsaslı metodlar və Kotlin 2.0+-dan async/await dəstəyi yaradılır.

swift
// iOS tətbiqi: shared module-un Swift-dən çağırılması
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-un Xcode-da inteqrasiyası embed-and-framework vasitəsilə baş verir — yaradılmış `.xcframework` Xcode layihəsinə əlavə olunur. Gradle plugin-i embedAndSignAppleFrameworkForXcode vasitəsilə yığma zamanı framework-u avtomatik yeniləyə bilər. Simulyatorda sınamaq üçün iosSimulatorArm64 və ya iosX64 binary faylı kifayətdir.

KMP vs Flutter vs React Native

KMP, Flutter və React Native arasında seçim prioritetdən asılıdır: məntiqin təkrar istifadəsi və ya tam çoxplatformalılıq. KMP hər platformada yerli UI təmin edir, lakin interfeys üçün iki kod bazası tələb edir. Flutter və React Native vahid UI-dən istifadə edir, lakin yerlilikdən itirir.

XüsusiyyətKMPFlutterReact Native
UI freymvorkuYerli (Android XML/Jetpack Compose + SwiftUI)Dart + öz Skia rendereriReact + yerli komponentlər
Ümumi kodBiznes məntiqi, şəbəkə, verilənlər bazası, validasiyaYerli pluginlər istisna olmaqla 100%Yerli modullar istisna olmaqla 100%
PerformansYerli (aralıq təbəqə yoxdur)Yüksək (Skia Engine)Orta (JSI Bridge)
iOS dəstəyiKotlin/Native (əla)ƏlaYaxşı
Giriş həddiOrta (Kotlin + yerli platformalar)Aşağı (bir dil + bir UI)Aşağı (JS/TS + React)

KMP nə vaxt seçilməlidir: layihə yüksək performanslı UI tələb edir (oyunlar, xəritələr, animasiyalar), mövcud yerli kodu təkrar istifadə etmək lazımdır, komanda artıq Kotlin və yerli platformaları bilir. Flutter/RN nə vaxt seçilməlidir: məhdud büdcəli MVP və ya startup, bir profilli komanda, UI dərin yerli fərdiləşdirmə tələb etmir.

KMP alətləri və kitabxanaları

KMP alətləri ekosisteminə tətbiqin bütün təbəqələri üçün kitabxanalar daxildir: şəbəkə (Ktor), serializasiya (kotlinx.serialization), verilənlər bazası (SQLDelight), naviqasiya (Decompose), DI (Koin) və məlumat saxlanması (multiplatform-settings). JetBrains bütün platformalarda işləyən Kotlin-də UI freymvorku olan Compose Multiplatform-u dəstəkləyir.

kotlin
// SQLDelight + Ktor ilə KMP-də Repository
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 — Jetpack Compose-ə əsaslanan KMP üçün UI freymvorku. Android, iOS, Desktop və Web üçün Kotlin-də interfeys yazmağa imkan verir. 2025-ci ildə Compose Multiplatform Android və Desktop üçün stabilliyə çatdı; iOS hədəfi beta mərhələsindədir. Yerli UI ilə istehsalat layihələri üçün KMP-nin üstünlüyü Flutter-dan əsas fərq olaraq qalır.

Tez-tez verilən suallar

Kotlin Multiplatform Kotlin Multiplatform Mobile-dan nə ilə fərqlənir?

KMM — iOS və Android üçün KMP-nin mobil ssenarisidir. Kotlin 2.1+ versiyasından etibarən JetBrains hər iki termini Kotlin Multiplatform-da birləşdirdi, çünki texnologiya təkcə mobil platformaları deyil, həm də Desktop və Web-i dəstəkləyir. KMM layihələri işləməyə davam edir, lakin indi bu ümumi KMP-nin bir hissəsidir.

KMP-ni SwiftUI ilə istifadə etmək olarmı?

Bəli. KMP Objective-C başlıqları ilə Kotlin/Native vasitəsilə Apple framework-ə kompilyasiya olunur. SwiftUI bu framework-u adi kitabxana kimi idxal edir. Shared module Swift-dən müəyyən məhdudiyyətlərlə çağırılan Kotlin siniflərini və funksiyalarını ixrac edir (məsələn, Kotlin kolleksiyaları Foundation tiplərinə çevrilir).

Shared module-u iOS-da necə test etmək olar?

iOS-da shared module iosTest source set-də Kotlin/Native testləri vasitəsilə test edilir. UI testləri üçün idxal edilmiş framework ilə Xcode-da XCTest istifadə olunur. Kotlin testləri commonTest-də kotlin.test ilə yazılır və iosSimulatorArm64Test Gradle tapşırığı vasitəsilə iOS simulyatorunda icra olunur.

KMP-də hansı kitabxanalar mövcuddur?

Əsas KMP kitabxanaları: Ktor (şəbəkə), kotlinx.serialization (JSON), SQLDelight (verilənlər bazası), Koin (DI), Decompose (naviqasiya), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (KMP-NativeCoroutines vasitəsilə). Compose Multiplatform bütün platformalar üçün UI təmin edir.

KMP Gradle 8-i dəstəkləyirmi?

Bəli. KMP Gradle 8.5+ ilə tam uyğundur. Kotlin 2.1-dən başlayaraq rəsmi pluginlər Gradle 8-i dəstəkləyir. build.gradle.kts vasitəsilə kotlin("multiplatform") ilə konfiqurasiya Gradle 7.6+ tələb edir, lakin optimal yığma performansı üçün 8.5 versiyası tövsiyə olunur.

Nəticə

  • Kotlin Multiplatform — yerli UI-i əvəz etmədən ümumi kod üçün JetBrains-in çoxplatformalı texnologiyası
  • Expect/actual — hər hədəf üçün tətbiqlərlə commonMain-də platforma API-lərini bəyan etmə mexanizmi
  • Shared module — commonMain və platforma source sets (androidMain, iosMain) ilə Gradle modulu
  • Kotlin/Native shared module-u Swift və Objective-C-dən çağırılan Apple framework-ə kompilyasiya edir
  • KMP vs Flutter/RN — vahid kod bazası və UI-ə qarşı məntiqin təkrar istifadəsi + yerli UI
  • Compose Multiplatform — Android, iOS, Desktop və Web üçün Kotlin-də UI freymvorku
  • Ekosistem — tətbiqin bütün təbəqələri üçün Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun