爲了讓 Android 更安全,谷歌推薦開發者使用 Rust 編寫系統代碼

google x Android

對於安卓開發者來講,Java 和 Kotlin 是比較流行的選擇;而對於從事操做系統以及內部底層的開發者來講,C 和 C++ 是比較熱門的選擇。但在衆多語言中,Rust 做爲一款小衆的現代系統編程語言,近兩年間逐漸受到了各大企業的青睞。編程

去年,AWS 開源團隊宣佈聘用 Rust 編譯器聯合創始人 Felix Klock,將來致力於進一步改進 Rust。蘋果也表示對將 C 代碼移植到 Rust 感興趣,但願投身到使用 Rust 編寫代碼的潮流中,想要在基於 Linux 的服務器端平臺上將 C 過渡到 Rust。微軟在採訪中也表示 C/C++ 沒法勝任編寫關鍵任務的軟件,業界很是須要高性能、內存安全的編程語言來開發底層系統,而當今市場上最好的選擇就是 Rust。segmentfault

近日,谷歌宣佈出於安全性的考慮,推薦開發者使用 Rust 編程語言來開發操做系統。並表示在過去的 18 個月裏,它一直在爲 Android 開源項目添加 Rust 支持。但在 Android 平臺上添加一門新語言是一項巨大的工程。一些工具鏈和依賴關係須要維護,測試基礎設施和工具必須更新,開發人員須要接受培訓。安全

C 和 C++ 的侷限性服務器

Android 系統的底層須要 C 和 C++ 等系統編程語言。這些語言爲開發者提供了控制和可預測性,這在訪問低級系統資源和硬件時很是重要。不幸的是,C 和 C++ 並不能提供內存安全保證,使得它們容易出現錯誤和安全漏洞。開發者有責任在這些語言上管理內存壽命,但在複雜和多線程的代碼庫中,這提及來容易作起來難。多線程

C 和 C++ 共同構成了 Android 平臺上數以千萬計的代碼行。這些內存安全漏洞成爲最難解決的代碼錯誤來源,佔 Android 高嚴重度安全漏洞的 70% 左右。單純的修復這些 bug 變得不足以處理問題,更好的方法是在一開始就預防這些 bug。併發

因爲缺少內存安全保障,迫使開發者在嚴格約束的無權限沙盒內運行Android進程。但沙盒在資源上的成本很高,會消耗額外的開銷,並引入延遲。沙盒也不能徹底消除代碼的漏洞,並且因爲 bug 密度高,沙盒的功效會下降,進一步!編程語言

image.png

另外一個限制,雖然不是 C 和 C++ 獨有的,但適用於全部的內存安全問題,那就是錯誤狀態必須在工具化的代碼中實際觸發,才能被檢測到。因此即便你的代碼有很好的測試,實際的 bug 也可能一直沒有被發現。而當發現bug時,讓它們獲得修復又是另外一項任務,涉及到一個漫長而昂貴的過程,不必定能獲得正確的修復。所以,bug 檢測變得不可靠,鑑於這些侷限性,bug 預防是更好的方法。工具

image.png

Rust 及其優點性能

2020 年末,Rust 官方在調研了全球 8323 位開發者後,最新發布了 2020 年 Rust 調查報告。經過報告,咱們發現 Rust 開發者的用戶黏度較高,有 83% 的受訪者表示他們一直在使用該語言。測試

衆所周知,當說起 Rust 語言時,安全、性能、併發等特性是其優點。Rust 經過使用編譯時檢查和運行時檢查相結合的方式提供內存安全保證,以強制執行對象的壽命/全部權,並確保內存訪問是有效的。在實現這種安全性的同時,還能提供與C和C++至關的性能。Rust 還減小了對沙盒的需求,讓開發人員有更多的開銷空間來引入更安全、更輕量的新功能。

可是據官方調查報告顯示,Rust 仍有許多亟需完善之處。譬如如下幾點:

  • 與 C++ 的交互兼容須要進一步提高
  • Rust 上手難度過高
  • 編譯時間過長
  • 庫的支持不夠豐富

雖然 Rust 確實有它的好處,但一晚上之間將整個 Android 操做系統換成 Rust 是不可行的,而且現階段的 Rust 也遠非盡善盡美。並且可能根本不須要這樣作,由於大多數 Android 的內存錯誤都發生在新的或最近修改的代碼中,大約有 50% 的代碼是不到一年的。谷歌認爲,其內存安全語言的工做最好集中在新的開發上,而不是重寫成熟的 C 和 C++ 代碼。

據 Android 開發人員關係小組的成員稱,Google 目前還不打算髮布 Rust NDK。應用開發支持的語言將繼續是 Kotlin,Java,C 和 C ++。

部分參考資料:

xda-developers:《Google is developing parts of Android in Rust to improve security》
Rust 官方:《Rust 語言 2020 調查報告》

segmentfault 思否