「分区存储」是个啥?

书接上回。

前文 我们说到,Android 10 引入的「分区存储」成为了不少媒体、用户、开发者关注的焦点。关于这一特性的文章层出不穷,但很可惜,这些文章要么只是概览,要么和官方一样说得一套一套的让人丈二和尚摸不着头脑,还有些搞错了分区存储的定位和原理。加上 iOS 和 Sandboxie 等前辈在应用隔离方面的成功实践,大部分人一看到「分区存储」这几个字,首先想到的就是这些前辈,进而理所当然地以为 Android 的分区存储 = 给应用挂载独立的存储空间,不管应用怎么造作都不会影响到用户和其他应用。

理想很美好,可惜事实并非如此。我们慢慢讲。

本文大部分论断囿于作者的能力、阅历和经验,仅代表作者的理解与推断,还请广纳思想,避免偏听偏信。

咋回事儿?

关于「分区存储」,引用官方在 Android 文件和数据存储概览 里的描述:

为了让用户更好地管理自己的文件并减少混乱,以 Android 10(API 级别 29)及更高版本为目标平台的应用在默认情况下被赋予了对外部存储空间的分区访问权限(即分区存储)。此类应用只能访问外部存储空间上的应用专属目录,以及本应用所创建的特定类型的媒体文件。

前文里已经粗浅地将开发者方面文件访问的历史变化捋了捋,少数派的这篇文章: 《还存储空间一片清朗:Android 的「沙盒」机制何时到来?》 讲得也比较透彻,尤其是用户体验和隐私方面,在此不再展开细说。

那它到底是什么?

就应用启用分区存储后的实际文件访问行为而言,这里要再强调一遍前文强调过的内容:至少在 Android 10 上, 分区存储只是关掉了应用的存储权限

启用了分区存储的应用,能够访问的内容限于:

  • 应用的专属存储目录( Android/data 文件夹下)
  • 媒体文件(要访问其他应用的文件需要申请权限)
  • 用户通过 存储访问框架Storage Access Framework (SAF)授权的其他文件

等等,是不是搞错了什么?这三样可都不是新面孔。最后这个……还用说吗?这可是老朋友了,Android 5.0 Lollipop 开始几近成为完全体,从完全存储权限迁移到 SAF 也没有想象中那么费劲。第二个更早,连最早被引入 Android 的时代都难以追溯(很可能和 Android 1.0 一样老),只是在 Android 10 上,一些特性因为分区存储受到了更严格的限制。第一个在 Android 2.2 Froyo 上已经存在,比分区存储这个概念产生整整早了九年。再过三年,2013 年的时候,Android 4.4 KitKat 已经让应用不需要额外申请权限就能访问自己的专属存储目录了。

由此可见,所谓「分区存储」给应用分配的「沙箱」,从七年前开始存在至今,并且这七年来几乎没有变过。

除非应用申请暂时关闭分区存储,否则应用能访问的文件范围仅限于此。分区存储除了对媒体文件施加了一些额外的限制,其余都和关闭了存储权限没啥两样。至少现在,与其把分区存储看成一种新行为,一种新标准可能更加确切。

为什么说 Android 11 是「一次跃进」?

Android 11 带来了一个很大的改变:位于 Android/data 目录下的文件不能被其它应用访问。

这乍看起来是一个令人窒息的操作(当然它也的确是),让应用放在 Android/data 下错误日志之类的文件或文件夹对用户隐藏,给以往很多理所当然的操作带来了巨大的困难,甚至直接成为不可能。

然而,这却是 Android 分区存储的拼图中,颇为重要的一块。Android 10 发布后,不少应用因各种原因(比如适配最新 Android 版本的需要和 Google Play Store 的威逼)开始接受分区存储,开始规范自身的行为,开始将 Android/data 作为自身文件存储的根目录。即使是 QQ 和微信这类「老顽固」,也已经在将数据迁移到 Android/data (虽然迁移得让人扼腕)。经过了一年的过渡,在 Android 11 推出的时候,顺水推舟让应用的存储目录不再对用户和其他应用可见,从而形成的,不正是用户一直渴望的,不管应用怎么造作都不会影响到用户和其他应用的「沙箱」吗?

说得确切些,「分区存储只是关掉存储权限」,并不意味着分区存储不是沙箱机制。和其他沙箱不同的地方在于,分区存储并不是动态地将应用放到独立存储空间中运行(Rikka 的 存储空间隔离(存储重定向) 一直在做的事情),而是给应用提供一套行为规范,让应用主动利用系统给应用分配的独立存储空间。这个「系统给应用分配的独立存储空间」,就是 Android 11 上被系统保护起来的 Android/data


跋:不算科普的絮叨

如本节标题一样,原以为本文会写成一篇小小的科普,没想到写着写着推断 (阴谋论) 占了上风,自然也就不会像正经的科普一样可靠。不管怎么说,还是希望各位能够多提出意见、发表感慨。思想的碰撞,无论是对参与方还是对旁观者,或许都有所裨益。

本文的资料主要来源已经在文中或前文以超链接形式给出,感谢对应的作者以及读到此的各位对本文的莫大贡献。