C和C++不安全?谷歌宣布Android加入對Rust語言支持
Android 系統涉及很多組件,開發者會根據正在開發的 Android 部分而選擇不同的編程語言。對于應用開發者來說,Java 和 Kotlin 是比較流行的選擇;而對于從事操作系統以及內部底層的開發人員來說,C 和 C++ 是比較好的選擇。
近日,谷歌為操作系統開發者增加了第 3 個選擇 Rust。谷歌發布博客稱 AOSP (Android Open Source Project) 現已支持使用 Rust 開發 Android 操作系統。
內存安全 bug
C 和 C++ 中的內存安全 bug 是最難解決的錯誤源。谷歌已經投入了大量的精力和資源來檢測、修復和緩解這類 bug,并有效地防止了大量 bug 進入 Android 版本。然而,盡管做出了這些努力,內存安全 bug 仍然是穩定性問題的主要原因,它在 Android 嚴重安全漏洞中長期占據大約 70% 的比例。
對于這些內存安全問題,谷歌表示除了優化內存錯誤檢測機制外,最有效的解決辦法是采用內存安全語言。Java 和 Kotlin 等托管語言是 Android 應用開發的最佳選擇。這些語言專為易于使用、可移植性和安全性而設計,它們是開發 Android 應用的最佳選擇。Android OS 廣泛使用 Java 語言,從而有效地保護了大部分 Android 平臺不受內存 bug 的影響。但對于操作系統的底層而言,不能選擇 Kotlin 和 Java。
較低層級的 OS 需要系統編程語言,如 C、C++ 和 Rust。這些語言設計時考慮到了可控和可預測性的目標。它們提供對低級系統資源和硬件的訪問,資源較少,并具有更可預測的性能特征。
對于 C 和 C++,開發人員負責管理內存生存期。遺憾的是,這樣做很容易出錯,特別是在復雜的多線程代碼庫中。
Rust 使用編譯時檢查(強制執行對象生命周期 / 所有權)和運行時檢查(確保內存訪問有效)的組合來提供內存安全保證。提供這種安全性的同時,Rust 的性能表現足以媲美 C 和 C++。
大約 50% 的錯誤發生在一年之內
谷歌表示,用 Rust 重寫數千萬行的 C 和 c++ Android 代碼根本不可行,而重寫舊的 Android 不會有太大影響,因為到目前為止舊代碼已經清除了大部分 bug。由于 Android 源代碼是一個擁有數十億用戶的開源項目,很多人都在關注它。大部分內存 bug 都發生在新的或最近修改過的代碼中,大約 50% 的錯誤發生在不到一年的時間里。必要時,Rust 將用于新組件,這將有助于減少谷歌可能引入的新內存 bug。
Android 內存 bug 圖表。舊代碼有很多 bug,現在已經修復了。
比較罕見的舊內存 bug 可能會讓人感到驚訝,但谷歌表示舊代碼并不是最迫切需要改進的地方。隨著時間的推移,軟件 bug 會被逐漸發現和修復,因此我們可以預期還在維護但未處于活躍開發狀態的代碼中的錯誤量會逐漸減少。
無論如何,向 Android 平臺添加新的開發語言支持是一項大工程。谷歌表示:「在過去的 18 個月里,我們一直在為 Android 開源項目添加 Rust 支持,在接下來的幾個月里,我們將分享一些早期采用 Rust 的項目。將 Rust 擴展到更多的 OS 是一個長期項目。」
參考鏈接:
- https://arstechnica.com/gadgets/2021/04/google-is-now-writing-low-level-android-code-in-rust/
- https://security.googleblog.com/2021/04/rust-in-android-platform.html
- https://www.oschina.net/news/136467/rust-in-android-platform
- https://www.cnbeta.com/articles/tech/1111455.htm
【本文是51CTO專欄機構“機器之心”的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】