Kotlin Multiplatform: nedir, shared module ve expect/actual

Yazar: IT Sectr Yayınlanma: 2026-02-11 Okuma süresi: 11 dk

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

  • KMP — yerel UI'yi değiştirmeden platform API'leri için expect/actual ile Kotlin'de ortak mantık
  • Shared module — tüm platformlar için ağ, veritabanı, doğrulama ve iş mantığı kodu içeren bir Gradle modülü
  • Expect/actual — her hedef için uygulama ile ortak kodda platform API'si bildirme mekanizması
  • iOS entegrasyonu — shared module, Kotlin/Native aracılığıyla Apple framework'üne derlenir
  • KMP vs KMM — Kotlin Multiplatform Mobile (mobil odak) artık Kotlin Multiplatform'un bir parçası

Kotlin Multiplatform nedir?

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 mekanizması: mimari

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.

kotlin
// 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.systemName

KMP'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: yapı ve Gradle

Shared moduleorg.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.

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 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 ile iOS entegrasyonu

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.

swift
// 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 vs Flutter vs React Native

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.

ÖzellikKMPFlutterReact 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ğrulamaYerel eklentiler hariç %100Yerel modüller hariç %100
PerformansYerel (ara katman yok)Yüksek (Skia Engine)Orta (JSI Bridge)
iOS desteğiKotlin/Native (mükemmel)Mükemmelİyi
Giriş engeliOrta (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çları ve kütüphaneleri

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.

kotlin
// 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

Kotlin Multiplatform, Kotlin Multiplatform Mobile'dan nasıl farklıdır?

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.

KMP, SwiftUI ile kullanılabilir mi?

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 nasıl test edilir?

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.

KMP'de hangi kütüphaneler mevcuttur?

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.

KMP, Gradle 8'i destekliyor mu?

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

  • Kotlin Multiplatform — yerel UI'yi değiştirmeden ortak kod için JetBrains çapraz platform teknolojisi
  • Expect/actual — her hedef için uygulamalarla commonMain'de platform API'lerini bildirme mekanizması
  • Shared module — commonMain ve platforma özgü source set'ler (androidMain, iosMain) ile Gradle modülü
  • Kotlin/Native, shared module'ü Swift ve Objective-C'den çağrılabilir bir Apple framework'üne derler
  • KMP vs Flutter/RN — mantık yeniden kullanımı + yerel UI'ya karşı tek kod tabanı ve UI
  • Compose Multiplatform — Android, iOS, Desktop ve Web için Kotlin UI framework'ü
  • Ekosistem — tüm uygulama katmanları için Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose

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.

Projeyi tartış

Ayrıca okuyun