Kotlin Multiplatform (KMP), ortak Kotlin kodunu iOS, Android, Web ve Desktop için derleyen bir JetBrains teknolojisidir. Flutter ve React Native'in aksine, KMP yerel UI'ların yerini almaz — ortak mantık bir shared module'e çıkarılırken, her uygulamanın arayüzü yerel kalır. Kotlin Multiplatform documentation — modülleri ve expect/actual mekanizmasını yapılandırmak için ana referans.
Anahtar Noktalar
Kotlin Multiplatform, Kotlin'de ortak kod yazmayı ve bunu farklı platformlar için derlemeyi sağlayan bir çapraz derleme teknolojisidir: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) ve yerel ikili dosyalar (Linux, Windows). KMP bir UI framework'ü değildir — arayüzleri değil, iş mantığını yeniden kullanma sorununu çözer.
KMP mimarisi bir shared module etrafında inşa edilmiştir — platformdan bağımsız kod içeren commonMain ve her hedef için source set'ler (androidMain, iosMain, desktopMain) içeren bir Gradle modülüdür. 2025 JetBrains verilerine göre, yeni Kotlin projelerinin %40'ından fazlası platformlar arasında kod paylaşmak için KMP kullanmaktadır.
Kotlin Multiplatform Mobile (KMM) — iOS+Android mobil senaryosunun önceki adıdır. Kotlin 2.1+'dan itibaren, KMM terimi Kotlin Multiplatform ile değiştirilmiştir, çünkü teknoloji mobil geliştirmenin ötesine geçmiştir. Netflix, McDonald's ve VMware, mobil uygulamalar arasında kod paylaşmak için üretimde KMP kullanmaktadır.
Expect/actual — platforma özgü kodla çalışmak için KMP'nin anahtar mekanizmasıdır. commonMain içinde bir expect bildirimi (fonksiyon, sınıf, özellik) bildirilir ve her platforma özgü source set'te (androidMain, iosMain) bir actual uygulaması sağlanır. Derleyici, her expect için her hedef platformda bir actual bulunduğunu kontrol eder.
// commonMain — platform API bildirimi
expect fun getPlatformName(): String
expect class PlatformContext(val appVersion: String)
// androidMain — Android için actual
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"
// iosMain — iOS için actual
actual fun getPlatformName(): String =
UIDevice.currentDevice.systemNameKMP'deki source set hiyerarşisi, ara düzeyler oluşturmayı sağlar: örneğin, iosArm64Main (fiziksel iOS cihazları) ve iosSimulatorArm64Main (simülatör) ortak iosMain ile. commonMain'den gelen kod tüm platformlar için kullanılabilirken, iosMain'den gelen kod yalnızca iOS hedefleri için kullanılabilir. Bu, uygulama her platform için değil de bir platform grubu için farklı olduğunda tekrarı azaltır.
Pratikte, expect/actual şunlar için kullanılır: yerel depolamaya erişim (SharedPreferences vs NSUserDefaults), ağ iletişimi (platform başına HttpEngine), dosya sistemi erişimi, şifreleme ve analitik. JetBrains, expect/actual bildirimlerinin sayısını en aza indirmeyi ve mümkün olduğunca fazla kodu commonMain'e taşımayı önerir.
Shared module — org.jetbrains.kotlin.multiplatform eklentisi ile standart bir Gradle modülüdür. src/commonMain/kotlin/ içinde ortak kod ve src/androidMain/kotlin/ ve src/iosMain/kotlin/ içinde platforma özgü uygulamalar içerir. Bir KMP projesi ayrıca shared module'e bağımlı olan androidApp ve iosApp'i de içerir.
// 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 için Gradle yapılandırması, iOS hedeflerinin açıkça bildirilmesini gerektirir — x64 (Intel simülatör), arm64 (fiziksel cihazlar) ve simulatorArm64 (Apple Silicon simülatör). Her hedef için ayrı bir Apple framework'ü oluşturulur. kotlin("multiplatform") eklentisi, bildirilen hedeflere bağlı olarak JVM ve LLVM için derlemeyi otomatik olarak yapılandırır.
Ktor ve kotlinx.serialization — ortak kodu destekleyen standart KMP kütüphaneleridir. Ktor, her platform için motorlarla (Android için OkHttp, iOS için Darwin) bir HTTP istemcisi sağlar. kotlinx.serialization, commonMain'deki çok platformlu uygulaması sayesinde expect/actual olmadan tüm platformlarda çalışır.
Kotlin/Native — LLVM aracılığıyla yerel kod için bir Kotlin derleyicisidir. iOS için, shared module Xcode aracılığıyla bağlanan bir Apple framework'üne (.framework) derlenir. Swift/Objective-C'den ortak kod çağrısı, oluşturulan Objective-C başlıkları aracılığıyla gerçekleşir, bu nedenle shared module API'si Objective-C ile uyumlu olmalıdır.
iOS entegrasyon sınırlamaları: Kotlin koleksiyonları (List, Map) NSArray/NSDictionary'ye dönüştürülür. Varsayılan parametrelere sahip fonksiyonlar dışa aktarılmaz — overloads gerekir. Suspend fonksiyonları için, @ObjCName ve Kotlin 2.0+'dan itibaren async/await desteği ile callback tabanlı yöntemler oluşturulur.
// iOS uygulaması: Swift'ten shared module çağrısı
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'ün Xcode'a entegrasyonu embed-and-framework aracılığıyla gerçekleşir — oluşturulan .xcframework, Xcode projesine eklenir. Gradle eklentisi, embedAndSignAppleFrameworkForXcode aracılığıyla derleme sırasında framework'ü otomatik olarak güncelleyebilir. Simülatörde test etmek için bir iosSimulatorArm64 veya iosX64 ikili dosyası yeterlidir.
KMP, Flutter ve React Native arasındaki seçim önceliğe bağlıdır: kod yeniden kullanımı veya tam çapraz platform. KMP her platformda yerel UI sağlar ancak arayüz için iki kod tabanı gerektirir. Flutter ve React Native tek bir UI kullanır ancak yerelliği feda eder.
| Özellik | KMP | Flutter | React Native |
|---|---|---|---|
| UI framework'ü | Yerel (Android XML/Jetpack Compose + SwiftUI) | Dart + kendi Skia renderlayıcısı | React + yerel bileşenler |
| Ortak kod | İş mantığı, ağ, DB, doğrulama | Yerel eklentiler hariç %100 | Yerel modüller hariç %100 |
| Performans | Yerel (ara katman yok) | Yüksek (Skia Engine) | Orta (JSI Bridge) |
| iOS desteği | Kotlin/Native (mükemmel) | Mükemmel | İyi |
| Giriş engeli | Orta (Kotlin + yerel platformlar) | Düşük (bir dil + bir UI) | Düşük (JS/TS + React) |
KMP ne zaman seçilmeli: proje yüksek performanslı UI (oyunlar, haritalar, animasyonlar) gerektiriyorsa, mevcut yerel kod yeniden kullanılmalıysa, ekip zaten Kotlin ve yerel platformları biliyorsa. Flutter/RN ne zaman seçilmeli: sınırlı bütçeli MVP veya startup, tek profilli ekip, UI derin yerel özelleştirme gerektirmiyorsa.
KMP araç ekosistemi, uygulamanın tüm katmanları için kütüphaneler içerir: ağ (Ktor), serileştirme (kotlinx.serialization), veritabanı (SQLDelight), navigasyon (Decompose), DI (Koin) ve veri depolama (multiplatform-settings). JetBrains, tüm platformlarda çalışan bir Kotlin UI framework'ü olan Compose Multiplatform'u destekler.
// SQLDelight + Ktor ile KMP deposu
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 tabanlı KMP için bir UI framework'üdür. Android, iOS, Desktop ve Web için Kotlin'de arayüzler yazmayı sağlar. 2025'te Compose Multiplatform, Android ve Desktop için kararlı duruma ulaştı; iOS hedefi beta sürümündedir. Yerel UI ile üretim projeleri için KMP'nin avantajı, Flutter'dan temel fark olmaya devam etmektedir.
Sıkça Sorulan Sorular
KMM — iOS ve Android için KMP'nin mobil senaryosudur. Kotlin 2.1+'dan itibaren JetBrains her iki terimi de Kotlin Multiplatform altında birleştirmiştir, çünkü teknoloji yalnızca mobil platformları değil, aynı zamanda Desktop ve Web'i de desteklemektedir. KMM projeleri çalışmaya devam eder, ancak artık genel KMP'nin bir parçasıdır.
Evet. KMP, Objective-C başlıkları ile Kotlin/Native aracılığıyla Apple framework'üne derlenir. SwiftUI bu framework'ü herhangi bir normal kütüphane gibi içe aktarır. Shared module, bazı sınırlamalarla Swift'ten çağrılan Kotlin sınıflarını ve fonksiyonlarını dışa aktarır (örneğin, Kotlin koleksiyonları Foundation türlerine dönüştürülür).
iOS'ta shared module, iosTest source set'inde Kotlin/Native testleri aracılığıyla test edilir. UI testleri için, içe aktarılan framework ile Xcode'da XCTest kullanılır. Kotlin testleri commonTest'te kotlin.test ile yazılır ve iosSimulatorArm64Test Gradle görevi aracılığıyla iOS simülatöründe çalıştırılır.
Başlıca KMP kütüphaneleri: Ktor (ağ), kotlinx.serialization (JSON), SQLDelight (DB), Koin (DI), Decompose (navigasyon), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (KMP-NativeCoroutines aracılığıyla). Compose Multiplatform tüm platformlar için UI sağlar.
Evet. KMP, Gradle 8.5+ ile tamamen uyumludur. Kotlin 2.1'den itibaren resmi eklentiler Gradle 8'i desteklemektedir. build.gradle.kts ile kotlin("multiplatform") kullanarak yapılandırma, Gradle 7.6+ gerektirir, ancak optimum derleme performansı için sürüm 8.5 önerilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun