废弃 SDCardFS

SDCardFS 在搭载 Android 11 或更高版本且运行内核版本 5.4 或更高版本的设备上已废弃。在此类设备上,VTS 测试不允许将已装载的文件系统列为 SDCardFS。搭载 Android 11 或更高版本但运行内核版本 4.19 或更低版本的设备可以继续使用 SDCardFS,但 Google 不提供额外支持。

在废弃之前,利用 SDCardFS 可以控制对模拟内部存储设备和外部 SD 卡的访问权限,使应用仅可访问与其相关的数据。此外,它还提供了一个不区分大小写的层,以及一些额外的存储跟踪功能。

SDCardFS 替代功能

SDCardFS 替代项使用多个 Linux 内核文件系统功能来实现类似结果。不区分大小写由文件系统直接处理;这样一来,在区分大小写的文件夹和不区分大小写的文件夹中查找内容所需的时间几乎相同,消除了 SDCardFS 中的大文件夹查询速度减慢的问题。SDCardFS 原来为快速收集设置的存储数据而执行的配额跟踪操作现在可使用项目配额从用户空间配置。在某些对性能敏感的情况下,目录会就地绑定装载。新的 FUSE 实现为直接访问文件系统提供了分区存储,这主要是为了支持对位置信息进行遮盖。

配置 SDCard 替代功能

如需在搭载 Android 11 或更高版本的设备上为没有 SDCardFS 的模拟存储空间启用项目配额和大写转换功能,请沿用 device.mk 文件中的 emulated_storage.mk

$(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk)

警告:请勿在搭载 Android 10 或更低版本的设备上执行此操作,因为文件系统原生不区分大小写与在此类设备上使用的文件级加密设置不兼容。在此类设备上有必要继续使用 SDCardFS。

废弃 SDCardFS 的原因

弃用 SDCardFS 有多方面的原因。

稳定性

SDCardFS 存在与大小写区分有关的几个竞态条件,以及一些关于内存不足情况的问题。在大型目录中,不区分大小写的查询可能会相当慢,因为查询必须遍历下层目录来寻找替代大小写。同时访问上层和下层文件系统也会导致问题。

上游对等性

SDCardFS 需要对 VFS 进行额外的修补,才能支持更改绑定装载选项。这类修补导致需要执行额外的操作才能接受上游对这些区域所做的更改。SDCardFS 的功能可由上游组件进行复制,从而解决这一痛点。

与 API 的功能对等性

在之前的 Android 版本中,分区存储限制了对特定类型元数据的访问。通过 SDCardFS 直接访问存储空间时,不支持这些分区存储功能。