Понимание ограниченного хранилища Android: что изменилось и почему это важно

A smartphone beside small storage drawers with one locked, illustrating Android scoped storage

Если вы когда-либо пытались управлять файлами на устройстве Android, вы, вероятно, замечали, что все работает по-разному в зависимости от того, какую версию Android вы используете. Начиная с Android 10, Google внес фундаментальный сдвиг во взаимодействие приложений с файловой системой. Это изменение, известное как Ограниченное хранилище, переопределило правила чтения и записи файлов в общем хранилище. Для пользователей, которые загружают неопубликованные приложения, управляют файлами OBB или работают с файловыми менеджерами, важно понимать объем хранилища.

В этой статье мы рассмотрим, что такое ограниченное хранилище, почему Google внедрил его, как оно влияет на обычных пользователей и разработчиков и что это значит для всех, кто устанавливает файлы APK или XAPK за пределами Play Store.

Проблема со старой моделью хранения

До Android 10 любое приложение, запрашивавшее разрешение READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE, могло получить доступ практически к любому файлу в общем хранилище устройства. Сюда входили фотографии, документы, загрузки и даже файлы, созданные другими приложениями. Хотя это сделало управление файлами удобным, оно создало серьезные проблемы конфиденциальности и безопасности.

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

Такой широкий доступ привел к реальным проблемам. Некоторые приложения собирали пользовательские данные, сканируя хранилище на наличие конфиденциальных файлов. Другие оставили после себя потерянные файлы, которые загромождали устройство еще долгое время после удаления приложения. Google нужно было решение, которое сбалансировало бы удобство использования и конфиденциальность, и ответом на это стало ограниченное хранилище.

Что на самом деле делает хранилище с ограниченной областью действия

Изолированное хранилище (Scoped Storage) кардинально меняет взаимодействие приложений с файловой системой. В рамках этой модели каждое приложение получает собственную закрытую песочницу во внешнем хранилище, обычно расположенную по пути /Android/data/[package.name]/. Приложения могут свободно читать и писать в своей песочнице без каких-либо разрешений.

Однако доступ к файлам за пределами этой песочницы требует использования контролируемых API. Вот как работает новая модель:

Хранилище для конкретных приложений

У каждого приложения есть выделенный каталог, доступ к которому имеет только оно. Когда приложение удаляется, этот каталог автоматически очищается. Никакое другое приложение не может читать или писать в это место без root-доступа. Это устраняет проблему потерянных файлов и предотвращает отслеживание данных между приложениями.

Медиа-коллекции

Для совместно используемых медиафайлов, таких как фотографии, видео и аудиофайлы, Android предоставляет API MediaStore. Приложения могут добавлять медиафайлы в общие коллекции и читать медиафайлы, созданные другими приложениями, но только через этот структурированный интерфейс. Приложение может видеть свои собственные медиафайлы без какого-либо разрешения, но для доступа к медиафайлам других приложений требуются разрешения READ_MEDIA_IMAGES, READ_MEDIA_VIDEO или READ_MEDIA_AUDIO, представленные в Android 13.

Платформа доступа к хранилищу

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

Разрешение MANAGE_EXTERNAL_STORAGE

Для приложений, которым действительно необходим широкий доступ к файлам, таких как файловые менеджеры, инструменты резервного копирования и антивирусное программное обеспечение, Android предоставляет разрешение MANAGE_EXTERNAL_STORAGE. Однако это разрешение требует специального одобрения Google для приложений, распространяемых через Play Store, и пользователи должны предоставить его вручную через настройки системы, а не через простое диалоговое окно.

График внедрения

Google не стал применять ограниченное хранилище в одночасье. Переход происходил постепенно:

  • Было введено хранилище с ограниченной областью действия Android 10 (API 29):, но приложения могли отказаться от него, используя requestLegacyExternalStorage="true" в своем манифесте. Это дало разработчикам время адаптироваться.
  • Android 11 (API 30): Флаг устаревшей версии игнорировался для приложений, ориентированных на API 30 или выше. Ограниченное хранилище стало обязательным для новых и обновленных приложений в Play Store.
  • Android 12 и более поздние версии: Были внесены дальнейшие усовершенствования, включая детальные разрешения мультимедиа и улучшенную производительность SAF.
  • Android 13 (API 33): Широкое разрешение READ_EXTERNAL_STORAGE было упразднено в пользу конкретных разрешений мультимедиа.
  • Android 14 (API 34): Был введен частичный доступ к фотографиям и видео, позволяющий пользователям предоставлять доступ к определенным файлам, а не ко всем медиатекам.

Как ограниченное хранилище влияет на неопубликованную загрузку

Для пользователей, которые устанавливают приложения не из Play Store, хранилище с ограниченной областью создает некоторые практические проблемы, которые стоит понять.

Загрузка и доступ к APK-файлам

Когда вы загружаете APK-файл через браузер, он обычно попадает в папку «Загрузки». В ограниченном хранилище этот файл принадлежит приложению браузера. Если вы хотите установить его с помощью другого приложения, например файлового менеджера, этому файловому менеджеру потребуется соответствующий доступ. Большинство современных файловых менеджеров корректно справляются с этим через SAF, но более старые могут испытывать трудности.

Установщик системного пакета по-прежнему может получить доступ к файлам, которые вы явно выбираете через средство выбора файлов, поэтому основной процесс загрузки и установки APK по-прежнему работает. Однако автоматизированные процессы установки, которые полагались на прямой доступ по путям к файлам, могут перестать работать.

OBB-файлы и игровые данные

Именно здесь ограниченное хранилище создает наибольшие трудности для пользователей с боковой загрузкой. Многие большие игры используют файлы OBB (Opaque Binary Blob), хранящиеся в /Android/obb/[package.name]/. В старой модели вы могли просто скопировать файлы OBB в правильный каталог с помощью любого файлового менеджера.

При использовании ограниченного хранилища каталог /Android/obb/ ограничен. В Android 11 и более поздних версиях обычные приложения не могут записывать данные в каталог OBB другого приложения. Это означает, что если вы загружаете файл XAPK, содержащий данные OBB, установщику потребуется специальная обработка для правильного размещения этих файлов.

Такие инструменты, как наш Экстрактор OBB, могут помочь вам извлечь файлы OBB из пакетов XAPK, но для их размещения в правильном каталоге в более новых версиях Android может потребоваться использование файлового менеджера с разрешением MANAGE_EXTERNAL_STORAGE или использование команд ADB с компьютера.

Рекомендации по установке XAPK

Файлы XAPK объединяют APK вместе с данными OBB и иногда разделяют конфигурации APK. Для их установки на устройства под управлением Android 11 или более поздней версии требуется установщик, который понимает ограничения объема хранилища. Установщику необходимо либо иметь разрешение MANAGE_EXTERNAL_STORAGE, либо использовать соответствующие API для размещения файлов OBB в правильном месте.

Это одна из причин, почему преобразование файлов XAPK в стандартный формат APK может быть полезным. Автономный APK-файл не требует размещения файла OBB, что упрощает процесс установки на более новых версиях Android. Вы можете использовать наш Конвертер XAPK в APK для извлечения базового APK из пакета XAPK.

Что нужно знать разработчикам

Если вы разрабатываете приложения для Android, хранилище с ограниченной областью требует переосмысления того, как вы обрабатываете файлы:

  • Используйте каталоги для конкретных приложений для любых файлов, которые нужны только вашему приложению. Они не требуют никаких разрешений и автоматически удаляются при удалении.
  • Используйте МедиаStore для фотографий, видео и аудио, которые должны быть видны другим приложениям и пережить удаление.
  • Используйте САФ, когда вашему приложению необходимо работать с выбранными пользователем документами или каталогами.
  • Избегайте жестко закодированных путей к файлам. Paths like /sdcard/MyApp/ are no longer reliable. Вместо этого используйте Context.getExternalFilesDir().
  • Тестируйте на нескольких уровнях API. Поведение существенно различается в Android 10, 11, 13 и 14.

Миграционные стратегии

Если ваше приложение ранее хранило файлы в общем хранилище, вам понадобится план миграции. Рекомендуемый подход — скопировать существующие файлы в хранилище конкретного приложения при первом запуске после обновления, а затем удалить старые копии. Используйте Environment.getExternalStorageDirectory() с флагом наследия во время переходного периода, чтобы прочитать старые файлы, а затем переместить их в новое место.

Распространенные заблуждения

«Ограниченное хранилище означает, что приложения не могут получить доступ ни к каким файлам»

Это неверно. Приложения по-прежнему могут свободно обращаться к своим собственным файлам, добавлять данные в общие медиаколлекции и запрашивать доступ к отдельным файлам через системное окно выбора. Что изменилось, так это то, что приложения больше не могут бесшумно просматривать всю файловую систему.

«Файловые менеджеры не работают в новых версиях Android»

Файловые менеджеры, запрашивающие MANAGE_EXTERNAL_STORAGE, по-прежнему работают. Пользователю просто нужно предоставить это специальное разрешение в настройках. Большинство популярных файловых менеджеров уже адаптировались к этому требованию.

«Ограниченное хранилище влияет только на SD-карту»

Ограниченное хранилище применяется ко всему общему хранилищу, включая внутреннее общее хранилище. Термин «внешнее хранилище» в Android относится к общему хранилищу, доступному для нескольких приложений, не обязательно к физической SD-карте.

Практические советы для пользователей

Если вы регулярно загружаете приложения или управляете файлами на своем устройстве Android, вот несколько практических рекомендаций:

  1. Используйте современный файловый менеджер, который поддерживает MANAGE_EXTERNAL_STORAGE. Такие приложения, как Solid Explorer, MiXplorer и Total Commander, хорошо адаптировались к хранилищам с ограниченной областью действия.
  2. Предоставляйте разрешения осторожно. Когда файловый менеджер запрашивает «Доступ ко всем файлам», знайте, что это разрешение MANAGE_EXTERNAL_STORAGE и оно необходимо для полной функциональности.
  3. Используйте ADB для сложных файловых операций. Если вы не можете разместить файлы OBB через файловый менеджер, подключение вашего устройства к компьютеру и использование adb push полностью обходит ограничения на объем хранилища.
  4. Преобразуйте сложные пакеты в более простые форматы. Если файл XAPK вызывает проблемы на новом устройстве, извлечение только компонента APK может оказаться путем наименьшего сопротивления.
  5. Постоянно обновляйте приложения-установщики. Старые версии установщиков XAPK могут неправильно обрабатывать ограниченное хранилище.

Будущее хранилища Android

Google продолжает совершенствовать модель хранения данных с каждой версией Android. В Android 14 появился частичный доступ к мультимедиа, позволяющий пользователям делиться с приложением конкретными фотографиями, а не всей своей библиотекой. Ожидается, что Android 15 внесет дальнейшие улучшения в производительность и удобство использования Storage Access Framework.

Тенденция очевидна: Android движется к модели, в которой пользователи имеют детальный контроль над тем, что каждое приложение может видеть и изменять. Хотя это создает некоторые трудности для опытных пользователей и разработчиков неопубликованных приложений, это значительно повышает конфиденциальность и безопасность для более широкой базы пользователей.

Работа с ограниченным хранилищем без нарушения данных приложения

Изолированное хранилище (Scoped Storage) представляет собой одно из самых значительных изменений в архитектуре Android за последние годы. Ограничив приложения собственными «песочницами» и требуя явного согласия пользователя для более широкого доступа, Google значительно улучшил уровень конфиденциальности платформы. Пользователям, которые загружают неопубликованные приложения и управляют файлами вручную, понимание этих ограничений поможет обойти случайные проблемы. А для разработчиков адаптация к изолированному хранилищу является не дополнительной опцией, а фундаментальным требованием современной разработки под Android.

Установка APK, размещение файлов OBB и просто повседневное управление хранилищем выполняются в одной и той же системе: хранилище с ограниченной областью действия. Как только вы поймете, как это работает, вы сможете контролировать свое устройство, а не зависеть от приложений, которые могут злоупотреблять широким доступом к файлам.

Разработано и задокументировано Мстом Шафале Ведущий разработчик и архитектор пакетов Android • Проверено на Android 12–15.

Мст Шаефале поддерживает клиентское слияние XAPK/APKS, анализатор двоичных манифестов и инструменты подписи APK v1+v2 по адресу xapktoapk.com. Обнаружили устаревшую команду или изменение ОС? Отправить редакционную заметку.