作为一个相当完整的手机操作系统,Android系统涉及到的组件非常多。广义上可以分为应用生态和操作系统本身两部分。对于开发人员而言,选择的编程语言因所开发的Android部分而异。对于应用程序开发人员来说,Java和Kotlin是更受欢迎的选择;对于从事操作系统和内部底层的开发人员来说,C和C++是更受欢迎的选择。今天,谷歌为操作系统开发者增加了第三种选择——Rust,因为Android开源项目现在支持使用Rust编程语言来开发操作系统。C、C++的局限性Android系统底层需要C、C++等系统编程语言。这些语言为开发人员提供了控制和可预测性,这在访问低级系统资源和硬件时非常重要。遗憾的是,C和C++不提供内存安全保证,因此容易出现错误和安全漏洞。在这些语言上管理内存生命周期是开发人员的责任,但在复杂的多线程代码库中,这说起来容易做起来难。C和C++共同构成了Android平台上的数千万行代码。这些内存安全漏洞是最难修复的代码错误来源,约占Android高危安全漏洞的70%。简单地修复这些错误不足以解决问题,最好首先预防这些错误。由于缺乏内存安全保证,开发人员被迫在严格约束的无权限沙箱中运行Android进程。但是沙盒在资源上是昂贵的,消耗额外的开销,并引入延迟。沙箱并不能完全消除代码的漏洞,而且由于bug密度高,会降低沙箱的有效性,进一步让攻击者将多个漏洞串联起来。另一个限制虽然不是C和C++独有但适用于所有内存安全问题,但错误条件必须实际触发检测代码才能被检测到。因此,即使您的代码经过了良好的测试,实际的错误也可能一直未被发现。当发现错误时,修复它们是另一项任务,涉及一个漫长而昂贵的过程,不一定能正确修复。因此,错误检测变得不可靠,鉴于这些限制,错误预防是更好的方法。Rust及其优势Rust通过结合使用编译时检查和运行时检查来提供内存安全保证,以强制执行对象寿命/所有权并确保内存访问有效。在实现这种安全性的同时,还可以提供媲美C和C++的性能。Rust还减少了对沙箱的需求,为开发人员提供了更多空间来引入更安全、更轻便的新功能。虽然Rust确实有它的好处,但一夜之间将整个AndroidOS换成Rust是不可行的。而且可能根本没有必要这样做,因为大多数Android的内存错误都发生在新的或最近修改的代码中,其中大约50%的代码不到一年。谷歌认为,其在内存安全语言方面的工作最好集中在新的开发上,而不是重写成熟的C和C++代码。转向Rust对Android意味着什么Rust也专注于防止错误,而不是严重依赖检测错误,从而提高代码正确性。它具有几个关键特性,例如内存安全、数据并发、更具表现力的类型系统、默认情况下不可变的引用和变量、更安全的整数处理、标准库中更好的错误处理等等。谷歌表示,在过去的18个月里,它一直在为Android开源项目添加Rust支持。但是向Android平台添加一种新语言是一项艰巨的任务。需要维护一些工具链和依赖项,必须更新测试基础设施和工具,并且需要培训开发人员。
