當開發者決定使用 Rust 撰寫行動端 App 的核心邏輯時,通常會面臨兩個選擇:是使用 UniFFI 來建立簡單的橋接,還是採用 Crux 這種高度架構化的模式?雖然兩者都旨在實現「核心邏輯共享」,但它們的設計哲學截然不同。
1. UniFFI:強大的「跨語言橋樑」 (The Bridge)
UniFFI 是由 Mozilla 開發的工具,它的目標非常純粹:讓 Rust 代碼在其他語言中看起來像原生代碼。- 核心理念:它是一個 FFI(外部函數介面)生成器。你只需要在 Rust 中定義好函數、結構體(Struct)和列舉(Enum),UniFFI 就會為你自動生成 Swift 和 Kotlin 的封裝代碼。
- 運作方式:
- 在 Swift 中,你調用的是一個標準的 Swift 類別。
- 在 Kotlin 中,你調用的是一個標準的 Kotlin 對象。
- 優點:
- 低侵入性:你可以只把 App 的某個小模組(例如加密算法或圖片解碼)交給 Rust,其餘部分維持原樣。
- 學習曲線平緩:如果你已經有現成的 Rust 函式庫,透過 UniFFI 封裝非常快速。
- 缺點:它不強制要求你如何組織 App 的架構,雙平台的 UI 邏輯(例如點擊按鈕後該顯示哪個畫面)仍需各自實現,容易導致邏輯發散。
2. Crux:嚴謹的「狀態管理框架」 (The Framework)
Crux(由 Red Badger 開發)則更進一步,它不只是一個工具,而是一套基於 Elm 架構 (TEA) 的開發規範。
- 核心理念:它主張將 UI 渲染 與 業務行為 完全分離。Rust 核心不僅處理運算,還負責管理 App 的狀態(State)。
- 運作方式:
- 外殼 (Shell):原生 UI(SwiftUI/Compose)只負責傳遞「事件」給 Rust(例如:用戶點擊了登入)。
- 核心 (Core):Rust 處理事件,並回傳一個「效果 (Effect)」,告訴外殼該做什麼(例如:發送網路請求或更新 UI 顯示文字)。
- 優點:
- 邏輯高度一致:連「按鈕點擊後的跳轉邏輯」都寫在 Rust 中,確保 iOS 和 Android 的行為完全同步。
- 極致的可測試性:因為邏輯與 UI 徹底分離,你可以在沒有手機模擬器的情況下,在終端機測試 App 的所有交互流程。
- 缺點:架構較為複雜,開發者需要理解「消息傳遞」與「副作用隔離」的概念,初期開發成本較高。
4. 該如何選擇?
- 選擇 UniFFI 的時機:
如果你正在為已有的原生 App 增加功能,或者你只想將某個運算密集的模組(如影片剪輯引擎)從原生改為 Rust 以提升性能,UniFFI 是最穩定且簡單的選擇。 - 選擇 Crux 的時機:
如果你正要從零開始開發一個全新的跨平台 App,且你希望將 iOS 和 Android 之間的差異降到最低,同時對自動化測試有極高要求,Crux 提供的「核心管理狀態」模式會讓後期的維護輕鬆許多。














