传统存储

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。
Android 外部存储 HAL 图标

Android 支持具有传统存储的设备,传统存储被定义为具有不可变 POSIX 权限类和模式的不区分大小写的文件系统。传统存储的概念包括模拟存储和便携式存储。便携式存储被定义为系统未采用的任何外部存储,因此未格式化和加密或绑定到特定设备。因为传统的外部存储为存储的数据提供了最低限度的保护,所以系统代码不应将敏感数据存储在外部存储上。具体来说,配置和日志文件应该只存储在可以有效保护它们的内部存储中。

多用户外部存储

从 Android 4.2 开始,设备可以支持多个用户,并且外部存储必须满足以下约束:

  • 每个用户必须有自己独立的主外部存储,并且不能访问其他用户的主外部存储。
  • /sdcard路径必须根据运行进程的用户解析为正确的用户特定的主外部存储。
  • 作为优化, Android/obb目录中的大型 OBB 文件的存储可以在多个用户之间共享。
  • 辅助外部存储不得由应用程序写入,除非在合成权限允许的特定包目录中。

此功能的默认平台实现利用 Linux 内核命名空间为每个 Zygote 分叉进程创建隔离的挂载表,然后使用绑定挂载将正确的用户特定主外部存储提供到该私有命名空间中。

在启动时,系统会在EMULATED_STORAGE_SOURCE上挂载一个模拟的外部存储 FUSE 守护程序,该守护程序对应用程序是隐藏的。在 Zygote 分叉之后,它会将 FUSE 守护程序下的适当用户特定子目录绑定到EMULATED_STORAGE_TARGET ,以便为应用程序正确解析外部存储路径。由于应用程序缺少其他用户存储的可访问挂载点,因此他们只能访问启动它的用户的存储。

此实现还使用共享子树内核功能将挂载事件从默认根命名空间传播到应用命名空间,从而确保 ASEC 容器和 OBB 挂载等功能继续正常工作。它通过将 rootfs 挂载为共享文件,然后在创建每个 Zygote 命名空间后将其重新挂载为从属文件来实现此目的。

多个外部存储设备

从 Android 4.4 开始,多个外部存储设备通过Context.getExternalFilesDirs()Context.getExternalCacheDirs()Context.getObbDirs()呈现给开发人员。

通过这些 API 显示的外部存储设备必须是设备的半永久性部分(例如电池盒中的 SD 卡插槽)。开发人员希望存储在这些位置的数据能够长期可用。因此,不应通过这些 API 显示临时存储设备(例如 USB 大容量存储驱动器)。

WRITE_EXTERNAL_STORAGE权限只能授予对设备上主要外部存储的写访问权限。不得允许应用程序写入辅助外部存储设备,除非在合成权限允许的特定包目录中。以这种方式限制写入可确保系统可以在卸载应用程序时清理文件。

USB 媒体支持

Android 6.0 支持仅短时间连接到设备的便携式存储设备,例如 USB 闪存驱动器。当用户插入新的便携式设备时,平台会显示一条通知,让他们复制或管理该设备的内容。

在 Android 6.0 中,任何未采用的设备都被视为便携设备。由于便携式存储的连接时间很短,平台避免了媒体扫描等繁重的操作。第三方应用程序必须通过存储访问框架才能与便携式存储上的文件进行交互;出于隐私和安全原因,直接访问被明确禁止。