在搭载 Android 11 或更高版本并运行内核版本 5.4 或更高版本的设备上,SDCardFS 已被弃用。在此类设备上, VTS 测试不允许挂载的文件系统列为 SDCardFS。搭载 Android 11 或更高版本但运行内核版本 4.19 或更低版本的设备可以继续使用 SDCardFS,但谷歌不提供额外支持。
在弃用之前,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 的直接存储访问不支持这些范围存储功能。