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