在搭载 Android 11 或更高版本并运行内核版本 5.4 或更高版本的设备上,SDCardFS 已被弃用。在此类设备上,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 进行的直接存储访问不支持这些作用域存储功能。