Android использует файловую систему, похожую на дисковые файловые системы других платформ. Система предоставляет несколько вариантов сохранения данных приложений:
- Хранилище, предназначенное для конкретного приложения: храните файлы, предназначенные только для вашего приложения, либо в выделенных каталогах во внутреннем хранилище, либо в отдельных выделенных каталогах во внешнем хранилище. Используйте каталоги во внутреннем хранилище для хранения конфиденциальной информации, к которой другие приложения не должны иметь доступа.
- Общее хранилище: храните файлы, которыми ваше приложение собирается поделиться с другими приложениями, включая медиафайлы, документы и другие файлы.
- Настройки: хранить частные, примитивные данные в парах ключ-значение.
- Базы данных: храните структурированные данные в частной базе данных, используя библиотеку сохранения Room.
Характеристики этих вариантов приведены в следующей таблице:
Тип контента | Метод доступа | Требуются разрешения | Могут ли другие приложения получить доступ? | Файлы удаляются при удалении приложения? | |
---|---|---|---|---|---|
Файлы, специфичные для приложения | Файлы предназначены только для использования вашим приложением. | Из внутреннего хранилища, getFilesDir() или getCacheDir() Из внешнего хранилища: getExternalFilesDir() или getExternalCacheDir() | Никогда не требуется для внутреннего хранения Не требуется внешнее хранилище, если ваше приложение используется на устройствах под управлением Android 4.4 (уровень API 19) или выше. | Нет | Да |
СМИ | Медиафайлы, которыми можно поделиться (изображения, аудиофайлы, видео) | API MediaStore | READ_EXTERNAL_STORAGE при доступе к файлам других приложений на Android 11 (уровень API 30) или вышеREAD_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE при доступе к файлам других приложений на Android 10 (уровень API 29)Разрешения требуются для всех файлов на Android 9 (уровень API 28) или ниже. | Да, хотя другому приложению требуется разрешение READ_EXTERNAL_STORAGE | Нет |
Документы и другие файлы | Другие типы контента, которым можно поделиться, включая загруженные файлы | Структура доступа к хранилищу | Никто | Да, через системный файл-менеджер | Нет |
Настройки приложения | Пары ключ-значение | Библиотека настроек Jetpack | Никто | Нет | Да |
База данных | Структурированные данные | Библиотека персистентности помещений | Никто | Нет | Да |
Выбор решения зависит от ваших конкретных потребностей:
- Сколько места занимают ваши данные?
- Объём внутренней памяти для данных приложений ограничен. Используйте другие типы хранилищ, если вам нужно сохранить значительный объём данных.
- Насколько надежным должен быть доступ к данным?
- Если для базовых функций вашего приложения требуются определённые данные, например, при запуске, разместите эти данные во внутреннем каталоге хранилища или в базе данных. Файлы приложения, хранящиеся во внешнем хранилище, не всегда доступны, поскольку некоторые устройства позволяют пользователям извлекать физическое устройство, соответствующее внешнему хранилищу.
- Какие данные вам необходимо хранить?
- Если данные важны только для вашего приложения, используйте хранилище, выделенное для этого приложения. Для общего медиаконтента используйте общее хранилище, чтобы другие приложения могли получить к нему доступ. Для структурированных данных используйте настройки (для данных типа «ключ-значение») или базу данных (для данных, содержащих более двух столбцов).
- Должны ли данные быть конфиденциальными для вашего приложения?
- Для хранения конфиденциальных данных, которые не должны быть доступны из других приложений, используйте внутреннее хранилище, настройки или базу данных. Внутреннее хранилище имеет дополнительное преимущество: данные скрыты от пользователей.
Категории мест хранения
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) и выше по умолчанию предоставляется ограниченный доступ к внешнему хранилищу ( Scopeed Storage ). Такие приложения имеют доступ только к каталогу приложения на внешнем хранилище, а также к определённым типам медиафайлов, созданных приложением.
Используйте хранилище с ограниченной областью действия, если вашему приложению не требуется доступ к файлу, хранящемуся вне каталога, специфичного для приложения , и каталога, к которому имеют доступ API MediaStore
. Если вы храните файлы, специфичные для приложения, на внешнем хранилище, вы можете упростить внедрение хранилища с ограниченной областью действия, разместив эти файлы в каталоге, специфичном для приложения, на внешнем хранилище . Таким образом, ваше приложение сохранит доступ к этим файлам при включении хранилища с ограниченной областью действия.
Чтобы подготовить приложение к использованию хранилища с ограниченным доступом, ознакомьтесь с руководством по вариантам использования хранилища и рекомендациям . Если у вашего приложения есть другой вариант использования, не охватываемый хранилищем с ограниченным доступом, отправьте запрос на добавление функции . Вы можете временно отказаться от использования хранилища с ограниченным доступом .
Просмотр файлов на устройстве
Для просмотра файлов, хранящихся на устройстве, используйте проводник по устройствам Android Studio.
Дополнительные ресурсы
Дополнительную информацию о хранении данных можно найти в следующих ресурсах.