Rust در توسعه موبایل: ماژول‌های بومی و SDKهای بین‌پلتفرمی

نویسنده: IT Sectr منتشر شده: 2026-02-11 زمان مطالعه: 10 دقیقه

Rust — یک زبان برنامه‌نویسی سیستمی با تضمین امنیت حافظه در زمان کامپایل است. توسط Mozilla Research در سال ۲۰۱۰ به رهبری گری‌دون هور توسعه یافت. Rust از کلاس‌های کاملی از آسیب‌پذیری‌ها جلوگیری می‌کند: اشاره‌گرهای null، مراجع آویزان و رقابت داده‌ها. در توسعه موبایل، Rust برای ماژول‌های بومی، SDKهای بین‌پلتفرمی و WebAssembly استفاده می‌شود. بر اساس نظرسنجی Stack Overflow (2025)، Rust برای نهمین سال متوالی رتبه اول «زبان محبوب» را دارد.

نکات اصلی

  • Rust — زبان سیستمی با امنیت حافظه بدون زباله‌روب از طریق سیستم مالکیت (ownership)
  • Borrow checker — تحلیل‌گر قرض‌گیری که مراجع را در زمان کامپایل بررسی کرده و از رقابت داده‌ها جلوگیری می‌کند
  • ماژول‌های بومی در Rust از طریق cargo-ndk و cargo-lipo به .so برای Android و .a برای iOS کامپایل می‌شوند
  • WebAssembly (Wasm) اجرای کد Rust را در مرورگر و دستگاه‌های موبایل با عملکرد near-native ممکن می‌سازد
  • FFI (Foreign Function Interface) — مکانیزم فراخوانی Rust از Java، Kotlin و Swift از طریق ABI سازگار با C

Rust چیست؟

Rust — یک زبان برنامه‌نویسی سیستمی با تایپ ایستا و انتزاع با هزینه صفر (zero-cost abstractions) است. Rust به لطف سیستم مالکیت (ownership)، قرض‌گیری (borrowing) و طول عمر (lifetimes) امنیت حافظه را بدون زباله‌روب تضمین می‌کند. کامپایلر Rust یکی از سخت‌گیرانه‌ترین‌هاست — کدی را که در C++ رفتار نامعین ایجاد می‌کند رد می‌کند.

Rust از طریق LLVM به کد بومی برای تمام معماری‌ها کامپایل می‌شود: ARM، x86، RISC-V، WebAssembly. ابزارها: rustup (نصب‌کننده)، rustc (کامپایلر)، cargo (مدیر بسته و سیستم ساخت). cargo.toml — مشابه package.json، شامل وابستگی‌های crates.io است. نسخه فعلی — Rust 1.81 (2025).

حوزه‌های کلیدی کاربرد Rust در توسعه موبایل: کتابخانه‌های بومی (Android NDK, iOS)، SDKهای بین‌پلتفرمی (Firefox, Dropbox)، جایگزینی C++ در بخش‌های performance-critical، WebAssembly برای برنامه‌های ترکیبی. Google از Rust در AOSP (Android Open Source Project) برای کامپوننت‌های Bluetooth، Wi-Fi و NFC استفاده می‌کند.

نصب و پیکربندی Rust برای توسعه موبایل

برای کامپایل متقاطع برای Android به toolchain‌های هدف نیاز است: rustup target add aarch64-linux-android armv7-linux-androideabi. برای iOS — aarch64-apple-ios x86_64-apple-ios. cargo-ndk (برای Android) و cargo-lipo (برای iOS) ساخت را ساده می‌کنند.

sh
# نصب Rust و پلتفرم‌های هدف برای توسعه موبایل
$ 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

# نصب cargo-ndk برای ساخت Android
$ cargo install cargo-ndk

# ساخت برای Android
$ cargo ndk -t arm64-v8a -o ./jniLibs build --release

سیستم مالکیت: ownership، borrowing و lifetimes

Ownership (مالکیت) — مفهوم بنیادین Rust. هر مقدار دقیقاً یک مالک دارد. هنگام انتساب یا ارسال به تابع، مالکیت منتقل می‌شود (move). پس از انتقال، مالک قدیمی نمی‌تواند از مقدار استفاده کند. این کار آزادسازی دوگانه حافظه و اشاره‌گرهای آویزان را حذف می‌کند.

Borrowing (قرض‌گیری) امکان استفاده موقت از مرجع به یک مقدار بدون انتقال مالکیت را فراهم می‌کند. مرجع &T (تغییرناپذیر) — هر تعداد خواننده. مرجع &mut T (تغییرپذیر) — دقیقاً یک نویسنده، بدون خواننده. کامپایلر این قوانین را در مرحله ساخت بررسی می‌کند.

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!("پردازش شد: {:?}", numbers);

    let first = &numbers[0];  // قرض‌گیری تغییرناپذیر
    println!("اولین: {}", first);
}

process_data یک مرجع تغییرپذیر به Vec دریافت می‌کند و هر عنصر را دو برابر می‌کند. iter_mut() یک تکرارکننده با مراجع تغییرپذیر برمی‌گرداند. *item مرجع را برای انتساب dereference می‌کند. بعد از process_data، numbers همچنان قابل دسترس است — مالکیت منتقل نشده، فقط قرض داده شده است.

Lifetimes: طول عمر مراجع

Lifetimes ('a) — حاشیه‌نویسی‌هایی برای پیوند طول عمر مراجع. کامپایلر از آن‌ها برای بررسی این که مرجع از داده‌ای که به آن اشاره می‌کند بیشتر عمر نمی‌کند استفاده می‌کند. در بیشتر موارد lifetimes به طور خودکار استنتاج می‌شوند — فقط در امضای توابع با مراجع باید آن‌ها را مشخص کرد.

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!("طولانی‌ترین: {}", result);
    } // string2 تا این براکت زنده است، result در داخل معتبر است
    // println!("{}", result); // خطا: string2 مرد
}

Rust برای ماژول‌های بومی Android و iOS

Rust به کتابخانه‌های بومی برای Android (.so از طریق NDK) و iOS (.a کتابخانه‌های ایستا) کامپایل می‌شود. Google به طور رسمی از Rust در Android Open Source Project (AOSP) پشتیبانی می‌کند — کامپوننت‌های Bluetooth (ava)، DNS-over-HTTP3 و CriticalNotification در Rust نوشته شده‌اند. طبق Google (2025)، Rust در Android آسیب‌پذیری‌های حافظه را در کامپوننت‌های هدف ۷۰٪ کاهش داد.

برای Android از cargo-ndk استفاده می‌شود که Cargo را با toolchain مناسب برای ABI انتخاب شده می‌پیچد. ساخت برای Android شامل: aarch64-linux-android (ARM 64-bit، دستگاه‌های مدرن)، armv7-linux-androideabi (ARM 32-bit)، x86_64-linux-android (شبیه‌سازها).

rust
// Cargo.toml — پیکربندی کتابخانه برای 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 — برای iOS (.a)، cdylib — برای Android (.so). serde — سریال‌سازی برای تبادل داده با Kotlin/Swift. libc — انواع سازگار با C برای FFI.

مثال: پردازش تصویر در Rust

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

/// تابع سازگار با C برای پردازش تصویر
#[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] name mangling را برای ABI سازگار با C غیرفعال می‌کند. extern "C" قرارداد فراخوانی C را تنظیم می‌کند. unsafe — نشانگر این که فراخوانی از خارج Rust امنیت را تضمین نمی‌کند. std::ptr::copy_nonoverlapping بایت‌های نتیجه را در بافر خروجی کپی می‌کند.

SDKهای بین‌پلتفرمی در Rust

Rust — نامزد ایده‌آل برای SDKهای بین‌پلتفرمی است که از یک پایه کد روی Android و iOS کار می‌کنند. شرکت‌های Mozilla (Firefox)، Dropbox (همگام‌سازی فایل) و Meta (Libra blockchain) Rust را برای کامپوننت‌های حیاتی برنامه‌های موبایل خود انتخاب کرده‌اند.

مزایای کتابخانه Rust در مقایسه با C++: کامپایلر عدم وجود نشت حافظه و رقابت داده‌ها را در کد بین‌پلتفرمی تضمین می‌کند. کد نوشته شده و تست شده در Rust روی همه پلتفرم‌ها یکسان کار می‌کند. Cargo وابستگی‌ها را به صورت بومی و بدون CMake و vcpkg مدیریت می‌کند.

کتابخانه/Crateکاربرد
tonicکلاینت/سرور gRPC در Rust
reqwestکلاینت HTTP با async/await
ringرمزنگاری (AES, RSA, ECDSA)
sqlxکار ناهمگام با SQLite, PostgreSQL
wasm-bindgenادغام Rust با JavaScript/WASM
ndk-glueAndroid NativeActivity در Rust
uniffiتولید پیوندهای FFI برای Kotlin/Swift

Rust و WebAssembly برای برنامه‌های موبایل

Rust به WebAssembly (Wasm) — فرمت باینری قابل اجرا در مرورگر و دستگاه‌های موبایل کامپایل می‌شود. Wasm عملکرد near-native را در محیط وب فراهم می‌کند. در توسعه موبایل، Wasm در برنامه‌های ترکیبی (WebView + Wasm) برای محاسبات پیچیده استفاده می‌شود: رندرینگ سه‌بعدی، تشخیص تصویر، رمزنگاری.

wasm-pack Rust را به .wasm کامپایل کرده و یک لفافه JS تولید می‌کند. wasm-bindgen توابع Rust را با فراخوانی‌های JavaScript مرتبط می‌کند. در دستگاه موبایل، Wasm-runner می‌تواند در WebView یا از طریق SDKهای Wasmer/Wasmtime اجرا شود.

rust
use wasm_bindgen::prelude::*;

/// محاسبه عدد فیبوناچی در Wasm (فراخوانی شده از 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] یک لفافه JavaScript برای تابع fibonacci تولید می‌کند. در مرورگر، فراخوانی به صورت wasm.fibonacci(10) دیده می‌شود. انواع u32/u64 به طور خودکار به Number/BigInt تبدیل می‌شوند. ماژول Wasm برای چنین تابعی ~۵ کیلوبایت وزن دارد — سربار حداقلی.

FFI: فراخوانی Rust از Kotlin و Swift

FFI (Foreign Function Interface) — مکانیزم فراخوانی کد Rust از زبان‌های دیگر است. توابع Rust با extern "C" و #[no_mangle] با ABI سازگار با C صادر می‌شوند. از Kotlin چنین توابعی از طریق JNI و از Swift از طریق @_cdecl ("name") یا CBridge.h فراخوانی می‌شوند.

UniFFI — ابزار Mozilla برای تولید پیوندهای FFI. API را در فایل .udl توصیف می‌کنید، UniFFI به طور خودکار لفافه‌های Kotlin و Swift را تولید می‌کند. این رویکرد استاندارد برای کامپوننت‌های Rust در Firefox Android و Firefox iOS است.

rust
// کتابخانه Rust با رابط 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> {
    // پیاده‌سازی AES-256-GCM
    todo!()
}

UniFFI یک کلاس Kotlin با متد encrypt تولید می‌کند که ByteArray دریافت کرده و EncryptedData برمی‌گرداند. در Swift یک struct EncryptedData با فیلدهای ciphertext (Data) و nonce (Data) ایجاد می‌شود. خطاها به استثناهای Kotlin/Swift تبدیل می‌شوند.

Rust در مقابل C++: مقایسه برای توسعه موبایل

Rust و C++ — دو زبان اصلی برای برنامه‌نویسی سیستمی در توسعه موبایل هستند. هر دو به کد بومی برای ARM کامپایل می‌شوند و FFI را از طریق C ABI پشتیبانی می‌کنند. تفاوت اصلی — مدل امنیت حافظه: Rust آن را در زمان کامپایل بررسی می‌کند، C++ به انضباط برنامه‌نویس متکی است.

معیارRustC++
امنیت حافظهتضمین شده (ownership)مسئولیت برنامه‌نویس
زباله‌روبخیر (RAII + ownership)خیر (مدیریت دستی)
نشت حافظهجلوگیری شده توسط کامپایلرممکن (new بدون delete)
رقابت داده‌هاجلوگیری شده (Send + Sync)ممکن
Android NDKاز طریق cargo-ndkاز طریق CMake / NDK Build
پشتیبانی iOScargo-lipo + .aXcode + .a
ساختCargo (داخلی)CMake / Ninja
زمان ساخت۲–۵ دقیقه (clean)۵–۱۵ دقیقه (clean)
اکوسیستمcrates.io (۲۰۰k+ کریت)vcpkg / Conan (۱۰۰k+ کتابخانه)

Rust از C++ امن‌تر و پربازده‌تر است — کامپایلر خطاهایی را می‌گیرد که در C++ در زمان اجرا ظاهر می‌شدند. C++ اکوسیستم غنی‌تری از کتابخانه‌های موبایل دارد. برای پروژه‌های جدید Rust ترجیح داده می‌شود؛ کد C++ موجود به تدریج منتقل می‌شود.

سؤالات متداول

تفاوت Rust با C++ برای توسعه موبایل چیست؟

تفاوت اصلی — امنیت حافظه در زمان کامپایل است. در Rust به لطف سیستم مالکیت (ownership) و borrow checker، nullptr، اشاره‌گرهای آویزان و رقابت داده‌ها وجود ندارد. C++ به انضباط برنامه‌نویس متکی است، Rust — به بررسی‌های کامپایلر.

آیا می‌توان از Rust در توسعه Android استفاده کرد؟

بله، از طریق Android NDK. Google به طور رسمی از Rust در AOSP (Android Open Source Project) پشتیبانی می‌کند. Rust از طریق cargo-ndk به کتابخانه‌های .so کامپایل می‌شود. FFI (Foreign Function Interface) از طریق JNI دقیقاً مانند C++ کار می‌کند.

Cargo چیست و چگونه در توسعه Rust کمک می‌کند؟

Cargo — مدیر بسته و سیستم ساخت Rust است. وابستگی‌ها را از crates.io دانلود می‌کند، پروژه را کامپایل کرده و تست‌ها را اجرا می‌کند. در توسعه موبایل، cargo-ndk Cargo را برای کامپایل متقاطع برای Android ABI گسترش می‌دهد.

آیا Rust برای iOS مناسب است یا فقط Android؟

Rust از هر دو پلتفرم پشتیبانی می‌کند. برای iOS از cargo-lipo برای باینری‌های جهانی (arm64 + x86_64 شبیه‌ساز) استفاده می‌شود. کد Rust به کتابخانه ایستا .a کامپایل شده و از طریق Xcode لینک می‌شود.

آیا در سال ۲۰۲۶ ارزش یادگیری Rust برای توسعه موبایل را دارد؟

بله، Rust در حال تبدیل شدن به استانداردی برای SDKهای بین‌پلتفرمی و ماژول‌های بومی است. Google، Meta و Mozilla روی Rust سرمایه‌گذاری می‌کنند. برای کامپوننت‌های performance-critical، Rust از C++ امن‌تر و پربازده‌تر است.

خلاصه

  • Rust — زبان سیستمی با امنیت حافظه بدون GC به لطف ownership، borrowing و lifetimes
  • Borrow checker از رقابت داده‌ها و اشاره‌گرهای آویزان در زمان کامپایل جلوگیری می‌کند
  • ماژول‌های بومی از طریق cargo-ndk (Android .so) و cargo-lipo (iOS .a) ساخته می‌شوند
  • UniFFI پیوندهای FFI را برای Kotlin و Swift تولید می‌کند — استاندارد Mozilla برای SDKهای موبایل
  • WebAssembly اجرای Rust را در WebView موبایل با عملکرد near-native ممکن می‌سازد
  • Google از Rust استفاده می‌کند در AOSP — آسیب‌پذیری‌های حافظه در کامپوننت‌های هدف ۷۰٪ کاهش یافت
  • Rust vs C++: Rust امن‌تر، C++ با اکوسیستم غنی‌تر؛ برای ماژول‌های بومی جدید Rust انتخاب می‌شود

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید