Обзор хранилища данных и файлов

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

  • Хранилище приложения. Файлы, предназначенные только для вашего приложения, можно хранить в специальных каталогах во внутреннем или внешнем хранилище. Используйте каталоги во внутреннем хранилище, чтобы сохранять конфиденциальную информацию, к которой у других приложений не должно быть доступа.
  • Общее хранилище. Здесь хранятся файлы, которыми ваше приложение может делиться с другими приложениями, в том числе медиаконтент, документы и другие файлы.
  • Preferences. Хранение закрытых примитивных данных в парах "ключ-значение".
  • Базы данных. Храните структурированные данные в частной базе данных, используя библиотеку персистентности Room.

Характеристики этих вариантов приведены в таблице ниже.

Тип контента Способ доступа Предоставьте разрешения Есть ли доступ у других приложений? Удаляются ли файлы при удалении приложения?
Файлы, относящиеся к определенным приложениям Файлы, предназначенные только для использования в вашем приложении. Из внутренней памяти getFilesDir() или getCacheDir()

Из внешнего хранилища getExternalFilesDir() или getExternalCacheDir()
Никогда не требуется для внутренней памяти.

Не требуется для внешней памяти, если приложение используется на устройствах с Android 4.4 (уровень API 19) или более поздней версии.
Нет Да
Медиафайлы Медиафайлы, которыми можно делиться (изображения, аудиофайлы, видео). MediaStore API READ_EXTERNAL_STORAGE при доступе к файлам других приложений на устройствах с Android 11 (уровень API 30) или более поздней версии;

READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE при доступе к файлам других приложений на устройствах с Android 10 (уровень API 29).

Разрешения требуются для всех файлов на устройствах с Android 9 (уровень API 28) или более ранней версии.
Да, но у другого приложения должно быть разрешение READ_EXTERNAL_STORAGE. Нет
Документы и другие файлы Другие типы контента, которым можно делиться, включая скачанные файлы. Storage Access Framework Нет Да, через системное окно выбора файлов Нет
Настройки приложения Пары "ключ-значение" Библиотека Jetpack Preferences Нет Нет Да
Локальная база данных Структурированные реляционные данные на устройстве Библиотека персистентности Room 1 Нет Нет Да
Облачные базы данных Синхронизация данных между устройствами, совместная работа в реальном времени Cloud Firestore, Firebase SQL Connect INTERNET Использование только облачного бэкенда Кеш SDK удален, но данные в облаке сохранены.
Облачное хранилище объектов Неструктурированные данные (например, медиафайлы, большие файлы или резервные копии) Cloud Storage for Firebase INTERNET Использование только облачного бэкенда Кеш SDK удален, но данные в облаке сохранены.

1 Чтобы синхронизировать локальные базы данных Room на разных устройствах, подключите Room к облачному серверу или используйте управляемые решения для синхронизации, например Firebase.

Выбор решения зависит от ваших потребностей:

Сколько места занимают ваши данные?
Во внутреннем хранилище недостаточно места для данных приложений. Если вам нужно сохранить большой объем данных, используйте другие типы хранилищ.
Насколько надежным должен быть доступ к данным?
Если для работы основных функций приложения требуются определенные данные, например при запуске, поместите их во внутреннее хранилище или базу данных. Файлы приложений, хранящиеся на внешнем хранилище, не всегда доступны, поскольку на некоторых устройствах пользователи могут извлекать физическое устройство, соответствующее внешнему хранилищу.
Какие данные вам нужно хранить?
Если у вас есть данные, которые имеют значение только для вашего приложения, используйте хранилище для конкретного приложения. Для медиаконтента, которым можно делиться, используйте общее хранилище, чтобы другие приложения могли получить к нему доступ. Для структурированных данных используйте настройки (для данных типа "ключ-значение") или базу данных (для данных, содержащих более двух столбцов).
Должны ли данные быть доступны только вашему приложению?
Для хранения конфиденциальных данных, которые не должны быть доступны другим приложениям, используйте внутреннюю память, настройки или базу данных. Преимущество внутреннего хранилища в том, что данные скрыты от пользователей.

Категории мест хранения

В Android есть два типа хранилищ: внутреннее и внешнее. На большинстве устройств объем внутренней памяти меньше, чем внешней. Однако внутренняя память всегда доступна на всех устройствах, поэтому она является более надежным местом для размещения данных, от которых зависит ваше приложение.

Съемные носители, например SD-карты, отображаются в файловой системе как часть внешнего хранилища. Android представляет эти устройства с помощью пути, например /sdcard.

По умолчанию приложения хранятся во внутренней памяти. Однако если размер APK-файла очень велик, вы можете указать в файле манифеста приложения, что его следует устанавливать на внешний накопитель:

<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

Разрешения и доступ к внешнему хранилищу

В Android определены следующие разрешения, связанные с хранилищем: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE и MANAGE_EXTERNAL_STORAGE.

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

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

В Android 11 появилось разрешение MANAGE_EXTERNAL_STORAGE, которое предоставляет доступ на запись к файлам за пределами каталога приложения и MediaStore. Чтобы узнать больше об этом разрешении и о том, почему большинству приложений не нужно запрашивать его для выполнения своих функций, ознакомьтесь с руководством по управлению всеми файлами на устройстве хранения данных.

Области хранения данных

Чтобы пользователи могли лучше контролировать свои файлы и не захламлять хранилище, приложениям для Android 10 (уровень API 29) и более поздних версий по умолчанию предоставляется доступ к областям хранения данных. У таких приложений есть доступ только к каталогу приложения во внешнем хранилище, а также к определенным типам медиафайлов, созданных приложением.

Используйте области хранения данных, если приложению не нужен доступ к файлу, который хранится за пределами каталога приложения и каталога, к которому могут обращаться API MediaStore. Если вы храните файлы приложения на внешнем накопителе, то можете упростить переход на области хранения данных, поместив эти файлы в каталог приложения на внешнем накопителе. Это позволит приложению сохранить доступ к файлам, когда будет включена функция "Области хранения данных".

Чтобы подготовить приложение к работе с областями хранения данных, ознакомьтесь с рекомендациями по работе с хранилищем и примерами его использования. Если у вас есть другой вариант использования, который не поддерживается областями хранения данных, отправьте запрос на добавление функции. Вы можете временно отказаться от использования областей хранения данных.

Как посмотреть файлы на устройстве

Чтобы посмотреть файлы, хранящиеся на устройстве, используйте Диспетчер файлов на устройстве в Android Studio.

Дополнительные ресурсы

Дополнительную информацию о хранении данных можно найти в следующих ресурсах.

Видео