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

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

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

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

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

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

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

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