Android со временем развивался, чтобы поддерживать широкий спектр типов устройств хранения и функций. Все версии Android поддерживают устройства с традиционным хранилищем , включая портативное и эмулированное хранилище. Портативное хранилище может быть предоставлено физическим носителем, таким как SD-карта или USB, то есть для временной передачи данных / хранения файлов. Физический носитель может оставаться на устройстве в течение длительного периода времени, но не привязан к устройству и может быть удален. SD-карты доступны в качестве портативного хранилища начиная с Android 1.0; В Android 6.0 добавлена поддержка USB. Эмулируемое хранилище предоставляется путем предоставления части внутреннего хранилища через уровень эмуляции и доступно, начиная с Android 3.0.
Начиная с Android 6.0, Android поддерживает адаптивное хранилище , которое предоставляется физическими носителями, такими как SD-карта или USB-накопитель, которые зашифрованы и отформатированы так, чтобы вести себя как внутреннее хранилище. Адаптируемое хранилище может хранить все типы данных приложений.
Разрешения
Доступ к внешнему хранилищу защищен различными разрешениями Android. Начиная с Android 1.0, доступ для записи защищен разрешением WRITE_EXTERNAL_STORAGE
. Начиная с Android 4.1 доступ для чтения защищен разрешением READ_EXTERNAL_STORAGE
.
Начиная с Android 4.4, владелец, группа и режимы файлов на внешних устройствах хранения теперь синтезируются на основе структуры каталогов. Это позволяет приложениям управлять каталогами своих пакетов во внешнем хранилище, не требуя, чтобы они обладали широким разрешением WRITE_EXTERNAL_STORAGE
. Например, приложение с именем пакета com.example.foo
теперь может свободно обращаться к Android/data/com.example.foo/
на внешних устройствах хранения без каких-либо разрешений. Эти синтезированные разрешения реализуются путем включения необработанных устройств хранения в демон FUSE.
Начиная с Android 10, приложения, предназначенные для Android 9 и более ранних версий, по умолчанию используют устаревшее хранилище и могут использовать изолированное хранилище. Приложения, предназначенные для Android 10 и по умолчанию использующие изолированное хранилище, могут временно отказаться от него. Используйте атрибут манифеста requestLegacyExternalStorage
, который управляет моделью хранения, чтобы изменить состояние по умолчанию.
Поскольку разрешения READ_EXTERNAL_STORAGE
и WRITE_EXTERNAL_STORAGE
имеют мягкое ограничение, если установщик не добавил приложение в белый список, разрешение управляет доступом только к звуковым и визуальным коллекциям без доступа к SD-карте. Это применимо, даже если приложение запрашивает устаревшее хранилище. Дополнительные сведения о жестких и мягких ограничениях см. в разделе Жесткие и мягкие ограничения в Android 10 .
Если установщик внес разрешение в белый список, приложение, работающее в устаревшем режиме, получает поведение неизолированного разрешения. Разрешение контролирует доступ к SD-карте, а также звуковые и визуальные коллекции. Это происходит, когда либо приложение нацелено на Android 9 или более раннюю версию и не выбирает изолированное хранилище, либо оно нацелено на Android 10 и отказывается.
Состояние белого списка можно указать только во время установки, и его нельзя изменить, пока приложение не будет установлено.
Дополнительные сведения о настройке разрешения READ_EXTERNAL_STORAGE
см. в разделе setWhitelistedRestrictedPermissions()
в классе PackageInstaller.SessionParams .
Разрешения во время выполнения
В Android 6.0 представлена новая модель разрешений во время выполнения , в которой приложения запрашивают возможности, когда это необходимо во время выполнения. Поскольку новая модель включает разрешения READ/WRITE_EXTERNAL_STORAGE
, платформа должна динамически предоставлять доступ к хранилищу без уничтожения или перезапуска уже запущенных приложений. Это достигается за счет поддержки трех различных представлений всех подключенных устройств хранения:
-
/mnt/runtime/default
показывается приложениям без специальных разрешений на хранение и в корневом пространстве имен, гдеadbd
и другие системные компоненты. -
/mnt/runtime/read
отображается для приложений сREAD_EXTERNAL_STORAGE
(установитеLEGACY_STORAGE
для Android 10) -
/mnt/runtime/write
показывается приложениям сWRITE_EXTERNAL_STORAGE
Во время разветвления Zygote мы создаем пространство имен монтирования для каждого запущенного приложения и привязываем монтирование к соответствующему начальному представлению на место. Позже, когда будут предоставлены разрешения на выполнение, vold
переходит в пространство имен монтирования уже запущенных приложений, а bind монтирует обновленное представление на место. Обратите внимание, что понижение разрешений всегда приводит к уничтожению приложения.
Функциональность setns()
, используемая для реализации этой функции, требует как минимум Linux 3.8, но исправления были успешно перенесены на Linux 3.4. Тест PermissionsHostTest
CTS можно использовать для проверки правильности поведения ядра.