当前Android开源项目已经支持Rust编程语言来开发操作系统了,本文将介绍为什么建议使用Rust来编写Android系统代码?仅仅是为了让Android更安全吗?还会有哪些优势?本文将做一个说明。
前言 作为一个相当完善的移动操作系统,Android系统涉及到很多组件。如果宽泛的来讲可以分成两大部分,应用生态和操作系统本身。而对于开发者来说,所选择的编程语言会根据正在开发的Android部分有所不同。
对于应用开发者来说,Java和Kotlin是比较流行的选择。而对于从事操作系统以及内部底层的开发者来说,C和C++是比较热门的选择。目前,谷歌已为操作系统开发者增加了第3个选择: Rust,因为Android Open Source Project现在支持Rust编程语言来开发操作系统了。
C和C++的限制 Android系统的底层需要C和C++等系统编程语言。这些语言为开发者提供了控制和可预测性,这在访问低级系统资源和硬件时非常重要。不幸的是,C和C++并不能提供内存安全保证,使得它们容易出现错误和安全漏洞。开发者有责任在这些语言上管理内存寿命,但在复杂和多线程的代码库中,这说起来容易做起来难。
C和C++共同构成了Android平台上数以千万计的代码行。这些内存安全漏洞成为最难解决的代码错误来源,占Android高严重度安全漏洞的70%左右。单纯的修复这些bug变得不足以处理问题,更好的方法是在一开始就预防这些bug。 由于缺乏内存安全保障,迫使开发者在严格约束的无权限沙盒内运行Android进程。但沙盒在资源上的成本很高,会消耗额外的开销,并引入延迟。沙盒也不能完全消除代码的漏洞,而且由于bug密度高,沙盒的功效会降低,进一步让攻击者连锁多个漏洞。
另一个限制,虽然不是C和C++独有的,但适用于所有的内存安全问题,那就是错误状态必须在工具化的代码中实际触发,才能被检测到。所以即使你的代码有很好的测试,实际的bug也可能一直没有被发现。而当发现bug时,让它们得到修复又是另一项任务,涉及到一个漫长而昂贵的过程,不一定能得到正确的修复。因此,bug检测变得不可靠,鉴于这些局限性,bug预防是更好的方法。
Rust及其优势 Rust通过使用编译时检查和运行时检查相结合的方式提供内存安全保证,以强制执行对象的寿命/所有权,并确保内存访问是有效的。在实现这种安全性的同时,还能提供与C和C++相当的性能。Rust还减少了对沙盒的需求,让开发人员有更多的开销空间来引入更安全、更轻量的新功能。
虽然Rust确实有它的好处,但一夜之间将整个Android操作系统换成Rust是不可行的。而且可能根本不需要这样做,因为大多数 Android 的内存错误都发生在新的或最近修改的代码中,大约有50%的代码是不到一年的。谷歌认为,其内存安全语言的工作最好集中在新的开发上,而不是重写成熟的C和C++代码。 相关参考:Linux内核有可能从现在的C语言移植到Rust语言中,附相关新闻。
切换到Rust对于Android意味着什么 Rust还专注于防止bug,而不是严重依赖检测bug,从而提高代码的正确性。它有几个关键特性,比如内存安全、数据并发、更有表现力的类型系统、默认的不可变引用和变量、更安全的整数处理、标准库中更好的错误处理等等。 Google表示,在过去的18个月里,它一直在为Android开源项目添加Rust支持。但在Android平台上添加一门新语言是一项巨大的工程。一些工具链和依赖关系需要维护,测试基础设施和工具必须更新,开发人员需要接受培训。不过,从长远来看,这是趋势,作为开发者,应当顺应这种趋势走向,转向Rust势在必行。
相关主题 |