Kotlin Multiplatform: apa itu, shared module dan expect/actual

Penulis: IT Sectr Diterbitkan: 2026-02-11 Waktu membaca: 11 mnt

Kotlin Multiplatform (KMP) — teknologi JetBrains yang mengompilasi kode Kotlin umum langsung untuk iOS, Android, Web dan Desktop. Tidak seperti Flutter dan React Native, KMP tidak mengganti UI asli — logika umum dipindahkan ke shared module, dan antarmuka setiap aplikasi tetap asli. Kotlin Multiplatform documentation — panduan utama untuk konfigurasi modul dan mekanisme expect/actual.

Poin Utama

  • KMP — logika bersama di Kotlin dengan expect/actual untuk API platform tanpa mengganti UI asli
  • Shared module — modul Gradle dengan kode permintaan jaringan, basis data, validasi dan logika bisnis untuk semua platform
  • Expect/actual — mekanisme deklarasi API platform dalam kode bersama dengan implementasi untuk setiap target
  • iOS integration — shared module dikompilasi ke Apple framework melalui Kotlin/Native
  • KMP vs KMM — Kotlin Multiplatform Mobile (fokus seluler) sekarang menjadi bagian dari Kotlin Multiplatform umum

Apa itu Kotlin Multiplatform?

Kotlin Multiplatform — teknologi kompilasi silang yang memungkinkan penulisan kode bersama di Kotlin dan mengompilasinya untuk berbagai platform: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) dan biner asli (Linux, Windows). KMP bukanlah kerangka UI — ia memecahkan masalah penggunaan kembali logika bisnis, bukan antarmuka.

Arsitektur KMP dibangun di sekitar shared module — modul Gradle yang berisi commonMain dengan kode independen platform dan source sets untuk setiap target (androidMain, iosMain, desktopMain). Menurut data JetBrains tahun 2025, lebih dari 40% proyek Kotlin baru menggunakan KMP untuk berbagi kode antar platform.

Kotlin Multiplatform Mobile (KMM) — nama sebelumnya untuk skenario seluler iOS+Android. Sejak Kotlin 2.1+, istilah KMM digantikan dengan Kotlin Multiplatform umum, karena teknologi telah melampaui batas pengembangan seluler. Netflix, McDonald's dan VMware menggunakan KMP dalam produksi untuk berbagi kode antar aplikasi seluler.

Mekanisme expect/actual: arsitektur

Expect/actual — mekanisme kunci KMP untuk bekerja dengan kode platform. Di commonMain dideklarasikan deklarasi expect (fungsi, kelas, properti), dan di setiap source set khusus platform (androidMain, iosMain) — implementasi actual. Kompilator memeriksa bahwa untuk setiap expect terdapat actual di setiap platform target.

kotlin
// commonMain — deklarasi API platform
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

// androidMain — actual untuk Android
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"

// iosMain — actual untuk iOS
actual fun getPlatformName(): String =
    UIDevice.currentDevice.systemName

Hierarki source sets di KMP memungkinkan pembuatan level perantara: misalnya, iosArm64Main (perangkat fisik iOS) dan iosSimulatorArm64Main (simulator) dengan iosMain bersama. Kode dari commonMain dapat diakses oleh semua platform, dan kode dari iosMain hanya untuk target iOS. Ini mengurangi duplikasi ketika implementasi berbeda bukan untuk setiap platform, tetapi untuk sekelompok platform.

Dalam praktiknya, expect/actual digunakan untuk: mendapatkan penyimpanan lokal (SharedPreferences vs NSUserDefaults), bekerja dengan jaringan (HttpEngine untuk setiap platform), akses ke sistem file, kriptografi dan analitik. JetBrains merekomendasikan untuk meminimalkan jumlah expect/actual dan memindahkan sebanyak mungkin kode ke commonMain.

Shared module: struktur dan Gradle

Shared module — modul Gradle standar dengan plugin `org.jetbrains.kotlin.multiplatform`. Ini berisi kode bersama di `src/commonMain/kotlin/` dan implementasi platform di `src/androidMain/kotlin/` dan `src/iosMain/kotlin/`. Proyek KMP juga menghubungkan `androidApp` dan `iosApp`, yang bergantung pada shared module.

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")
            }
        }
    }
}

Konfigurasi Gradle untuk KMP memerlukan penentuan eksplisit target iOS — x64 (simulator Intel), arm64 (perangkat fisik) dan simulatorArm64 (simulator Apple Silicon). Untuk setiap target, Apple framework terpisah dibuat. Plugin `kotlin("multiplatform")` secara otomatis mengonfigurasi kompilasi untuk JVM dan LLVM tergantung pada target yang dideklarasikan.

Ktor dan kotlinx.serialization — pustaka standar KMP yang mendukung kode bersama. Ktor menyediakan klien HTTP dengan mesin untuk setiap platform (OkHttp untuk Android, Darwin untuk iOS). kotlinx.serialization bekerja pada platform apa pun tanpa expect/actual berkat implementasi multi-platform di commonMain.

Integrasi dengan iOS melalui Kotlin/Native

Kotlin/Native — kompilator Kotlin ke kode asli melalui LLVM. Untuk iOS, shared module dikompilasi menjadi Apple framework (.framework) yang dihubungkan melalui Xcode. Pemanggilan kode bersama dari Swift/Objective-C terjadi melalui header Objective-C yang dihasilkan, oleh karena itu API shared module harus kompatibel dengan Objective-C.

Keterbatasan integrasi iOS: Koleksi Kotlin (List, Map) dikonversi ke NSArray/NSDictionary. Fungsi dengan parameter default tidak diekspor — diperlukan overloads. Untuk fungsi suspend, metode berbasis callback dihasilkan dengan `@ObjCName` dan dukungan async/await sejak Kotlin 2.0+.

swift
// Aplikasi iOS: memanggil shared module dari 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)")
            }
        })
    }
}

Integrasi shared module di Xcode dilakukan melalui embed-and-framework — `.xcframework` yang dihasilkan ditambahkan ke proyek Xcode. Plugin Gradle dapat secara otomatis memperbarui framework saat build melalui embedAndSignAppleFrameworkForXcode. Untuk pengujian pada simulator, biner iosSimulatorArm64 atau iosX64 sudah cukup.

KMP vs Flutter vs React Native

Pilihan antara KMP, Flutter dan React Native tergantung pada prioritas: penggunaan kembali logika atau multiplatform penuh. KMP memberikan UI asli di setiap platform, tetapi memerlukan dua basis kode untuk antarmuka. Flutter dan React Native menggunakan UI tunggal, tetapi mengorbankan keaslian.

KarakteristikKMPFlutterReact Native
Kerangka UIAsli (Android XML/Jetpack Compose + SwiftUI)Dart + perender Skia sendiriReact + komponen asli
Kode bersamaLogika bisnis, jaringan, basis data, validasi100% kecuali plugin asli100% kecuali modul asli
KinerjaAsli (tanpa lapisan perantara)Tinggi (Skia Engine)Sedang (JSI Bridge)
Dukungan iOSKotlin/Native (sangat baik)Sangat baikBaik
Ambang masukSedang (Kotlin + platform asli)Rendah (satu bahasa + satu UI)Rendah (JS/TS + React)

Kapan memilih KMP: proyek membutuhkan UI berkinerja tinggi (game, peta, animasi), kode asli yang ada perlu digunakan kembali, tim sudah mengenal Kotlin dan platform asli. Kapan memilih Flutter/RN: MVP atau startup dengan anggaran terbatas, tim dengan satu profil, UI tidak memerlukan kustomisasi asli yang mendalam.

Alat dan pustaka KMP

Ekosistem alat KMP mencakup pustaka untuk semua lapisan aplikasi: jaringan (Ktor), serialisasi (kotlinx.serialization), basis data (SQLDelight), navigasi (Decompose), DI (Koin) dan penyimpanan data (multiplatform-settings). JetBrains mendukung Compose Multiplatform — kerangka UI di Kotlin yang berfungsi di semua platform.

kotlin
// Repository di KMP dengan 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 — kerangka UI untuk KMP yang berbasis pada Jetpack Compose. Memungkinkan penulisan antarmuka di Kotlin untuk Android, iOS, Desktop dan Web. Pada tahun 2025, Compose Multiplatform mencapai status stabil untuk Android dan Desktop; target iOS dalam beta. Untuk proyek produksi dengan UI asli, keunggulan KMP tetap menjadi perbedaan utama dari Flutter.

Pertanyaan yang Sering Diajukan

Apa perbedaan Kotlin Multiplatform dengan Kotlin Multiplatform Mobile?

KMM — adalah skenario seluler KMP untuk iOS dan Android. Sejak versi Kotlin 2.1+, JetBrains menggabungkan kedua istilah tersebut dalam Kotlin Multiplatform, karena teknologi ini tidak hanya mendukung platform seluler, tetapi juga Desktop dan Web. Proyek KMM tetap berfungsi, tetapi sekarang menjadi bagian dari KMP umum.

Bisakah KMP digunakan dengan SwiftUI?

Ya. KMP dikompilasi menjadi Apple framework melalui Kotlin/Native dengan header Objective-C. SwiftUI mengimpor framework ini sebagai pustaka biasa. Shared module mengekspor kelas dan fungsi Kotlin yang dipanggil dari Swift dengan beberapa keterbatasan (misalnya, koleksi Kotlin dikonversi ke tipe Foundation).

Bagaimana cara menguji shared module di iOS?

Di iOS, shared module diuji melalui pengujian Kotlin/Native di source set iosTest. Untuk pengujian UI, digunakan XCTest di Xcode dengan framework yang diimpor. Pengujian Kotlin ditulis di commonTest dengan kotlin.test dan dijalankan di simulator iOS melalui tugas Gradle iosSimulatorArm64Test.

Pustaka apa saja yang tersedia di KMP?

Pustaka utama KMP: Ktor (jaringan), kotlinx.serialization (JSON), SQLDelight (basis data), Koin (DI), Decompose (navigasi), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (melalui KMP-NativeCoroutines). Compose Multiplatform menyediakan UI untuk semua platform.

Apakah KMP mendukung Gradle 8?

Ya. KMP sepenuhnya kompatibel dengan Gradle 8.5+. Mulai Kotlin 2.1, plugin resmi mendukung Gradle 8. Konfigurasi melalui build.gradle.kts dengan kotlin("multiplatform") memerlukan Gradle 7.6+, tetapi versi 8.5 direkomendasikan untuk kinerja build yang optimal.

Kesimpulan

  • Kotlin Multiplatform — teknologi multiplatform JetBrains untuk kode bersama tanpa mengganti UI asli
  • Expect/actual — mekanisme deklarasi API platform di commonMain dengan implementasi untuk setiap target
  • Shared module — modul Gradle dengan commonMain dan source sets platform (androidMain, iosMain)
  • Kotlin/Native mengompilasi shared module menjadi Apple framework, dapat dipanggil dari Swift dan Objective-C
  • KMP vs Flutter/RN — penggunaan kembali logika + UI asli versus basis kode dan UI tunggal
  • Compose Multiplatform — kerangka UI di Kotlin untuk Android, iOS, Desktop dan Web
  • Ekosistem — Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose untuk semua lapisan aplikasi

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga