Место хранения

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

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 можно использовать для проверки правильности поведения ядра.