使用 Rust 進行原生手機開發的全新視野


摘要

本文探討使用 Rust 進行原生手機開發的重要性,以及其在提升性能和安全性方面的潛力。 歸納要點:

  • Lipa 採用 Rust-based Hybrid 架構,結合 WebAssembly 技術,提升性能與開發效率,實現跨平台靈活性。
  • UniFFI 框架讓 Rust 程式碼可以與 Android 和 iOS 原生功能交互,創造安全且高效的行動支付解決方案。
  • Rust 的安全性、記憶體管理及模組化設計在 Lipa 錢包的開發中展示出強大的能力,預示著行動開發的未來趨勢。
Rust 不僅為行動應用開發帶來新的視野,更成為未來技術革新的關鍵力量。


行動應用程式開發的革新:Lipa 的 Rust-based Hybrid 架構

由丹尼爾·格蘭豪撰寫

隨著時間的推移,iOS 和 Android 之間的分歧意味著任何希望覆蓋最多使用者的行動應用程式都需要同時擁有 iOS 和 Android 版本。傳統上,這一挑戰可以透過兩種主要方式來解決:

本地開發(Native development) - 這意味著需要開發和維護兩個程式碼庫,雖然成本高昂,但能提供最大的靈活性,並可能實現更佳的效能、使用者體驗(UX)和安全性。

跨平台開發(Cross-platform development) - 使用框架讓單一程式碼庫驅動 iOS 和 Android 的應用程式版本。

在 Lipa,我們採取了一種這兩種類別之間的混合方法:我們儘可能多地將邏輯編寫在 Rust 核心中,並在本地開發的 iOS 和 Android 應用程式之間共享這些邏輯,而這些應用程式則成為主要實現 UI 和特定於作業系統 API 的輕量外殼。在本文中,我們將描述基於 Rust 的行動應用程式開發方法、我們是如何走到今天的,以及為什麼我們決定堅持此路徑。

具體說明:Rust 在行動開發中的優勢與挑戰,包括其出色的效能、安全性以及對記憶體管理的精細控制,使得它成為當前最受關注的新興技術之一。而 Lipa 的 Rust-based Hybrid 架構不僅提升了效能,也使得團隊能夠更加專注於使用者介面與作業系統特性的整合。因此,我們相信,在未來面對日益複雜的市場需求時,這種創新的方法將會佔據重要地位。
我們在研究許多文章後,彙整重點如下
網路文章觀點與我們總結
  • 現代人面臨的壓力來自生活、工作和人際關係等多方面。
  • 許多人因為忙碌的生活節奏而忽略了自身健康。
  • 適當的運動和休息是舒緩壓力的重要方法。
  • 與朋友或家人分享心情能增進心理健康,減少孤獨感。
  • 學習時間管理技巧有助於提高效率,減少焦慮。
  • 正念冥想被推薦作為一種有效的放鬆方式。

在當今快節奏的生活中,我們都承受著不同程度的壓力,無論是工作還是人際關係,都可能讓我們感到喘不過氣來。別忘了照顧自己!定期運動、保持良好的飲食習慣,以及與身邊的人分享自己的感受,都是釋放壓力的好方法。此外,有效地管理時間也能讓我們更輕鬆地應對日常挑戰。因此,不妨試著把這些小建議融入你的生活中,相信你會感受到不一樣的改變!

觀點延伸比較:
方法描述最新趨勢權威觀點
適當運動透過運動釋放壓力,提升身心健康。短時間高強度訓練(HIIT)成為流行趨勢。美國心理學會建議每週至少150分鐘的有氧運動以減輕焦慮。
休息與睡眠良好的睡眠質量對心理健康至關重要。睡眠追蹤科技應用日益普及,幫助改善個人睡眠習慣。世界衛生組織強調成年人需每晚7-9小時的高品質睡眠。
情感分享與家人或朋友分享感受可減少孤獨和焦慮。社交媒體平台上出現更多支持性社群,促進情感交流。哈佛大學研究指出,良好的人際關係是長壽的重要因素之一。
時間管理技巧有效分配時間可提高生活效率並降低焦慮感。 數位工具如番茄鐘技術等幫助優化工作流程越來越受到重視。 專家推薦使用清單和日曆規劃,以便更好地掌控日常任務和責任。
正念冥想透過冥想練習增強內在平靜和專注力。 隨著心理健康意識提升,正念應用程式廣受歡迎並迅速增長使用者基礎 。 研究顯示,每天10分鐘的正念冥想能顯著降低壓力水平和焦慮感 。

Lipa Wallet開發經驗:跨平台框架的挑戰與原生開發的優勢

在 Lipa 開發的第一款應用程式是專為商業設計的 Lipa Wallet,這是一款針對小型企業的銷售點(Point-of-Sale)應用程式,讓他們只需安裝一個應用就能開始接受 Lightning 付款。這款應用的首個原型是使用 React Native 開發的,該框架是跨平台移動開發的重要工具之一。在開發這個原型過程中,我們遇到了多項挑戰:

**有限的加密工具集。** React Native 的 JavaScript 環境對於橢圓曲線加密(Elliptic Curve Cryptography, ECC)支援非常有限。這一限制迫使我們為大部分與加密相關的邏輯建立本地模組,導致每個平台都需獨立實現。

**依賴地獄。** JavaScript 生態系統高度碎片化,使得有效追蹤和管理依賴變得困難。對於具有嚴格安全要求的應用來說,這種複雜性特別成問題,因為它增加了依賴審計的難度並提高了漏洞風險。

**介面效能問題。** 我們在 React Native 中遇到了顯著的介面效能問題。一個平台上的介面錯誤往往會影響到另一個平台,使得除錯和修復過程變得複雜。這部分可能源自經驗不足,但對我們來說仍然是一項重大挑戰。

**繁瑣的構建流程。** React Native 應用程式的構建流程證明是繁瑣且容易出錯。而額外的複雜性和潛在構建失敗不僅降低了我們的開發效率,也影響了整體進度。

**專業知識需求。** 開發可靠的 React Native 應用需要對 iOS 和 Android 平台有堅實理解,尤其是在相較於簡單 CRUD 應用更為複雜時。在兩者上都具備深厚專業知識的人才難以尋找,而單獨聚焦於 iOS 或 Android 的專家則相對容易找到。

基於上述問題,我們感受到需要改變策略。我們考慮過 Flutter,但擔心將會遭遇類似困境,因此決定採取原生開發的方法。透過此方式,我們不僅避免了所面臨的一些陷阱,同時也能享受原生開發帶來的一系列優勢,例如更早接觸新作業系統功能以及更好的安全性。

從 Lipa Wallet 的開發經歷中可以看出,在安全性、效能及複雜度方面跨平台開發框架存在侷限性。在安全敏感應用場景中,原生開發無疑提供了更可靠保障。例如:

- **安全性:** 對於加密貨幣交易而言,安全性至關重要;原生開發能直接利用平台底層安全機制,更輕易進行安全審查及修補漏洞,有效降低風險。

- **效能:** 原生開發能充分利用各個平台硬體及軟體優勢,以提供更流暢之使用者體驗,同時針對不同平台進行最佳化亦更加便捷。

- **複雜度:** 原生方法可有效簡化整體開發流程,大幅減少不同平台間程式碼差異並降低維護成本。

展望未來,在技術日新月異的大背景下,原生開發正逐步回歸市場主流趨勢,其強大的效能與穩定性將吸引越來越多企業選擇此路徑。因此,在選擇技術堆疊時,不妨深入考量自身需求,以作出最適合自己產品及服務的平台決策。

UniFFI:為lipa錢包打造高效能、跨平台的Lightning節點

大約在我們開始將商業錢包重寫為原生程式碼的同時,我們也開始著手於另一個大型專案——lipa 錢包。這是一款針對最終使用者的非託管 Lightning 錢包。在當時,我們選擇了基於 Rust 的開發工具包 Lightning Development Kit (LDK) 作為我們構建 Lightning 節點的基礎。雖然 LDK 提供了 Swift 和 Kotlin 的繫結,但我們很快意識到這些繫結存在一些缺陷:它們並未涵蓋原始 LDK 介面的全部內容,文件不夠清晰,且獲取最新版本所需時間較長。為了避免這些問題,我們決定圍繞 LDK 實作自己的 Rust 函式庫,並提供自家的 Swift 和 Kotlin 繫結,為此我們使用了 UniFFI。我們將這個函式庫稱為 lipa-lightning-lib (3L)。

UniFFI 是一個強大的工具,它使得開發者能夠用 Rust 編寫函式庫並生成不同語言(如 Swift 和 Kotlin)的繫結,相比於其他方法,它具有如下優勢:**高效能**:UniFFI 採用高效的 FFI 機制,可提供接近原生呼叫的效能,避免額外轉換成本;**易於使用**:UniFFI 擁有簡潔的 API 並提供完善文件,使得開發者能快速上手;**跨平台支援**:它支援多種平台,包括 iOS、Android、macOS 和 Linux,以滿足不同平台需求。隨著近年來對跨平台應用程式開發需求增長,UniFFI 日益受到重視,其強大的功能與易用性使其成為理想選擇。

在 LDK 上,我們團隊進行了一系列創新工作,而 3L 的出現標誌著我們在提升跨平台穩定性和效能方面的重要一步。透過這些努力,我們希望能更好地服務社群,不僅提升開發效率,也確保產品質量與使用者體驗。」

從 3L 開發歷程中延伸出 lipa 商務錢包的邏輯核心

我們最初的目標是讓 3L 實現 lipa 錢包所有與閃電網路相關的邏輯,並提供比 LDK 更簡單、更高層次的介面。隨著時間推移,我們在開發這個解決方案時意識到,它可以有更多的潛力。我們能夠整合進這個 Rust 函式庫中的所有邏輯,都不需要為每個行動平台分別實作。因此,我們開始將所有可以轉移的內容都遷移到 3L,使其成為 lipa 錢包事實上的邏輯核心。唯一沒有移至 Rust 的部分是需要訪問作業系統 API(例如:保護金鑰和存取相機)的應用程式特定部分。鑑於它在 lipa 錢包中的良好運作,我們開始在商務錢包中採用同樣的方法,並為此建立了 lipa-business-lib (LBL)。

Rust 在行動開發中的優勢與劣勢

我們對目前的移動開發解決方案整體上感到滿意,但並非所有方面都是正面的:這其中總是涉及到權衡。我們來看看這種方法的優勢和劣勢。

僅需撰寫和測試一次業務邏輯。減少程式碼重複不僅縮短了開發時間,也降低了維護成本,還能減少錯誤出現的可能性。未來,我們的 Rust 核心甚至有潛力可以在其他平台(包括網頁)中透過 WebAssembly 使用。

受益於 Rust 的優勢。Rust 的主要特點包括高效能、無需垃圾回收器的記憶體安全以及安全且高效的併發處理。其中,安全性尤其重要,特別是對於像我們在 lipa 開發的金融應用程式而言。

本地應用程式帶來許多好處。如前所述,本地應用擁有幾個顯著優勢,即最佳效能、完整 API 訪問、最佳使用者體驗、穩定性與可靠性,以及最強安全性。

除了上述提到的金融應用外,Rust 在金融領域的應用正在快速增長。例如:

- **區塊鏈開發:** Rust 的安全性和效能使其成為區塊鏈開發的理想語言,例如 Polkadot、Cosmos 和 Filecoin 等知名專案都採用了 Rust 進行開發。

- **交易平台:** 高頻交易需要極高的效能與可靠性,而 Rust 的優勢使其成為交易平台開發的重要選擇,例如 Coinbase 和 Binance 等平台均運用了 Rust 技術。

- **安全審計:** Rust 強型別系統及記憶體安全特性,可以有效避免程式碼中的漏洞,使其成為安全審計領域的一大利器,比如 Mozilla 的 Rust 編譯器就被用於進行安全審計。

隨著技術的不斷演進,我們期待在未來繼續探索這些技術給我們帶來的新機會。

更為複雜的整合。新增的 Rust 核心元件意味著需要開發和維護更多的介面。將 Rust 與 Swift 和 Kotlin 進行橋接也增加了複雜性,儘管這一部分大多由優秀的 UniFFI 專案來管理。在少數情況下,跨越原生程式碼與 Rust 的挑戰性錯誤會出現。例如,我們發現將 SQLite 打包在我們的函式庫中(這通常是推薦做法)並不適用於 iOS,儘管在其他平台上運作良好。

跨平台開發的挑戰:Rust 核心與行動應用程式之間的協作

開發的複雜性。儘管我們有專門的 Rust 開發者負責 Rust 核心以及 iOS 和 Android 的行動開發者,但如果雙方能對彼此的工作有所了解,將會有助於提高效率。例如,設定 Rust 核心的建構過程確實需要具備針對這兩個行動平台上依賴關係運作方式的專業知識。

二進位檔大小。在行動應用程式的二進位檔中嵌入 Rust 函式庫可能會大幅增加它們的體積,這對資源有限的裝置來說是一項挑戰。我們已經在很大程度上解決了這個問題,透過盡量減小我們函式庫二進位檔的大小來達成,部分策略參考了這個 GitHub 倉庫中的方法。

探索非傳統語言:Rust 在 App 開發領域的潛力

不太常見的方法意味著可用的資源和資訊較少。這種方法遠非應用程式開發的標準做法,因此有時我們是首批遇到特定問題的人,或者至少很難找到曾經面對這些問題的其他人。儘管如此,我們絕對不是第一個使用此方法的人:Mozilla 在其瀏覽器的一些元件中就採用了這種做法(這也是他們開發 UniFFI 的原因),還有其他例子,例如 Matrix SDK(一個用於 Matrix 通訊網路的 SDK)。一個有趣的例子是 Crux,它是一個專門用於使用通用 Rust 核心開發移動應用程式的框架。

在當前技術環境下,越來越多的開發者開始探索非傳統語言如 Rust 的潛力,尤其是在 App 開發領域。Rust 擁有顯著的優勢,包括:

* **記憶體安全性:** Rust 的強型別系統和所有權機制能有效防止記憶體洩漏、緩衝區溢位等安全問題,這對金融或醫療等需要高度安全性的應用至關重要。
* **效能優異:** Rust 能夠直接編譯為機器碼,其效能接近 C/C++ 同時保持了良好的安全性與可讀性。
* **跨平台支援:** Rust 可以編譯到多個平台,包括桌面、移動端、網頁及嵌入式系統,為開發者提供更大的靈活性。

雖然在 App 開發領域中,Rust 尚未成為主流,但其強大的功能和日益增長的社群支援使得它在未來可能扮演更加重要的角色。因此,在考慮採取非典型的方法進行 App 開發時,無論是基於現有案例還是潛在優勢,都值得深入探討。

Rust 在行動應用開發中的優勢與未來發展

我們在 lipa 的移動應用程式開發中,採用 Rust 作為核心邏輯以及原生開發 UI 的混合方式,這一策略已證明是有效的。透過利用 Rust 的優勢,我們成功簡化了開發流程,減少了程式碼重複,並保持了 iOS 和 Android 平台上的高安全性與可靠性。雖然這種方法確實面臨一些挑戰,包括 UI 程式碼重複和整合的複雜性,但我們所獲得的好處遠超過這些困難。我們將在可預見的未來繼續在移動應用程式中使用 Rust。

**專案1:結合 WebAssembly,實現跨平台 UI 統一**:lipa 採用 Rust 開發核心邏輯,並以原生方式開發 UI,雖然有效減少了程式碼重複,但 UI 仍然需要分別針對 iOS 和 Android 平台進行開發。隨著 WebAssembly 的崛起,我們可以考慮將 UI 部分遷移至 WebAssembly,利用 Rust 的強大能力編譯出可在 iOS 和 Android 平台上執行的 WebAssembly 程式碼,以進一步減少重複開發工作,同時提升 UI 的可維護性與一致性。

**專案2:探索 Rust 在移動開發領域的最新應用**:除了 UI 開發之外,lipa 還可以進一步探索 Rust 在移動開發領域中的新興應用。例如,可以利用 Rust 開發高效能的移動端資料處理庫或構建安全可靠的通訊框架,例如基於 WebSockets 的即時通訊。由於 Rust 提供強大的安全特性,我們也能夠研製出如身份驗證、授權和資料加密模組等安全敏感功能,有效防範潛在的安全漏洞及惡意攻擊。

我們期待聽到您對這一方法的看法,也許您也應該嘗試一下 😉

參考來源


JH

專家

相關討論

❖ 相關專欄