为了让 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 思否