Mulai Menggunakan Multiplatform Kotlin

1. Sebelum memulai

Prasyarat

  • Pengetahuan mengenai cara membuat aplikasi Jetpack Compose.
  • Pengalaman menggunakan Kotlin.
  • Pemahaman dasar tentang sintaksis Swift.

Yang Anda perlukan

Yang akan Anda pelajari

  • Memahami dasar-dasar Multiplatform Kotlin.
  • Cara membagikan kode di berbagai platform.
  • Cara menghubungkan kode bersama di Android dan iOS.

2. Memulai persiapan

Untuk memulai, ikuti langkah-langkah ini:

  1. Buat clone repositori GitHub:
$ git clone https://github.com/android/codelab-android-kmp.git

Atau, Anda dapat mendownload repositori sebagai file ZIP:

  1. Di Android Studio, buka project get-started, yang berisi cabang berikut:
  • main: Berisi kode awal untuk project ini, yang dapat Anda ubah untuk menyelesaikan codelab.
  • end: Berisi kode solusi untuk codelab ini.

Codelab ini dimulai dengan cabang main. Anda dapat mengikuti codelab ini langkah demi langkah sesuai kemampuan Anda.

  1. Jika Anda ingin melihat kode solusi, jalankan perintah ini:
$ git clone -b end https://github.com/android/codelab-android-kmp.git

Selain itu, Anda dapat mendownload kode solusi:

Menginstal Xcode

Untuk membangun dan menjalankan bagian iOS dari codelab ini, Anda memerlukan Xcode dan simulator iOS:

  1. Instal Xcode dari Mac App Store (untuk melakukannya Anda memerlukan akun Apple).
  2. Setelah diinstal, luncurkan Xcode.
  3. Dialog akan ditampilkan yang menunjukkan komponen mana yang sudah disertakan, dan komponen mana yang perlu didownload. c4aba94d795dabee.png
  4. Centang iOS 18.4 (or newer).
  5. Klik Download & Install.
  6. Tunggu hingga komponen selesai diinstal.

Codelab ini diuji dengan Xcode 16.3. Jika Anda menggunakan versi Xcode lain, dan jika Anda mengalami masalah, sebaiknya download versi yang sama seperti yang disebutkan dalam codelab ini.

Aplikasi contoh

Codebase ini berisi aplikasi Android yang dibuat dengan Jetpack Compose dan aplikasi iOS yang dibuat dengan SwiftUI. Project Android ada di folder androidApp/, sedangkan project iOS ada di folder iosApp/ yang juga berisi KMPGetStartedCodelab.xcodeproj untuk dijalankan dengan Xcode.

3. Pengantar Multiplatform Kotlin

Multiplatform Kotlin (KMP) memungkinkan Anda menulis kode satu kali dan membagikannya ke beberapa platform target, seperti Android, iOS, Web, dan Desktop. Dengan memanfaatkan KMP, Anda dapat meminimalkan duplikasi kode, mempertahankan konsistensi, dan secara signifikan mengurangi waktu dan upaya pengembangan.

KMP tidak menentukan jumlah atau bagian codebase yang perlu Anda bagikan. Anda dapat memutuskan bagian kode mana yang layak dibagikan.

Menentukan bagian kode yang akan dibagikan

Kode bersama ini memungkinkan Anda mempertahankan konsistensi dan mengurangi duplikasi di berbagai platform. Banyak tim developer aplikasi seluler memulai dengan membagikan kumpulan logika bisnis terpisah (misalnya, akses database, akses jaringan, dll.) dan pengujian terkait, lalu membagikan kode tambahan dari waktu ke waktu.

Banyak library Android Jetpack memiliki dukungan untuk KMP. Library Jetpack yang telah dibuat multiplatform menawarkan beberapa tingkat dukungan, bergantung pada platform targetnya. Untuk mengetahui daftar lengkap library dan tingkat dukungannya, lihat dokumentasi.

Misalnya, salah satu library yang didukung, library database Room, mendukung Android, iOS, dan Desktop. Hal ini memungkinkan Anda memporting pembuatan database dan logika database terkait ke modul bersama KMP umum sekaligus mempertahankan kode native lainnya di kedua platform.

Kemungkinan langkah berikutnya setelah memigrasikan database adalah membagikan logika domain lainnya. Kemudian, Anda juga dapat mempertimbangkan penggunaan library multiplatform ViewModel dari Android Jetpack.

Cara menulis kode khusus platform

Multiplatform Kotlin memperkenalkan teknik baru untuk menerapkan fungsi khusus platform.

Deklarasi yang diharapkan dan yang sebenarnya

Fitur bahasa Kotlin expect actual dirancang untuk mendukung codebase multiplatform Kotlin dengan dukungan IDE penuh.

Pendekatan ini ideal jika perilaku khusus platform dapat dienkapsulasi dalam satu fungsi atau class. Mekanisme ini fleksibel dan canggih. Misalnya, class expect umum dapat memiliki class actual khusus platform dengan pengubah visibilitas yang lebih terbuka, jenis super tambahan, atau jenis atau pengubah parameter yang berbeda. Jenis variasi ini tidak akan mungkin dilakukan dengan API antarmuka yang ketat. Selain itu, expect actual di-resolve secara statis, yang berarti implementasi khusus platform diterapkan pada waktu kompilasi.

Antarmuka dan Implementasi di Kotlin

Jika kedua platform harus mengikuti API yang serupa, tetapi dengan implementasi yang berbeda, Anda dapat menentukan antarmuka dalam kode bersama sebagai alternatif untuk deklarasi yang diharapkan dan yang sebenarnya. Pendekatan ini memungkinkan Anda menggunakan implementasi pengujian yang berbeda, atau beralih ke implementasi yang berbeda saat runtime.

Selain itu, antarmuka tidak memerlukan pengetahuan khusus Kotlin, sehingga opsi ini mudah diakses oleh developer yang sudah terbiasa dengan antarmuka dalam bahasa lain.

Antarmuka dalam kode bersama yang umum, implementasi dalam kode native (Android atau Swift).

Dalam beberapa kasus, Anda perlu menulis kode yang tidak tersedia dari kode KMP. Dalam situasi ini, Anda dapat menentukan antarmuka dalam kode bersama, menerapkannya untuk Android di Kotlin, dan menyediakan versi iOS di Swift. Biasanya, implementasi native kemudian dimasukkan ke dalam kode bersama, baik melalui injeksi dependensi maupun secara langsung. Strategi ini memungkinkan pengalaman yang disesuaikan di setiap platform sekaligus mempertahankan antarmuka umum untuk kode bersama.

4. Membuka project Xcode dari Android Studio

Setelah Xcode diinstal, Anda harus memastikan bahwa Anda dapat menjalankan aplikasi iOS.

Anda dapat membuka project iOS langsung dari Android Studio.

  1. Ubah panel Project untuk menggunakan Project View4f1a2c2ad988334c.png
  2. Temukan file KmpGetStartedCodelab.xcodeproj di folder [root]/iosApp/ 1357ffb58fe05180.png
  3. Klik kanan file, lalu pilih Open In dan Open in Associated Application. Tindakan ini akan membuka aplikasi iOS di Xcode. f93dee415dfd40e9.png
  4. Jalankan project di Xcode dengan mengklik ⌘+R atau membuka menu Product, lalu pilih Run

fff7f322c13ccdc0.png.

5. Menambahkan modul KMP

Untuk menambahkan dukungan KMP ke project Anda, buat modul shared terlebih dahulu untuk kode yang akan digunakan kembali di berbagai platform (Android, iOS).

Android Studio menyediakan cara untuk menambahkan modul Multiplatform Kotlin menggunakan template modul Bersama KMP.

Untuk membuat modul KMP, di Android Studio:

  1. Buka File > New > New Module > Kotlin Multiplatform Shared Module
  2. Ubah paket menjadi com.example.kmp.shared
  3. Klik Finish4ef605dcc1fe6301.png
  4. Setelah pembuatan modul selesai dan Gradle selesai menyinkronkan, modul shared baru akan muncul dalam project. Untuk melihat tampilan yang ditampilkan di bawah, Anda mungkin perlu beralih dari Tampilan Android ke Tampilan Project.

eb58eea4e534dab2.png

Modul bersama yang dihasilkan oleh template modul Bersama KMP menyertakan beberapa fungsi dan pengujian placeholder dasar. Placeholder ini memastikan bahwa modul dikompilasi dan berhasil berjalan sejak awal.

Penting: Perhatikan perbedaan antara folder iosApp dan folder iosMain. Folder iosApp berisi kode aplikasi iOS mandiri, sedangkan iosMain adalah bagian dari modul bersama KMP yang baru saja Anda tambahkan. iosApp berisi kode Swift, sedangkan iosMain berisi kode KMP khusus platform iOS.

Pertama, Anda harus menautkan modul bersama baru sebagai dependensi dalam modul Gradle :androidApp agar aplikasi dapat menggunakan kode bersama:

  1. Buka file androidApp/build.gradle.kts.
  2. Tambahkan dependensi modul shared di blok dependensi sebagai berikut
dependencies {
    ...
    implementation(projects.shared)
}
  1. Sinkronkan project dengan file Gradle-nya c4a6ca72cf444e6e.png

Memverifikasi akses kode ke modul shared

Untuk memverifikasi bahwa aplikasi Android dapat mengakses kode dari modul shared, kita akan melakukan update sederhana pada aplikasi.

  1. Dalam project KMPGetStartedCodelab, buka file MainActivity di androidApp/src/main/java/com/example/kmp/getstarted/android/MainActivity.kt
  2. Ubah composable Text konten untuk menyertakan informasi platform() dalam string yang ditampilkan.
Text(
  "Hello ${platform()}",
)
  1. Klik ⌥(option)+return di keyboard, lalu pilih Import function 'platform'da301d17884eaef9.png
  2. Buat dan jalankan aplikasi di perangkat Android atau emulator.

Update ini memeriksa apakah aplikasi dapat memanggil fungsi platform() dari modul shared, yang akan menampilkan "Android" saat berjalan di platform Android.

9828afe63d7cd9da.png

6. Menyiapkan modul bersama ke aplikasi iOS

Swift tidak dapat menggunakan modul Kotlin secara langsung seperti aplikasi Android, dan memerlukan framework biner yang dikompilasi (paket XCFramework) yang akan dihasilkan. Paket XCFramework adalah paket biner yang menyertakan framework dan library yang diperlukan untuk membangun beberapa platform Apple.

Cara library bersama didistribusikan

Template modul baru di Android Studio telah mengonfigurasi modul bersama untuk menghasilkan framework untuk setiap arsitektur iOS. Anda dapat menemukan kode berikut di file build.gradle.kts modul shared.

val xcfName = "sharedKit"

iosX64 {
  binaries.framework {
    baseName = xcfName
  }
}

iosArm64 {
  binaries.framework {
    baseName = xcfName
  }
}

iosSimulatorArm64 {
  binaries.framework {
    baseName = xcfName
  }
}

Langkah ini melibatkan penyiapan Xcode untuk menjalankan skrip guna membuat framework Kotlin, dan memanggil fungsi platform() di aplikasi iOS.

Untuk memakai library bersama, Anda perlu menghubungkan framework Kotlin ke project iOS dengan langkah-langkah berikut:

  1. Buka project iOS (direktori iosApp yang disebutkan sebelumnya) di Xcode dan buka setelan project dengan mengklik dua kali nama project di navigator project 94047b06db4a3b6f.png
  2. Di tab Build Phases pada setelan project, klik + dan pilih New Run Script Phase. Tindakan ini akan menambahkan fase "Run script" baru setelah semua fase lainnya. d4907a9cb0a5ac6e.png
  3. Klik dua kali judul Run Script untuk mengganti namanya. Ubah nama Run Script default menjadi Compile Kotlin Framework agar fungsi fase ini dapat dipahami.
  4. Luaskan fase build, dan di kolom teks di bawah Shell, masukkan kode skrip:
cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode

7b6a393e44ddbe60.png

  1. Tarik fase Compile Kotlin Framework sebelum fase Compile Sources. 27dbe2cf958c986f.png
  2. Bangun project di Xcode dengan mengklik ⌘+B atau membuka menu Product, lalu pilih Build. Perhatikan bahwa progres build ditampilkan di atas Xcode. bb0f9cb0f96d1f89.png

Jika semuanya disiapkan dengan benar, project akan berhasil dibuat.

bb9b12d5f6ad0bac.png

Dengan menetapkan fase build skrip run dengan cara ini, Anda dapat mengompilasi project iOS dari Xcode tanpa perlu beralih ke alat lain untuk mengompilasi modul bersama.

Memverifikasi akses kode ke modul shared

Untuk memverifikasi bahwa aplikasi iOS berhasil mengakses kode dari modul shared, Anda akan melakukan update sederhana yang sama pada aplikasi yang Anda buat untuk aplikasi Android.

  1. Di project iOS, di Xcode, buka file ContentView.swift di: Sources/View/ContentView.swift
  2. Tambahkan import sharedKit di bagian atas file.
  3. Ubah tampilan Text untuk menyertakan informasi Platform_iosKt.platform() dalam string yang ditampilkan dengan \(Platform_iosKt.platform()).

Berikut adalah hasil akhir file:

import SwiftUI
import sharedKit 

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            
            Text("Hello, \(Platform_iosKt.platform())!")
        }
        .padding()
    }
}
  1. Jalankan aplikasi dengan mengklik ⌘+R, atau buka menu Product, lalu klik Run.

Perubahan ini memeriksa apakah aplikasi iOS dapat memanggil fungsi platform() dari modul bersama, yang akan menampilkan "iOS" saat berjalan di platform iOS.

8024b5cc4bcd3f84.png

7. Menambahkan Swift/Kotlin Interface Enhancer (SKIE)

Secara default, antarmuka native yang dihasilkan Kotlin adalah header Objective-C. Swift kompatibel langsung dengan Objective-C, tetapi Objective-C tidak menyertakan semua fitur modern Swift atau Kotlin.

Hal ini juga menjadi alasan mengapa dalam contoh sebelumnya, Anda tidak dapat menggunakan panggilan platform() secara langsung dalam kode Swift. KMP tidak dapat menghasilkan fungsi global, karena Objective-C tidak mendukung fungsi global. Karena hanya fungsi statis yang dienkapsulasi dalam class, Anda perlu menambahkan Platform_iosKt.

Agar antarmuka lebih cocok dengan Swift, Anda dapat menggunakan alat Swift/Kotlin Interface Enhancer (SKIE) untuk meningkatkan antarmuka Swift modul :shared.

Beberapa fitur umum SKIE adalah:

  • Dukungan yang lebih baik untuk argumen default
  • Dukungan yang lebih baik untuk hierarki tersegel (sealed class, sealed interface)
  • Dukungan yang lebih baik untuk enum class dengan penanganan menyeluruh dalam pernyataan switch
  • Interoperabilitas antara Flow dan AsyncSequence
  • Interoperabilitas antara suspend fun dan async func
  1. Tambahkan plugin Gradle co.touchlab.skie ke file libs.versions.toml:
[versions]
skie = "0.10.1"

[plugins]
skie = { id = "co.touchlab.skie", version.ref = "skie" }
  1. Tambahkan plugin ke file build.gradle.kts root
plugins {
   ...
   alias(libs.plugins.skie) apply false
}
  1. Tambahkan plugin ke file build.gradle.kts modul :shared:
plugins {
   ...
   alias(libs.plugins.skie)
}
  1. Lakukan sinkronisasi Gradle pada project

Menghapus panggilan fungsi statis

Sekarang, saat membangun ulang aplikasi iOS, Anda mungkin tidak langsung melihat apa pun, tetapi Anda dapat menghapus awalan Platform_iosKt dan membiarkan fungsi platform() berfungsi sebagai fungsi global.

Text("Hello, KMP! \(platform())")

Hal ini dapat dilakukan karena SKIE (di antara fitur lainnya) memanfaatkan Catatan API Swift, yang menambahkan informasi tentang API agar dapat memakainya dengan lebih baik dari kode Swift.

8. Selamat

Selamat, Anda telah menambahkan kode Multiplatform Kotlin bersama pertama ke project Android dan iOS. Meskipun ini hanyalah titik awal minimal, Anda kini dapat mulai menemukan fitur dan kasus penggunaan lanjutan untuk berbagi kode dengan KMP.

Apa selanjutnya?

Pelajari cara menggunakan Jetpack Room untuk berbagi lapisan data antara Android dan iOS di codelab berikutnya.

Pelajari lebih lanjut