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)”】