Kotlin Multiplatform Mobile (KMM) — технологија од JetBrains-а за коришћење заједничког кода у Kotlin-у у апликацијама за iOS и Android уз очување изворног корисничког интерфејса на свакој платформи. За разлику од хибридних оквира, KMM не користи WebView и не рендерује интерфејс кроз апстракције — пословна логика се пише једном, а кориснички интерфејс остаје потпуно изворан. Према подацима JetBrains, 2025, KMM користи преко 40 хиљада тимова широм света. expect/actual — кључни механизам Kotlin-а који омогућава декларисање платформски зависних API-ја у заједничком коду.
Главно
Kotlin Multiplatform Mobile (KMM) — технологија која омогућава писање заједничке пословне логике мобилне апликације у Kotlin-у и њено коришћење на iOS и Android без дуплирања кода. За разлику од Ionic или Cordova, KMM не рендерује интерфејс у WebView-у — UI остаје потпуно изворан и пише се у SwiftUI (iOS) и Jetpack Compose (Android).
KMM је најавио JetBrains 2019. године као део стратегије Kotlin Multiplatform. Кључна разлика у односу на друга вишеплатформска решења — оквир не покушава да унификује UI, већ се фокусира на дељење управо оног кода који је заиста исти за обе платформе: мрежних захтева, модела података, валидације форми, пословних правила и рада са базама података.
Према JetBrains Developer Survey (2025), KMM користи 14% мобилних програмера, а овај показатељ расте за 5% годишње. Технологију бирају компаније са високим захтевима за перформансама и изворним корисничким искуством, за које хибридна решења нису прихватљива.
Архитектура KMM се састоји од три модула: shared (заједнички код у Kotlin-у), iosApp (изворна iOS апликација у Swift-у) и androidApp (изворна Android апликација у Kotlin-у). Shared модул се компајлира у JAR за Android и у универзални оквир (Apple Framework) за iOS.
У shared модул улазе сви слојеви независни од платформе: мрежни слој на Ktor Client-у, модели података са серијализацијом кроз kotlinx.serialization, репозиторијуми за управљање подацима, валидација форми и пословна правила (на пример, израчунавање цене доставе или провера права приступа).
Shared модул користи Gradle Multiplatform Plugin и садржи три скупа изворног кода: commonMain (заједнички код), androidMain (имплементације специфичне за Android) и iosMain (имплементације специфичне за iOS). Компајлер Kotlin/Native претвара заједнички код у изворну библиотеку за iOS, која се повезује са Swift пројектом путем XCFramework-а.
Android модул — стандардна Android апликација у Kotlin-у са Jetpack Compose или ViewBinding-ом. Shared модул се повезује као обична Gradle зависност, а све класе из commonMain-а су директно доступне.
iOS модул — Xcode пројекат у Swift-у или Objective-C-у. Shared модул се повезује путем CocoaPods-а, Swift Package Manager-а или XCFramework-а. Kotlin/Native генерише Objective-C заглавља за извоз Kotlin типова, чинећи их доступним из Swift-а.
expect/actual — механизам Kotlin Multiplatform-а који омогућава декларисање API-ја у заједничком коду (expect declaration) и пружање његове имплементације одвојено за сваку платформу (actual declaration). Компајлер надгледа да actual постоји за сваку циљну платформу.
Типични сценарији коришћења expect/actual: добијање тренутног времена са уважавањем временске зоне, рад са SharedPreferences (Android) / UserDefaults (iOS), криптографске функције и генерисање UUID-а. На свакој платформи се користи сопствени системски API.
Без expect/actual било би немогуће имати јединствени код пословне логике, јер се API-ји за рад са датотечним системом, мрежом и складиштем разликују између iOS и Android на нивоу системских позива. Механизам гарантује да програмер неће заборавити да имплементира платформски део.
За платформске позиве, попут рада са камером или биометријом, KMM нуди библиотеку expect/actual у комбинацији са додацима сличним Cordova-и, али у Kotlin/Native-у. JetBrains је такође објавио библиотеку kotlinx-datetime, која апстрахује рад са датумима.
Размотримо основну структуру KMM пројекта са декларацијом expect функције за генерисање UUID-а и њеном имплементацијом за iOS и Android.
// commonMain — заједничка декларација
expect fun generateUUID(): String
// androidMain — имплементација за Android
actual fun generateUUID(): String {
return java.util.UUID.randomUUID().toString()
}
// iosMain — имплементација за iOS
actual fun generateUUID(): String {
return platform.Foundation.NSUUID().UUIDString
}
У заједничком коду се декларише expect fun generateUUID(). За Android се користи java.util.UUID, за iOS — NSUUID из Foundation оквира. У осталом коду shared модула ова функција се позива без обзира на платформу.
Пример мрежног захтева коришћењем Ktor Client-а у заједничком коду:
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class User(
val id: Int,
val name: String
)
class UserRepository {
private val client = HttpClient()
suspend fun getUser(id: Int): User {
val response: HttpStatement =
client.get("https://api.example.com/users/$id")
return Json.decodeFromString(response.bodyAsText())
}
}
Овај код ради на обе платформе без измена. Ktor Client користи OkHttp под Android-ом и NSURLSession под iOS-ом аутоматски, без додатне конфигурације. JSON серијализација кроз kotlinx.serialization је такође вишеплатформска.
KMM заузима јединствену позицију међу вишеплатформским технологијама, јер не покушава да замени изворни UI за разлику од Flutter-а и React Native-а. KMM — решење за дељење логике, а не за унификацију интерфејса.
| Критеријум | KMM | Flutter | React Native |
|---|---|---|---|
| UI | Изворан (SwiftUI / Jetpack Compose) | Сопствени погон (Skia) | JavaScript → изворне компоненте |
| Језик | Kotlin (shared) + Swift / Kotlin (UI) | Dart | JavaScript / TypeScript |
| Перформансе | Максималне (изворни UI) | Високе (сопствени рендеринг) | Средње (мост JS-Native) |
| Дељење кода | Пословна логика (40–70%) | UI + логика (80–95%) | UI + логика (70–90%) |
| Праг уласка | Висок (два језика) | Средњи (један језик) | Низак (веб програмери) |
Главна предност KMM-а — потпуна контрола над UI-јем. Ако апликација треба да изгледа и понаша се изворно на свакој платформи (на пример, да користи iOS TabBar и Android BottomNavigation са платформским анимацијама), KMM је једино вишеплатформско решење које то обезбеђује без заобилазних решења.
Недостатак — тим мора да зна Kotlin, Swift, Jetpack Compose и SwiftUI истовремено, што отежава запошљавање. Flutter и React Native захтевају знање једног језика и једног оквира.
Kotlin Multiplatform Mobile — моћна технологија, али њено увођење захтева уравнотежен приступ. Размотримо кључне предности и типичне изазове са којима се суочавају тимови.
Прва и главна предност — смањење дуплирања кода. Према JetBrains Case Studies (2024), тимови који су увели KMM смањују обим дуплираног кода за 60–80% за мрежни слој и за 40–50% за пословну логику у целини. То директно утиче на брзину развоја и број грешака.
Друга предност — перформансе на нивоу изворних апликација. За разлику од хибридних оквира, KMM не додаје слојеве апстракције између UI-ја и система. Код пословне логике се извршава једнако брзо као да је написан у Swift-у или Kotlin-у за сваку платформу посебно.
Главни изазов — квалификација тима. Програмери морају да знају Kotlin (за shared модул), као и Swift и Jetpack Compose (за UI). Проналажење универзалног стручњака је тешко, па се обично формира тим од Android и iOS програмера који заједно воде shared модул.
Други изазов — алати. KMM захтева подешавање Gradle-а, CocoaPods-а или Swift Package Manager-а, као и интеграцију са Xcode-ом. У раним фазама пројекта чести су проблеми са конфигурацијом компајлирања, посебно при раду са C библиотекама.
Трећи изазов — отклањање грешака. Када се грешка појави на споју Kotlin/Native-а и Swift-а, одређивање њеног узрока је теже него у монолитној апликацији. JetBrains стално побољшава алате за отклањање грешака, али у пракси тимови морају да издвајају до 20% времена на инфраструктурне задатке.
Често постављана питања
Да, KMM подржава iOS као једину циљну платформу. Shared модул се компајлира у iOS оквир који се повезује са Swift пројектом путем XCFramework-а. Android модул се не мора креирати. Ово је корисно за тимове који желе да користе Kotlin за пословну логику iOS апликације.
Kotlin/Native — компајлер који преводи Kotlin код у изворни бинарни фајл без виртуелне машине. KMM користи Kotlin/Native за компајлирање shared модула за iOS. За Android KMM користи стандардни Kotlin/JVM компајлер. Kotlin/Native — технолошки темељ KMM-а.
За рад са локалним базама података у KMM-у се користи SQLDelight — вишеплатформска библиотека која генерише Kotlin код из SQL упита. Под Android-ом ради преко Android SQLite API-ја, под iOS-ом преко Native SQLite (CFNetwork). Алтернатива — Realm Kotlin SDK од MongoDB-а.
KMM подразумевано не укључује UI компоненте — UI се пише одвојено у SwiftUI и Jetpack Compose. Међутим, постоје библиотеке попут Compose Multiplatform (од JetBrains-а) које омогућавају рендеровање UI-ја у Kotlin-у директно на iOS и Android без изворних оквира.
KMM користе велике компаније: Netflix (дељење логике препорука), McDonald's (мобилна апликација), VMWare (корпоративне апликације) и Leroy Merlin (апликација за грађевински материјал). Листа расте, јер JetBrains активно инвестира у развој екосистема.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође