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