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 — главни водич за подешавање модула и expect/actual механизма.

Главне тачке

  • KMP — заједничка логика у Kotlin са expect/actual за платформске API без замене изворног UI
  • Shared module — Gradle модул са кодом мрежних захтева, база података, валидације и пословне логике за све платформе
  • Expect/actual — механизам декларисања платформског 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 — 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 — декларисање платформског 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 — стандардни Gradle модул са прикључком `org.jetbrains.kotlin.multiplatform`. Садржи заједнички код у `src/commonMain/kotlin/` и имплементације платформе у `src/androidMain/kotlin/` и `src/iosMain/kotlin/`. KMP пројекат такође повезује `androidApp` и `iosApp`, који зависе од shared модула.

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. Прикључак `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 заглавља, зато 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 пројекат. 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 рендерReact + изворне компоненте
Заједнички кодПословна логика, мрежа, базе података, валидација100% осим изворних додатака100% осим изворних модула
ПерформансеИзворне (без посредног слоја)Високе (Skia Engine)Средње (JSI Bridge)
iOS подршкаKotlin/Native (одлична)ОдличнаДобра
Улазни прагСредњи (Kotlin + изворне платформе)Низак (један језик + један UI)Низак (JS/TS + React)

Када изабрати KMP: пројекат захтева високо-перформансни UI (игре, мапе, анимације), постојећи изворни код треба поново искористити, тим већ зна Kotlin и изворне платформе. Када изабрати Flutter/RN: MVP или стартап са ограниченим буџетом, тим једног профила, 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 мета је у бета фази. За продукционе пројекте са изворним 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 заглављима. SwiftUI увози овај framework као обичну библиотеку. Shared module извози Kotlin класе и функције које се позивају из Swift са одређеним ограничењима (на пример, Kotlin колекције се претварају у Foundation типове).

Како тестирати shared module на iOS?

На iOS-у shared module се тестира преко Kotlin/Native тестова у iosTest source set-у. За 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 званични прикључци подржавају Gradle 8. Конфигурација преко build.gradle.kts са kotlin("multiplatform") захтева Gradle 7.6+, али се верзија 8.5 препоручује за оптималне перформансе изградње.

Завршни преглед

  • Kotlin Multiplatform — JetBrains вишеплатформска технологија за заједнички код без замене изворног UI
  • Expect/actual — механизам декларисања платформских API у commonMain са имплементацијама за сваку мету
  • Shared module — Gradle модул са commonMain и платформским 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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође