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

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

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

Многопользовательское внешнее хранилище

Начиная с Android 4.2, устройства могут поддерживать несколько пользователей, а внешнее хранилище должно соответствовать следующим ограничениям:

  • Каждый пользователь должен иметь собственное изолированное основное внешнее хранилище и не должен иметь доступа к основному внешнему хранилищу других пользователей.
  • Путь /sdcard должен разрешаться в правильное основное внешнее хранилище для конкретного пользователя в зависимости от пользователя, от имени которого запускается процесс.
  • В целях оптимизации хранилище для больших файлов OBB в каталоге Android/obb может быть разделено между несколькими пользователями.
  • Вторичное внешнее хранилище не должно быть доступно приложениям для записи, за исключением каталогов, специфичных для пакета, как это разрешено синтезированными разрешениями.

Реализация этой функции на платформе по умолчанию использует пространства имен ядра Linux для создания изолированных таблиц монтирования для каждого процесса, разветвленного Zygote, а затем использует монтирование привязки, чтобы предложить правильное основное внешнее хранилище для конкретного пользователя в этом частном пространстве имен.

При загрузке система монтирует один эмулируемый демон внешнего хранилища FUSE по адресу EMULATED_STORAGE_SOURCE , который скрыт от приложений. После разветвления Zygote он привязывает соответствующий пользовательский подкаталог из демона FUSE к EMULATED_STORAGE_TARGET , чтобы пути к внешнему хранилищу правильно разрешались для приложения. Поскольку у приложения отсутствуют доступные точки подключения для хранилища других пользователей, оно может получить доступ к хранилищу только того пользователя, под которым оно было запущено.

Эта реализация также использует функцию ядра общего поддерева для распространения событий монтирования из корневого пространства имен по умолчанию в пространства имен приложений, что гарантирует правильную работу таких функций, как контейнеры ASEC и монтирование OBB. Для этого он монтирует корневую файловую систему как общую, а затем повторно монтирует ее как подчиненную после создания каждого пространства имен 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 любое не принятое устройство считается портативным. Поскольку портативное хранилище подключается только на короткое время, платформа позволяет избежать тяжелых операций, таких как сканирование мультимедиа. Сторонние приложения должны проходить через Storage Access Framework , чтобы взаимодействовать с файлами на переносном хранилище; прямой доступ явно заблокирован по соображениям конфиденциальности и безопасности.