Rust dalam pengembangan mobile: modul native dan SDK lintas platform

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

Rust — bahasa pemrograman sistem dengan jaminan keamanan memori pada tahap kompilasi. Dikembangkan oleh Mozilla Research pada tahun 2010 di bawah pimpinan Graydon Hoare. Rust mencegah seluruh kelas kerentanan: pointer null, referensi menggantung, dan race condition data. Dalam pengembangan mobile, Rust digunakan untuk modul native, SDK lintas platform, dan WebAssembly. Menurut Stack Overflow Survey (2025), Rust menempati peringkat pertama sebagai 'bahasa favorit' untuk tahun kesembilan berturut-turut.

Poin Utama

  • Rust — bahasa sistem dengan keamanan memori tanpa garbage collector melalui sistem kepemilikan (ownership)
  • Borrow checker — penganalisis peminjaman yang memeriksa referensi pada tahap kompilasi, mencegah race condition data
  • Modul native di Rust dikompilasi menjadi .so untuk Android dan .a untuk iOS melalui cargo-ndk dan cargo-lipo
  • WebAssembly (Wasm) memungkinkan menjalankan kode Rust di browser dan perangkat mobile dengan performa near-native
  • FFI (Foreign Function Interface) — mekanisme pemanggilan Rust dari Java, Kotlin, dan Swift melalui ABI yang kompatibel dengan C

Apa itu Rust?

Rust — bahasa pemrograman sistem dengan tipe statis dan abstraksi biaya nol (zero-cost abstractions). Rust menjamin keamanan memori tanpa garbage collector berkat sistem kepemilikan (ownership), peminjaman (borrowing), dan masa hidup (lifetimes). Kompiler Rust adalah salah satu yang paling ketat — ia menolak kode yang dalam C++ akan menyebabkan perilaku tidak terdefinisi.

Rust dikompilasi melalui LLVM menjadi kode native untuk semua arsitektur: ARM, x86, RISC-V, WebAssembly. Perangkat: rustup (penginstal), rustc (kompiler), cargo (manajer paket dan pembangun). cargo.toml — analog dari package.json, berisi dependensi dari crates.io. Versi saat ini — Rust 1.81 (2025).

Bidang utama penerapan Rust dalam pengembangan mobile: pustaka native (Android NDK, iOS), SDK lintas platform (Firefox, Dropbox), penggantian C++ di bagian performance-critical, WebAssembly untuk aplikasi hybrid. Google menggunakan Rust di AOSP (Android Open Source Project) untuk komponen Bluetooth, Wi-Fi, dan NFC.

Instalasi dan konfigurasi Rust untuk pengembangan mobile

Untuk kompilasi silang ke Android, diperlukan toolchain target: rustup target add aarch64-linux-android armv7-linux-androideabi. Untuk iOS — aarch64-apple-ios x86_64-apple-ios. cargo-ndk (untuk Android) dan cargo-lipo (untuk iOS) menyederhanakan pembangunan.

sh
# Instalasi Rust dan platform target untuk pengembangan mobile
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ rustup target add aarch64-linux-android
$ rustup target add armv7-linux-androideabi
$ rustup target add aarch64-apple-ios
$ rustup target add x86_64-apple-ios

# Instalasi cargo-ndk untuk pembangunan Android
$ cargo install cargo-ndk

# Pembangunan untuk Android
$ cargo ndk -t arm64-v8a -o ./jniLibs build --release

Sistem kepemilikan: ownership, borrowing, dan lifetimes

Ownership (kepemilikan) — konsep fundamental Rust. Setiap nilai memiliki tepat satu pemilik. Saat penugasan atau pengiriman ke fungsi, kepemilikan dipindahkan (move). Setelah pemindahan, pemilik lama tidak dapat menggunakan nilai tersebut. Ini menghilangkan pembebasan memori ganda dan pointer menggantung.

Borrowing (peminjaman) memungkinkan penggunaan sementara referensi ke nilai tanpa pemindahan kepemilikan. Referensi &T (immutable) — berapa pun pembaca. Referensi &mut T (mutable) — tepat satu penulis, tanpa pembaca. Kompiler memeriksa aturan ini pada tahap pembangunan.

rust
fn process_data(data: &mut Vec<i32>) {
    for item in data.iter_mut() {
        *item *= 2;
    }
}

fn main() {
    let mut numbers = vec![1, 2, 3, 4, 5];
    process_data(&mut numbers);
    println!("Diproses: {:?}", numbers);

    let first = &numbers[0];  // peminjaman immutable
    println!("Pertama: {}", first);
}

process_data menerima referensi mutable ke Vec dan menggandakan setiap elemen. iter_mut() mengembalikan iterator dengan referensi mutable. *item melakukan dereference referensi untuk penugasan. Setelah process_data, numbers tetap dapat diakses — kepemilikan tidak dipindahkan, hanya dipinjamkan.

Lifetimes: masa hidup referensi

Lifetimes ('a) — anotasi untuk mengikat masa hidup referensi. Kompiler menggunakannya untuk memeriksa bahwa referensi tidak hidup lebih lama dari data yang ditunjuknya. Dalam banyak kasus, lifetimes disimpulkan secara otomatis — hanya perlu ditentukan dalam tanda tangan fungsi dengan referensi.

rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}

fn main() {
    let string1 = String::from("rust");
    let result;
    {
        let string2 = String::from("mobile");
        result = longest(string1.as_str(), string2.as_str());
        println!("Terpanjang: {}", result);
    } // string2 hidup sampai kurung ini, result valid di dalam
    // println!("{}", result); // kesalahan: string2 mati
}

Rust untuk modul native Android dan iOS

Rust dikompilasi menjadi pustaka native untuk Android (.so melalui NDK) dan iOS (.a pustaka statis). Google secara resmi mendukung Rust di Android Open Source Project (AOSP) — komponen Bluetooth (ava), DNS-over-HTTP3, dan CriticalNotification ditulis dalam Rust. Menurut Google (2025), Rust di Android telah menghilangkan 70% kerentanan memori di komponen target.

Untuk Android digunakan cargo-ndk, yang membungkus Cargo dengan toolchain yang tepat untuk ABI yang dipilih. Pembangunan untuk Android meliputi: aarch64-linux-android (ARM 64-bit, perangkat modern), armv7-linux-androideabi (ARM 32-bit), x86_64-linux-android (emulator).

rust
// Cargo.toml — konfigurasi pustaka untuk Android/iOS
[package]
name = "mobile_crypto"
version = "0.1.0"

[lib]
crate-type = ["staticlib", "cdylib"]

[dependencies]
serde = { version = "1", features = ["derive"] }
libc = "0.2"

crate-type: staticlib — untuk iOS (.a), cdylib — untuk Android (.so). serde — serialisasi untuk pertukaran data dengan Kotlin/Swift. libc — tipe yang kompatibel dengan C untuk FFI.

Contoh: pemrosesan gambar di Rust

rust
use std::ffi::{CStr, CString};
use std::os::raw::c_char;

/// Fungsi kompatibel C untuk pemrosesan gambar
#[no_mangle]
pub unsafe extern "C" fn process_image(
    input: *const u8,
    len: usize,
    output: *mut u8,
    out_len: *mut usize,
) {
    let input_slice = std::slice::from_raw_parts(input, len);
    let result: Vec<u8> = input_slice.iter()
        .map(|b| b ^ 0xFF)
        .collect();
    let result_len = result.len();
    std::ptr::copy_nonoverlapping(result.as_ptr(), output, result_len);
    *out_len = result_len;
}

#[no_mangle] menonaktifkan name mangling untuk ABI yang kompatibel dengan C. extern "C" mengatur konvensi pemanggilan C. unsafe — penanda bahwa panggilan dari luar Rust tidak menjamin keamanan. std::ptr::copy_nonoverlapping menyalin byte hasil ke buffer keluaran.

SDK lintas platform di Rust

Rust — kandidat ideal untuk SDK lintas platform yang berjalan di Android dan iOS dari satu basis kode. Perusahaan Mozilla (Firefox), Dropbox (sinkronisasi file), dan Meta (Libra blockchain) memilih Rust untuk komponen kritis aplikasi mobile mereka.

Keunggulan pustaka Rust dibandingkan C++: kompiler menjamin tidak adanya kebocoran memori dan race condition data dalam kode lintas platform. Kode yang ditulis dan diuji sekali di Rust bekerja identik di semua platform. Cargo mengelola dependensi secara native, tanpa CMake dan vcpkg.

Pustaka/CrateFungsi
tonicKlien/server gRPC di Rust
reqwestKlien HTTP dengan async/await
ringKriptografi (AES, RSA, ECDSA)
sqlxKerja asinkron dengan SQLite, PostgreSQL
wasm-bindgenIntegrasi Rust dengan JavaScript/WASM
ndk-glueAndroid NativeActivity di Rust
uniffiPembuatan binding FFI untuk Kotlin/Swift

Rust dan WebAssembly untuk aplikasi mobile

Rust dikompilasi menjadi WebAssembly (Wasm) — format biner yang dapat dijalankan di browser dan perangkat mobile. Wasm memberikan performa near-native di lingkungan web. Dalam pengembangan mobile, Wasm digunakan di aplikasi hybrid (WebView + Wasm) untuk komputasi kompleks: rendering 3D, pengenalan gambar, enkripsi.

wasm-pack mengompilasi Rust menjadi .wasm dan menghasilkan wrapper JS. wasm-bindgen menghubungkan fungsi Rust dengan panggilan JavaScript. Di perangkat mobile, Wasm-runner dapat berjalan di WebView atau melalui SDK Wasmer/Wasmtime.

rust
use wasm_bindgen::prelude::*;

/// Perhitungan bilangan Fibonacci di Wasm (dipanggil dari JS)
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u64 {
    match n {
        0 => 0,
        1 => 1,
        _ => {
            let mut a = 0;
            let mut b = 1;
            for _ in 2..=n {
                let temp = a + b;
                a = b;
                b = temp;
            }
            b
        }
    }
}

#[wasm_bindgen] menghasilkan wrapper JavaScript untuk fungsi fibonacci. Di browser, panggilan terlihat seperti wasm.fibonacci(10). Tipe u32/u64 secara otomatis dikonversi menjadi Number/BigInt. Modul Wasm berbobot ~5 KB untuk fungsi semacam itu — overhead minimal.

FFI: memanggil Rust dari Kotlin dan Swift

FFI (Foreign Function Interface) — mekanisme pemanggilan kode Rust dari bahasa lain. Fungsi Rust dengan extern "C" dan #[no_mangle] diekspor dengan ABI kompatibel C. Dari Kotlin, fungsi tersebut dipanggil melalui JNI, dari Swift — melalui @_cdecl ("name") atau CBridge.h.

UniFFI — alat Mozilla untuk menghasilkan binding FFI. Anda mendeskripsikan API dalam file .udl, UniFFI secara otomatis menghasilkan wrapper Kotlin dan Swift. Ini adalah pendekatan standar untuk komponen Rust di Firefox Android dan Firefox iOS.

rust
// Pustaka Rust dengan antarmuka UniFFI
uniffi::setup_scaffolding!();

#[derive(uniffi::Enum)]
pub enum EncryptionError {
    InvalidKey,
    EncryptionFailed,
}

#[derive(uniffi::Record)]
pub struct EncryptedData {
    pub ciphertext: Vec<u8>,
    pub nonce: Vec<u8>,
}

#[uniffi::export]
pub fn encrypt(key: &[u8], plaintext: &[u8]) -> Result<EncryptedData, EncryptionError> {
    // implementasi AES-256-GCM
    todo!()
}

UniFFI menghasilkan kelas Kotlin dengan metode encrypt yang menerima ByteArray dan mengembalikan EncryptedData. Di Swift, dibuat struct EncryptedData dengan bidang ciphertext (Data) dan nonce (Data). Kesalahan diubah menjadi eksepsi Kotlin/Swift.

Rust vs C++: perbandingan untuk pengembangan mobile

Rust dan C++ — dua bahasa utama untuk pemrograman sistem dalam pengembangan mobile. Keduanya dikompilasi menjadi kode native untuk ARM dan mendukung FFI melalui C ABI. Perbedaan utama — model keamanan memori: Rust memeriksanya pada tahap kompilasi, C++ mengandalkan disiplin pengembang.

KriteriaRustC++
Keamanan memoriDijamin (ownership)Tanggung jawab pengembang
Garbage collectorTidak (RAII + ownership)Tidak (manajemen manual)
Kebocoran memoriDicegah oleh kompilerMungkin (new tanpa delete)
Race condition dataDicegah (Send + Sync)Mungkin
Android NDKMelalui cargo-ndkMelalui CMake / NDK Build
Dukungan iOScargo-lipo + .aXcode + .a
PembangunanCargo (terintegrasi)CMake / Ninja
Waktu pembangunan2–5 menit (clean)5–15 menit (clean)
Ekosistemcrates.io (200k+ crate)vcpkg / Conan (100k+ pustaka)

Rust lebih aman daripada C++ dan lebih produktif — kompiler menangkap kesalahan yang di C++ akan muncul saat runtime. C++ memiliki ekosistem pustaka mobile yang lebih kaya. Untuk proyek baru, Rust lebih disukai; kode C++ yang ada diporting secara bertahap.

Pertanyaan yang Sering Diajukan

Apa perbedaan Rust dengan C++ untuk pengembangan mobile?

Perbedaan utama — keamanan memori pada tahap kompilasi. Di Rust tidak ada nullptr, pointer menggantung, dan race condition data berkat sistem kepemilikan (ownership) dan borrow checker. C++ mengandalkan disiplin pengembang, Rust — pada pemeriksaan kompiler.

Bisakah Rust digunakan dalam pengembangan Android?

Ya, melalui Android NDK. Google secara resmi mendukung Rust di AOSP (Android Open Source Project). Rust dikompilasi menjadi pustaka .so melalui cargo-ndk. FFI (Foreign Function Interface) melalui JNI bekerja sama seperti untuk C++.

Apa itu cargo dan bagaimana membantu pengembangan Rust?

Cargo — manajer paket dan sistem pembangunan Rust. Ia mengunduh dependensi dari crates.io, mengompilasi proyek, dan menjalankan tes. Dalam pengembangan mobile, cargo-ndk memperluas Cargo untuk kompilasi silang ke Android ABI.

Apakah Rust cocok untuk iOS atau hanya Android?

Rust mendukung kedua platform. Untuk iOS digunakan cargo-lipo untuk biner universal (arm64 + x86_64 simulator). Kode Rust dikompilasi menjadi pustaka statis .a dan ditautkan melalui Xcode.

Apakah layak belajar Rust untuk pengembangan mobile di tahun 2026?

Ya, Rust menjadi standar untuk SDK lintas platform dan modul native. Google, Meta, dan Mozilla berinvestasi di Rust. Untuk komponen performance-critical, Rust lebih aman dan produktif daripada C++.

Kesimpulan

  • Rust — bahasa sistem dengan keamanan memori tanpa GC berkat ownership, borrowing, dan lifetimes
  • Borrow checker mencegah race condition data dan pointer menggantung pada tahap kompilasi
  • Modul native dibangun melalui cargo-ndk (Android .so) dan cargo-lipo (iOS .a)
  • UniFFI menghasilkan binding FFI untuk Kotlin dan Swift — standar Mozilla untuk SDK mobile
  • WebAssembly memungkinkan Rust berjalan di WebView mobile dengan performa near-native
  • Google menggunakan Rust di AOSP — kerentanan memori di komponen target berkurang 70%
  • Rust vs C++: Rust lebih aman, C++ dengan ekosistem lebih kaya; untuk modul native baru pilih Rust

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