Хранилище

Значок 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 13 представлены детальные разрешения мультимедиа для поддержки приложений, которые получают доступ к медиафайлам, созданным другими приложениями. Приложения должны запрашивать одно или несколько детальных разрешений мультимедиа, перечисленных в разделе «Детальные разрешения мультимедиа» , вместо разрешения READ_EXTERNAL_STORAGE .

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

Разрешения во время выполнения

В 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 переходит в пространство имен монтирования уже запущенных приложений и привязка монтирует обновленное представление на место. Обратите внимание, что понижение разрешений всегда приводит к закрытию приложения.

Функциональность setns() , используемая для реализации этой функции, требует как минимум Linux 3.8, но исправления были успешно перенесены в Linux 3.4. Тест PermissionsHostTest CTS можно использовать для проверки правильности поведения ядра.