Kotlin Multiplatform (KMP) — JetBrains технологија која компајлира заједнички Kotlin код директно за iOS, Android, Web и Desktop. За разлику од Flutter и React Native, KMP не замењује изворне UI — заједничка логика се извлачи у shared module, а интерфејс сваке апликације остаје изворан. Kotlin Multiplatform documentation — главни водич за подешавање модула и expect/actual механизма.
Главне тачке
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 — кључни механизам KMP за рад са платформским кодом. У commonMain се декларише expect-декларација (функција, класа, својство), а у сваком source set-у специфичном за платформу (androidMain, iosMain) — actual-имплементација. Компајлер проверава да ли за сваки expect постоји actual на свакој циљној платформи.
// 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 модул са прикључком `org.jetbrains.kotlin.multiplatform`. Садржи заједнички код у `src/commonMain/kotlin/` и имплементације платформе у `src/androidMain/kotlin/` и `src/iosMain/kotlin/`. KMP пројекат такође повезује `androidApp` и `iosApp`, који зависе од shared модула.
// 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.
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+.
// 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, Flutter и React Native зависи од приоритета: поновна употреба логике или потпуна вишеплатформност. KMP пружа изворни UI на свакој платформи, али захтева две базе кода за интерфејс. Flutter и React Native користе јединствени UI, али жртвују изворност.
| Карактеристика | KMP | Flutter | React 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 алата укључује библиотеке за све слојеве апликације: мрежа (Ktor), серијализација (kotlinx.serialization), базе података (SQLDelight), навигација (Decompose), DI (Koin) и складиштење података (multiplatform-settings). JetBrains подржава Compose Multiplatform — UI фрејмворк у 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.
Често постављана питања
KMM — то је мобилни сценарио KMP за iOS и Android. Од верзије Kotlin 2.1+ JetBrains је објединила оба термина у Kotlin Multiplatform, јер технологија подржава не само мобилне платформе, већ и Desktop и Web. KMM пројекти настављају да раде, али су сада део општег KMP.
Да. KMP се компајлира у Apple framework преко Kotlin/Native са Objective-C заглављима. SwiftUI увози овај framework као обичну библиотеку. Shared module извози Kotlin класе и функције које се позивају из Swift са одређеним ограничењима (на пример, Kotlin колекције се претварају у Foundation типове).
На iOS-у shared module се тестира преко Kotlin/Native тестова у iosTest source set-у. За UI тестове користи се XCTest у Xcode са увезеним framework-ом. Kotlin тестови се пишу у commonTest са kotlin.test и извршавају на iOS симулатору преко Gradle задатка iosSimulatorArm64Test.
Главне KMP библиотеке: Ktor (мрежа), kotlinx.serialization (JSON), SQLDelight (базе података), Koin (DI), Decompose (навигација), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (преко KMP-NativeCoroutines). Compose Multiplatform пружа UI за све платформе.
Да. KMP је потпуно компатибилан са Gradle 8.5+. Од Kotlin 2.1 званични прикључци подржавају Gradle 8. Конфигурација преко build.gradle.kts са kotlin("multiplatform") захтева Gradle 7.6+, али се верзија 8.5 препоручује за оптималне перформансе изградње.
Завршни преглед
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође