Android поддерживает устройства с традиционным хранилищем, которое определяется как файловая система без учета регистра с неизменяемыми классами и режимами разрешений POSIX. Традиционное хранилище включает эмулируемое и съемное хранилище. Портативным считается любой внешний накопитель, который не адаптирован системой и поэтому не отформатирован, не зашифрован и не привязан к определенному устройству. Поскольку традиционные внешние накопители обеспечивают минимальную защиту хранящихся на них данных, системный код не должен сохранять на них конфиденциальные данные. В частности, файлы конфигурации и журналов должны храниться только во внутренней памяти, где они могут быть эффективно защищены.
Внешний накопитель с поддержкой добавления пользователей
Начиная с Android 4.2, устройства могут поддерживать несколько пользователей, а внешние накопители должны соответствовать следующим требованиям:
- У каждого пользователя должно быть собственное изолированное основное внешнее хранилище, и у него не должно быть доступа к основному внешнему хранилищу других пользователей.
- Путь
/sdcardдолжен вести к правильному основному внешнему хранилищу, которое зависит от пользователя, от имени которого выполняется процесс. - В целях оптимизации хранилище для больших OBB-файлов в каталоге
Android/obbможет быть общим для нескольких пользователей. - Приложения не должны иметь права на запись на дополнительный внешний накопитель, за исключением каталогов, предназначенных для конкретных пакетов, в соответствии с синтезированными разрешениями.
В стандартной реализации этой функции используются пространства имен ядра Linux, чтобы создать изолированные таблицы монтирования для каждого процесса, порожденного Zygote, а затем с помощью монтирования привязки предоставить правильное основное внешнее хранилище, относящееся к определенному пользователю, в это частное пространство имен.
При загрузке система монтирует один эмулированный внешний накопитель FUSE-демона в EMULATED_STORAGE_SOURCE, который скрыт от приложений. После того как процесс Zygote разветвляется, он привязывает соответствующий подкаталог, относящийся к определенному пользователю, из-под демона FUSE к EMULATED_STORAGE_TARGET, чтобы пути к внешнему хранилищу правильно разрешались для приложения. Поскольку у приложения нет доступных точек подключения для хранилища других пользователей, оно может получить доступ только к хранилищу того пользователя, от имени которого оно было запущено.
В этой реализации также используется функция общего поддерева ядра для распространения событий монтирования из корневого пространства имен по умолчанию в пространства имен приложений. Это обеспечивает корректную работу таких функций, как контейнеры ASEC и монтирование OBB. Для этого он монтирует rootfs как общую, а затем перемонтирует ее как подчиненную после создания каждого пространства имен Zygote.
Несколько внешних накопителей
В Android 4.4 и более поздних версий разработчикам доступны несколько внешних устройств хранения данных через Context.getExternalFilesDirs(), Context.getExternalCacheDirs() и Context.getObbDirs().
Разрешение WRITE_EXTERNAL_STORAGE должно предоставлять доступ на запись только к основному внешнему хранилищу устройства. Приложения не должны иметь возможности записи на дополнительные внешние запоминающие устройства, за исключением каталогов, относящихся к их пакетам, в соответствии с синтезированными разрешениями. Это позволяет системе удалять файлы при удалении приложений.
Поддержка USB-носителей
Android 6.0 поддерживает съемные накопители, которые подключаются к устройству на короткое время, например USB-накопители. Когда пользователь подключает новое портативное устройство, платформа показывает уведомление, позволяющее скопировать или управлять содержимым этого устройства.
В Android 6.0 любое устройство, которое не было перенесено, считается переносным. Поскольку портативное хранилище подключается на короткое время, платформа избегает ресурсоемких операций, таких как сканирование медиафайлов. Сторонние приложения должны взаимодействовать с файлами на переносном хранилище через платформу доступа к хранилищу. Прямой доступ к файлам запрещен в целях конфиденциальности и безопасности.