Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

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

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