Хранилище с заданным объемом

Объем хранилища ограничивает доступ приложения к внешнему хранилищу. В Android 11 или более поздней версии приложения, ориентированные на API 30 или более поздней версии, должны использовать хранилище с ограниченной областью действия. Ранее в Android 10 приложения могли отказаться от хранилища с заданной областью.

Ограничения доступа к приложениям

Целью хранилища с заданной областью является защита конфиденциальности данных приложений и пользователей. Сюда входит защита пользовательской информации (например, метаданных фотографий), предотвращение изменения или удаления пользовательских файлов приложениями без явного разрешения, а также защита конфиденциальных пользовательских документов, загруженных в папку «Загрузка» или другие папки.

Приложения, использующие хранилище с заданной областью, могут иметь следующие уровни доступа (фактический доступ зависит от реализации).

  • Доступ для чтения и записи к собственным файлам без разрешений
  • Доступ для чтения к медиафайлам других приложений с разрешением READ_EXTERNAL_STORAGE
  • Доступ на запись к медиафайлам других приложений разрешен только с прямого согласия пользователя (исключения предоставлены Системной галерее и приложениям, имеющим право на доступ ко всем файлам).
  • Нет доступа для чтения или записи к внешним каталогам данных приложений других приложений.

Использование хранилища с ограниченной областью действия с FUSE

Android 11 или более поздней версии поддерживает файловую систему в пользовательском пространстве (FUSE), что позволяет модулю MediaProvider проверять файловые операции в пользовательском пространстве и блокировать доступ к файлам на основе политики, позволяющей разрешать , запрещать или редактировать доступ. Приложения в хранилище с областью действия, использующие FUSE, получают функции конфиденциальности хранилища с областью действия и возможность доступа к файлам с использованием прямого пути к файлу (с сохранением работы файловых API в приложениях).

В Android 10 применяются правила хранения с ограниченной областью действия для доступа к файлам со стороны MediaProvider, но не для прямого доступа к пути к файлу (например, с использованием API-интерфейсов File и NDK) из-за усилий, необходимых для перехвата вызовов ядра. В результате приложения в хранилище с заданной областью не могли получить доступ к файлам, используя прямой путь к файлу. Это ограничение повлияло на способность разработчиков приложений адаптироваться, поскольку потребовало значительных изменений кода, чтобы переписать доступ File API к MediaProvider API.

FUSE и SDCardFS

Поддержка FUSE в Android 11 не связана с прекращением поддержки SDCardFS , но предоставляет альтернативу Media Store для устройств, которые ранее использовали SDCardFS. Устройства:

  • Запуск с Android 11 или более поздней версии с ядром 5.4 или более поздней версии не может использовать SDCardFS.
  • При обновлении до Android 11 или более поздней версии FUSE может размещаться поверх SDCardFS для перехвата операций с файлами и обеспечения конфиденциальности.

Настройка производительности FUSE

Android ранее поддерживал FUSE в Android 7 или более ранней версии, в которой внешнее хранилище монтировалось как FUSE. Из-за проблем с производительностью и взаимоблокировкой в ​​этой реализации FUSE в Android 8 появилась SDCardFS. В Android 11 вновь представлена ​​поддержка FUSE с использованием улучшенной, лучше протестированной реализации libfuse , которую можно настроить для решения проблем с производительностью в Android 7 или более ранней версии.

Настройка FUSE включает следующие настройки:

  • Обход FUSE для каталогов Android/data и Android/obb для повышения производительности игровых приложений, использующих эти каталоги.
  • Оптимизации (такие как настройка коэффициентов упреждающего чтения и грязных файлов файловой системы FUSE) для поддержания производительности чтения и плавного воспроизведения мультимедиа.
  • Использование кэша с обратной записью FUSE.
  • Кэширование разрешений для уменьшения IPC на системный сервер.
  • Оптимизация приложений с доступом ко всем файлам для ускорения массовых операций.

Вышеупомянутые настройки настройки могут обеспечить сравнимую производительность между устройствами FUSE и без FUSE. Например, тестирование настроенного Pixel 2 с помощью FUSE и Pixel 2 с использованием Media Store показало сопоставимую производительность последовательного чтения (например, воспроизведения видео) между доступом к пути к файлу и Media Store. Однако последовательная запись была немного хуже с FUSE, а произвольное чтение и запись могли быть в два раза медленнее.

Измерения производительности могут меняться от устройства к устройству и между конкретными вариантами использования. Поскольку API-интерфейсы MediaProvider обеспечивают наиболее стабильную производительность, разработчики приложений, которые заботятся о производительности, должны использовать API-интерфейсы MediaProvider для своих приложений.

Снижение влияния на производительность FUSE

Влияние FUSE на производительность ограничивается активными пользователями файлов, хранящихся только во внешнем общем хранилище. Внешнее частное хранилище (которое включает каталоги android/data и android/obb ) обходит FUSE, в то время как внутреннее хранилище (такое как /data/data , где многие приложения хранят данные для обеспечения их шифрования и защиты) не монтируется FUSE.

  • Приложения, которые мало используют общее внешнее хранилище, часто взаимодействуют с ограниченным набором файлов (обычно менее 100 файлов). Эти приложения выигрывают от существующих оптимизаций общих операций чтения и записи и не должны испытывать никакого влияния на производительность, связанного с FUSE, в Android 11.

  • Приложения, активно использующие общее внешнее хранилище, обычно выполняют массовые операции с файлами, такие как вывод списка или удаление каталога с 1000 файлами или создание или удаление каталога с миллионом файлов в файловой системе. FUSE на Android 11 может повлиять на массовые операции с файлами, но если такие приложения имеют право на разрешение MANAGE_EXTERNAL_STORAGE , они получат преимущества от оптимизации производительности, включенной в обновление за октябрь 2020 года.

Чтобы избежать накладных расходов на производительность FUSE, приложения могут хранить данные во внешнем частном хранилище или использовать массовые API-интерфейсы в классе ContentProvider , чтобы обойти FUSE и получить путь, оптимизированный для производительности. Кроме того, обновление системного компонента MediaProvider за октябрь 2020 г. включает оптимизацию производительности для файловых менеджеров и аналогичных приложений (таких как резервное копирование/восстановление, антивирус), которые имеют разрешение MANAGE_EXTERNAL_STORAGE .

Конфиденциальность выше производительности

На устройствах, которые были настроены для FUSE, наиболее важные переходы пользователей одинаково эффективны между Android 10 и Android 11. Однако при тестировании тестов по набору файловых операций Android 11 может работать хуже, чем Android 10. Для шаблонов доступа к файлам, которые работают хуже в Android 11 (например, случайное чтение или запись), мы рекомендуем использовать API-интерфейсы MediaProvider, чтобы предоставить приложениям режим доступа без FUSE, который является лучшим и стабильно эффективным вариантом.

Обновления MediaProvider и FUSE

Поведение системного компонента MediaProvider отличается в разных версиях Android.

  • В Android 10 и более ранних версиях SDCardFS была файловой системой, а MediaProvider предоставлял интерфейс для коллекций файлов (например, изображений, видео, музыкальных файлов и т. д.). Когда приложение создает файл с помощью File API, оно может попросить MediaProvider отсканировать файл и записать его в базу данных.

  • В Android 11 или более поздней версии SDCardFS устарела, а MediaProvider становится обработчиком файловой системы (для FUSE) для внешнего хранилища, что обеспечивает согласованность файловой системы во внешнем хранилище и базы данных MediaProvider. Как обработчик пользовательского пространства для файловой системы FUSE, MediaProvider может перехватывать вызовы ядра и обеспечивать конфиденциальность файловых операций.

В Android 11 и более поздних версиях MediaProvider также является модульным системным компонентом (модулем Mainline), который можно обновлять вне выпусков Android. Это означает, что проблемы с производительностью, конфиденциальностью или безопасностью, обнаруженные в MediaProvider, могут быть исправлены и доставлены по беспроводной сети из Google Play Store или других механизмов, предоставляемых партнерами. Все, что ожидается от обработчика FUSE, также может быть обновлено, что позволяет обновлять исправления для исправления снижения производительности FUSE и ошибок.