Android一直支持外部存储配件(例如SD卡),但这些配件历史上仅限于简单的文件存储,因为它们预期的无常性和对传统外部存储提供的最小数据保护。 Android 6.0引入了采用外部存储介质作为内部存储的能力。
当采用外部存储介质时,它的格式和加密功能只能在一个Android设备上同时使用。因为媒体与采用它的Android设备密切相关,所以它可以安全地为所有用户存储应用和私人数据。
当用户在可接受的位置插入新的存储介质(如SD卡)时,Android会询问他们如何使用介质。他们可以选择采用格式化和加密的媒体,或者它们可以继续使用它来简单的文件存储。如果他们选择采用,平台提供将主共享存储内容(通常安装在/ sdcard)迁移到新采用的介质,释放内部存储上的宝贵空间。与传统存储(由于使用MBR而限制为2TB)不同,可采用的存储使用GPT,因此文件存储限制为〜9ZB。
只有当开发人员通过android:installLocation
属性指示支持时,应用程序才能放置在所采用的存储介质上。新安装的受支持应用程序会自动放置在具有最大可用空间的存储设备上,用户可以在“设置”应用程序的存储设备之间移动受支持的应用程序。在媒体弹出时,移动到已采用媒体的应用程序会被记住,并在重新插入媒体时返回。
安全性
平台为每个所采用的设备随机生成加密密钥,并且该密钥存储在Android设备的内部存储器上。这有效地使所采用的媒体与内部存储一样安全。基于所采用的分区GUID,密钥与所采用的设备相关联。采用的设备使用配置了aes-cbc-essiv:sha256算法和128位密钥大小的dm-crypt进行加密
采用的设备的磁盘布局紧密地反映了内部数据分区,包括SELinux标签等。当Android设备上支持多用户时,所采用的存储设备还支持与内部数据隔离相同级别的多用户存储。
由于所采用的存储设备的内容与采用该存储设备的Android设备密切相关,所以加密密钥不应该从主设备提取,因此存储设备不能安装在其他地方。
性能和稳定性
只有在稳定位置的外部存储介质(例如电池盒内的插槽或保护盖后面)才应考虑采用,以帮助避免意外的数据丢失或损坏。特别是,连接到手机或平板电脑的USB设备不应被视为采用。一个常见的例外是连接到电视型设备的外部USB驱动器,因为整个电视机通常安装在稳定的位置。
当用户采用新的存储设备时,平台运行基准并将其性能与内部存储进行比较。 如果所采用的设备明显慢于内部存储,则平台向用户警告可能恶化的体验。这个基准来源于流行的Android应用程序的实际I/O
行为。目前,AOSP实现将仅警告用户超过单个阈值,但设备制造商可以进一步适应这一点,例如,如果卡非常慢,则完全拒绝采用。
所采用的设备必须使用支持POSIX权限和扩展属性(如ext4或f2fs)的文件系统进行格式化。 为了获得最佳性能,建议将f2fs文件系统用于基于闪存的存储设备。
当执行定期空闲维护时,平台向已采用介质发布FI_TRIM
,就像对内部存储一样。 当前SD卡规范不支持DISCARD
命令;但是内核改为回退到ERASE
命令,其中SD卡固件可以选择用于优化目的。