Setelah membangun aplikasi untuk JVM (CLI, backend Ktor) dan Android (Compose), kita naik ke tingkat abstraksi yang lebih tinggi: Kotlin Multiplatform (KMP). Proyek ini memungkinkan kita menulis satu kali logika bisnis di commonMain dan menggunakan kode yang sama di JVM, Android, iOS, JavaScript, dan platform lain. Hanya bagian yang benar-benar spesifik platform (UI, akses file, sistem operasi) yang ditulis terpisah. Tujuannya adalah mengurangi duplikasi kode dan menjaga konsistensi logika di banyak platform. Proyek ini memperkenalkan konsep inti KMP: source set hierarchy (commonMain, jvmMain, iosMain, dan lainnya), deklarasi expect/actual untuk platform-specific code, dan shared library yang dapat dipakai lintas platform. Setiap Bagian menghasilkan modul yang dapat dikompilasi untuk minimal dua target (JVM dan satu lainnya).
Tujuan Proyek #
Aplikasi multiplatform yang akan kita bangun mencakup:
- Shared domain logic di
commonMain: model, business rule, validator. - Multiplatform data layer dengan interface yang diimplementasi per platform.
- Platform-specific integration via
expect/actual(logger, waktu, file I/O). - Pengujian di
commonTestyang berjalan di semua platform target. - Packaging library untuk konsumsi oleh aplikasi JVM, Android, dan iOS.
Setiap layer dipisahkan dengan jelas: domain tidak tahu platform apa yang memakainya; data layer menyediakan abstraksi yang di-impl per platform; integration layer menyediakan expect/actual untuk fitur yang berbeda implementasinya.
Perilaku yang Diharapkan #
Aplikasi yang sama, ketika dijalankan di JVM, Android, dan iOS, menghasilkan output yang sama persis untuk logika bisnis, tetapi menulis log via logger platform-specific:
=== Platform: JVM (Desktop/Server) ===
[APP | JVM] Mencatat transaksi Gaji sejumlah 5000000 di JVM (Desktop/Server)
[RINGKASAN | JVM] Total: 5000000, jumlah: 1
=== Platform: Android ===
[APP | Android] Mencatat transaksi Gaji sejumlah 5000000 di Android
[RINGKASAN | Android] Total: 5000000, jumlah: 1
=== Platform: iOS (Kotlin/Native) ===
[APP | iOS] Mencatat transaksi Gaji sejumlah 5000000 di iOS (Kotlin/Native)
[RINGKASAN | iOS] Total: 5000000, jumlah: 1Logika catatTransaksi dan tampilkanRingkasan hidup di commonMain dan identik di semua platform. Hanya PlatformLogger yang berbeda implementasinya: println di JVM, Log (Android SDK) di Android, NSLog di iOS.
Teknologi dan Stack #
Proyek ini menggunakan peranti berikut:
| Komponen | Versi | Tujuan |
|---|---|---|
| Bahasa | Kotlin 2.0.21 | Multiplatform support via Kotlin/Native, Kotlin/JS |
| Build tool | Gradle 8.x + KMP plugin | Source set hierarchy otomatis |
| Serialization | kotlinx.serialization | Multiplatform, format-agnostic |
| Coroutines | kotlinx.coroutines | Multiplatform, support Dispatchers.Main per platform |
| Testing | kotlin.test | Multiplatform test runner |
| Targets | JVM, Android, iOS (Native) | Tiga target populer |
| File I/O | expect/actual | Abstraksi platform-specific access |
Proyek ini memakai ekosistem kotlinx.* yang didesain multiplatform sejak awal. Library yang berbasis JVM murni (seperti HikariCP, Room) tidak dapat dipakai di commonMain dan harus dibungkus dengan abstraksi.
Prasyarat #
Pembaca diharapkan telah menyelesaikan chapter berikut:
- Section Dasar-Dasar Kotlin:
data class,interface,object, dan lambda, - Section Object-Oriented Programming:
interfacedanobjectuntuk abstraksi lintas platform, - Section Coroutines:
suspenddanDispatchersdi context multiplatform, - Pola MVVM dan dependency injection (proyek Aplikasi Android Pencatat Keuangan),
- Pengujian dengan kotlin.test (proyek Aplikasi Inventaris),
- Gradle Kotlin DSL dasar (proyek Aplikasi Web Ktor).
Karena kode contoh berjalan di terminal dengan kotlinc, kita mengekspresikan pola KMP dengan interface + impl per platform. Saat membangun KMP nyata, gunakan Gradle dengan plugin org.jetbrains.kotlin.multiplatform untuk kompilasi multi-target.
Arsitektur #
KMP mengorganisir kode ke dalam source set. commonMain berisi kode yang berjalan di semua platform; source set spesifik platform (jvmMain, androidMain, iosMain) berisi kode yang berbeda per platform. Aturan dependensi: commonMain tidak boleh memanggil API spesifik platform; kode platform dapat memanggil commonMain. Source set juga dapat dikelompokkan menengah: jvmCommon (untuk kode yang dipakai JVM dan Android), nativeCommon (untuk semua Kotlin/Native). Hierarki ini otomatis ditata oleh Gradle plugin KMP.
Deklarasi expect di commonMain menyatakan kontrak (misalnya expect class PlatformLogger()) yang harus dipenuhi oleh actual di setiap source set platform. Compiler memastikan setiap target memiliki actual yang sesuai sebelum menghasilkan biner. Pola ini menjaga API surface tetap konsisten sambil memberi ruang implementasi yang berbeda.
Struktur Bagian #
Proyek ini dikerjakan dalam empat bagian berurutan:
| Bagian | Yang Dikerjakan | Hasil yang Diharapkan |
|---|---|---|
| 1. Shared Domain Logic | Model, business rule, dan validator di commonMain | Domain dapat dikompilasi untuk semua target tanpa perubahan |
| 2. Multiplatform Data Layer | Interface repository dengan impl per platform | Repository dapat dipakai bersama; impl menyembunyikan detail platform |
| 3. Platform-Specific Integration | expect/actual untuk logger, waktu, dan file I/O | Setiap target memiliki actual yang sesuai dengan kontrak commonMain |
| 4. Testing dan Packaging | commonTest untuk semua target, build library KMP | Test berjalan di semua target; artifact library dipublikasikan |
Mulailah dari Bagian 1 dan ikuti urutannya karena setiap Bagian dibangun di atas Bagian sebelumnya. Setelah Bagian 4 selesai, kita siap melangkah ke proyek terakhir: Aplikasi Pemrosesan Data Asinkron yang membawa kita ke pipeline data dengan coroutines dan Flow.
Referensi Lanjutan #
- Kotlin Multiplatform — halaman utama Kotlin Multiplatform yang menjadi landasan arsitektur proyek
- Kotlin Multiplatform Mobile getting started — panduan resmi memulai KMP untuk aplikasi Android dan iOS yang dibangun di proyek ini
Bangun domain model dan business rule di commonMain yang berjalan identik di semua platform target.
Buka → # Bagian 2: Multiplatform Data LayerImplementasi repository interface di beberapa platform: In-memory di commonMain, JDBC di jvmMain, dan konsep Room/SQLDelight untuk Android/iOS.
Buka → # Bagian 3: Platform-Specific IntegrationGunakan expect/actual untuk fitur yang berbeda per platform: nama platform, waktu saat ini, dan path file storage.
Buka → # Bagian 4: Testing dan PackagingTulis pengujian di commonTest yang berjalan di semua platform, lalu bangun library multiplatform yang dapat dikonsumsi JVM, Android, dan iOS.
Buka →