每当您的Android设备播放任何类型的媒体文件,如歌曲或YouTube视频时,操作系统会生成多个复杂的单独进程,以确保媒体文件的安全播放。这是为了减轻利用格式错误的媒体文件或不安全的媒体编解码器的漏洞,例如几年前臭名昭著的Stagefright漏洞。虽然Android现在的媒体文件处理已经更加安全,但也显得低效,而Android 16中的一项新功能旨在解决这个问题。

编解码器是一种软件算法,定义了数字音频或视频数据的压缩和解压缩方式。在Android 7.0之前,整个媒体框架被封装在一个单一的庞大进程中,该进程持有大量敏感权限。由于编解码器被包含在其中,因此其媒体文件处理中的漏洞可能允许攻击者提升权限。
在Android 7.0中,谷歌通过将媒体框架拆分成多个不同的进程来增强其安全性,每个进程只需要一小部分权限。编解码器现在在独立的沙箱进程中运行,并通过Android的进程间通信(IPC)API——Binder,与其他媒体和应用进程进行通信。由于编解码器进程是沙箱化的,因此漏洞的影响仅限于该沙箱进程。这种架构设计减少了类似Stagefright漏洞的发生概率。

尽管这种架构更加安全,但由于重复使用进程间通信(IPC)调用,它会导致性能下降。例如,一个音乐流媒体应用必须通过IPC调用将编码数据传递给编解码器进程,并获取解码数据。需要进行的IPC调用越多,CPU使用率就越高。尽管这对最好的Android手机影响较小,但提高媒体播放效率仍然值得,尤其是考虑到这是一项非常常见的用户活动。
因此,Android 16增加了对进程内软件音频编解码器的支持,这一功能允许媒体编解码器在应用程序的进程内运行,而不是在通常的沙箱化媒体编解码器进程中运行。Android 16的MediaCodecInfo类现在包括一个getSecurityModel()方法,返回 SECURITY_MODEL_SANDBOXED(标准沙箱进程)或 SECURITY_MODEL_MEMORY_SAFE(进程内操作)。尽管进程内操作可能存在风险,但由于编解码器的软件实现是用像Rust这样的内存安全语言编写的,因此被认为是安全的。

尽管Android 16关于这一新功能的文档简短,但谷歌已经开发这个功能多年。一位消息人士告诉我,谷歌在2023年的Mainline Summit上展示了这一功能,这是一个私人活动,谷歌在该活动中分享了Project Mainline模块的变更。
谷歌推出这一功能的主要动机,如在演示中所揭示,是为了提升AAC编解码器的性能并减少功耗。公司估计,解码和编码AAC内容时,最多有50%的CPU周期是由于进程间通信所消耗的。因此,切换到进程内编解码器将提高AAC解码和编码的效率。为了应对安全问题,谷歌希望这些进程内编解码器使用像Rust这样的内存安全语言编写,而不是C++。
我的消息人士告诉我,谷歌最初计划在Android 15中推出这一功能,但公司将其推迟到了Android 16。尽管Android 16支持这一功能,但目前实际上尚未启用。这是因为厂商需要用Rust重写编解码器。在我的Pixel 9 Pro上测试Android 16的新API时,我发现所有媒体编解码器仍然使用沙箱化的方法。

因此,尽管Android 16的新进程内软件音频编解码器功能在理论上应该能在播放媒体时带来更好的性能和电池续航,但我们可能需要等待一段时间才能看到这些好处。希望谷歌和编解码器厂商能够合作,将许多流行的编解码器用Rust重写,以便我们在未来能够享受到这一新功能的好处。