Традиционное хранилище

Значок HAL внешнего хранилища Android

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().

Внешние накопители, доступные через эти API, должны быть полупостоянной частью устройства (например, слот для SD-карты в батарейном отсеке). Разработчики ожидают, что данные, хранящиеся в этих местах, будут доступны в течение длительного времени. По этой причине временные устройства хранения данных (например, USB-накопители) не должны быть доступны через эти API.

Разрешение WRITE_EXTERNAL_STORAGE должно предоставлять доступ на запись только к основному внешнему хранилищу устройства. Приложения не должны иметь возможности записи на дополнительные внешние запоминающие устройства, за исключением каталогов, относящихся к их пакетам, в соответствии с синтезированными разрешениями. Это позволяет системе удалять файлы при удалении приложений.

Поддержка USB-носителей

Android 6.0 поддерживает съемные накопители, которые подключаются к устройству на короткое время, например USB-накопители. Когда пользователь подключает новое портативное устройство, платформа показывает уведомление, позволяющее скопировать или управлять содержимым этого устройства.

В Android 6.0 любое устройство, которое не было перенесено, считается переносным. Поскольку портативное хранилище подключается на короткое время, платформа избегает ресурсоемких операций, таких как сканирование медиафайлов. Сторонние приложения должны взаимодействовать с файлами на переносном хранилище через платформу доступа к хранилищу. Прямой доступ к файлам запрещен в целях конфиденциальности и безопасности.