Внутренняя память приложения — это выделенное пространство на устройстве, доступное только конкретному приложению через изолированное хранилище. По данным Android Developers, 2026, каждое приложение получает собственный sandbox-каталог, к которому другие приложения не имеют прямого доступа. Такой подход защищает данные от несанкционированного чтения и обеспечивает стабильную работу в многозадачной среде мобильных устройств.
Главное
Context.getFilesDir(), getCacheDir() и getDataDir() для доступа к внутренней памятиNSDocumentDirectory и NSCachesDirectory в Sandbox-контейнере приложенияВнутренняя память приложения — это изолированная директория, которую операционная система выделяет каждому приложению при его установке. К этой директории не имеют доступа другие приложения и пользователь через стандартные файловые менеджеры. Система гарантирует, что данные внутри этой директории будут полностью удалены при деинсталляции приложения. Такой подход составляет основу модели безопасности мобильных операционных систем, предотвращая утечку конфиденциальной информации между программами.
В отличие от внешнего хранилища (SD-карты), внутренняя память всегда доступна и не требует проверки на наличие носителя. Скорость чтения и записи в NAND-флеш-память современных устройств достигает 800–900 МБ/с последовательного чтения и 200–300 МБ/с последовательной записи, что сопоставимо с SATA SSD. Размер выделяемой области зависит от общего объёма устройства и политики производителя: на устройствах с 64 ГБ флеш-памяти приложение получает от 16 до 64 МБ начального пространства с возможностью расширения по мере необходимости.
Архитектура внутреннего хранилища различается на Android и iOS. На Android каждое приложение получает каталог /data/data/<package_name>/, внутри которого системой создаются поддиректории files/, cache/ и databases/. На iOS приложение работает в Sandbox-контейнере с каталогами Documents/, Library/ и tmp/, каждый из которых имеет своё назначение и политику резервного копирования.
Разработчикам доступно несколько способов сохранения данных во внутренней памяти приложения. Каждый метод решает свою задачу и подходит для определённого типа данных. Выбор правильного способа напрямую влияет на производительность приложения, удобство разработки и безопасность пользовательских данных.
Самый низкоуровневый способ — прямая запись файлов в директорию files. Приложение может создавать любые файлы и каталоги внутри своей песочницы. Этот метод подходит для хранения медиафайлов, документов пользователя и любых бинарных данных, которые не требуют структурированной организации. На Android доступ к директории осуществляется через вызов Context.getFilesDir(), который возвращает абсолютный путь к каталогу файлов приложения. На iOS аналогичную функцию выполняет NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).
Для хранения пар ключ-значение Android предлагает SharedPreferences и более современный DataStore на основе Kotlin-корутин и протокола protobuf. SharedPreferences хранит данные в XML-файле внутри директории /data/data/<package>/shared_prefs/. Несмотря на простоту использования, SharedPreferences имеет недостатки: синхронная запись может вызывать задержки на UI-потоке, а отсутствие типобезопасности повышает риск ошибок. DataStore решает эти проблемы, предоставляя асинхронный API на основе Flow и полную поддержку типов через protobuf-схемы.
Для структурированных данных с реляционными связями оптимальным выбором становится SQLite или обёртка Room. База данных хранится в единственном файле внутри директории databases/ и поддерживает полный SQL-синтаксис. Room — это официальная библиотека Jetpack, которая предоставляет типобезопасный API, автоматическую миграцию схем и поддержку корутин. Размер базы данных может достигать нескольких гигабайт без существенной потери производительности при правильной индексации. SQLite на мобильных устройствах обрабатывает до 50 000 операций записи в секунду на современном флагманском процессоре.
Для хранения конфиденциальных данных, таких как токены аутентификации и ключи шифрования, Android предоставляет EncryptedSharedPreferences. Эта обёртка над стандартными SharedPreferences автоматически шифрует ключи и значения с использованием AES256-GCM-None. Шифрование выполняется на уровне файла перед записью на диск, поэтому даже при физическом доступе к устройству злоумышленник не сможет прочитать содержимое. EncryptedSharedPreferences входит в состав библиотеки AndroidX Security, которая также включает EncryptedFile для шифрования целых файлов.
Android SDK предоставляет набор методов для работы с внутренней памятью через класс Context. Каждый метод возвращает путь к определённой системной директории внутри песочницы приложения. Рассмотрим базовые операции записи и чтения файлов на примере Kotlin.
Главный метод для получения пути к внутренней файловой директории — context.filesDir. Он возвращает объект File, указывающий на каталог /data/data/<package>/files/. При первом обращении система создаёт все необходимые родительские каталоги автоматически. Размер файлов во внутренней памяти не ограничен явно, но суммарный объём данных не должен превышать доступное пространство раздела /data, которое обычно составляет 60–80% от общего объёма флеш-памяти устройства.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Содержание заметки")
val content = file.readText()
println("Прочитано: $content")
Методы writeText и readText являются extension-функциями стандартной библиотеки Kotlin. Они автоматически управляют открытием и закрытием потоков, что исключает утечку памяти. Для работы с бинарными данными используйте writeBytes и readBytes, которые не требуют кодировки и работают с массивами ByteArray. При работе с большими файлами рекомендуется использовать буферизированные потоки: BufferedReader и BufferedWriter для текста, BufferedInputStream и BufferedOutputStream для бинарных данных.
Для организации файлов в иерархию создавайте поддиректории внутри filesDir. Это помогает структурировать данные по типам: изображения, документы, экспортные файлы. Метод mkdirs() создаёт все недостающие каталоги в пути, включая вложенные. Убедитесь, что операция создания прошла успешно — метод возвращает true только при создании новых каталогов. Ошибка создания чаще всего связана с нехваткой места на разделе /data или исчерпанием инодов файловой системы.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Директория создана")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Для проверки доступного пространства перед записью больших файлов используйте File.getFreeSpace() или File.getUsableSpace(). Второй метод возвращает количество байт, доступное текущему приложению с учётом квот безопасности, — он более точен в контексте многопользовательских устройств. Если доступное пространство меньше ожидаемого размера файла, покажите пользователю сообщение и предложите освободить место в настройках устройства.
На iOS каждое приложение работает в изолированном Sandbox-контейнере. Система не предоставляет API для выхода за его пределы без специальных entitlements. Основным инструментом для работы с файловой системой служит класс FileManager из Foundation framework. Sandbox-контейнер включает несколько стандартных каталогов, каждый из которых имеет свою политику резервного копирования.
Директория Documents предназначена для пользовательских данных, которые должны сохраняться между запусками приложения и восстанавливаться из резервной копии. iOS автоматически включает этот каталог в резервное копирование на iCloud и iTunes. Метод urls(for:in:) возвращает массив URL-адресов запрошенной директории — первый элемент массива является основным.
let fm = FileManager.default
let docs = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docs.appendingPathComponent("data.plist")
try data.write(to: fileURL)
FileManager поддерживает полный набор файловых операций: создание, копирование, перемещение, удаление и переименование файлов. Каждая операция может выбрасывать ошибку, поэтому все вызовы необходимо оборачивать в конструкцию do-catch. Особое внимание уделяйте удалению файлов — операция необратима, и восстановить данные после removeItem(at:) невозможно без предварительной резервной копии.
Не все данные в Sandbox-контейнере должны попадать в резервную копию iCloud. Например, кэш загруженных изображений или временные файлы обработки не нужно восстанавливать — они будут пересозданы при следующем использовании. Для исключения каталога или файла из резервного копирования установите атрибут isExcludedFromBackup в значение true. Apple рекомендует всегда исключать из резерва данные, которые можно восстановить удалённо, чтобы минимизировать объём iCloud-хранилища и сократить время восстановления.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
У каждого типа хранилища на мобильном устройстве есть своё назначение и правила использования. Понимание этих отличий помогает разработчику выбрать правильное место для каждого вида данных. Ниже приведено сравнение трёх основных типов хранилища, доступных приложению.
| Характеристика | Internal Storage | Cache Directory | External Storage |
|---|---|---|---|
| Видимость для других приложений | Скрыта | Скрыта | Доступна |
| Удаление при удалении приложения | Полное | Полное | Зависит от расположения |
| Резервное копирование | На Android — нет, на iOS — да (Documents) | Нет | Только при синхронизации |
| Доступность без носителя | Всегда | Всегда | Требует SD-карту |
| Риск потери данных | Минимальный | Высокий | Средний |
| Рекомендуемый размер файлов | До 100 МБ | До 50 МБ | Любой |
Внутренняя память оптимальна для хранения конфигураций приложения, файлов базы данных и пользовательских документов, которые не должны быть доступны другим программам. Кэш-директория предназначена для временных файлов, которые можно пересоздать при следующем использовании: загруженные изображения, ответы API, промежуточные данные обработки. Внешнее хранилище лучше всего подходит для больших медиафайлов (фото, видео, музыка) и данных, которыми пользователь хочет делиться с другими приложениями через общий доступ.
Выбор типа хранилища также влияет на рейтинг приложения в Google Play и App Store. Приложения, сохраняющие большие объёмы данных во внутренней памяти без очистки, получают негативные отзывы: пользователи жалуются на нехватку места. Согласно исследованию App Annie, 62% пользователей удаляют приложение, если оно занимает более 500 МБ внутренней памяти устройства без опции очистки.
Правильное управление внутренней памятью приложения повышает производительность, безопасность и пользовательский опыт. Следующие рекомендации основаны на официальной документации Android и iOS, а также на практическом опыте разработки приложений с миллионами установок.
Отдельное внимание стоит уделить тестированию граничных случаев. Проверяйте поведение приложения при переполнении внутренней памяти, при внезапном прерывании записи (падение приложения, звонок) и при восстановлении из резервной копии iOS. В каждом из этих сценариев данные должны оставаться консистентными или восстанавливаться до последнего стабильного состояния. Используйте транзакционные файлы: записывайте данные во временный файл, а затем атомарно переименовывайте его в целевой. Это предотвращает чтение повреждённых данных при сбое записи.
Не забывайте про пользовательский контроль. Предоставьте в настройках приложения опцию очистки временных данных и отображение занятого объёма внутренней памяти. По данным Google Play Console, приложения с такой функцией получают на 18% больше положительных отзывов в категории «Производительность».
Часто задаваемые вопросы
Все данные из внутренней памяти приложения удаляются полностью. Операционная система гарантирует отсутствие остаточных файлов, включая базы данных, настройки и временные файлы. Данные на внешнем хранилище при этом могут сохраниться.
Без root-доступа к устройству другие приложения не могут читать файлы из Internal Storage другого приложения. На Android для этого требуются привилегии суперпользователя, а на iOS изоляция обеспечивается на уровне ядра через Sandbox.
Явного лимита нет, но общий объём ограничен свободным пространством на разделе /data. Рекомендуется не превышать 100 МБ на приложение — большие объёмы лучше размещать на внешнем хранилище или в облаке.
filesDir предназначен для постоянных данных приложения и не удаляется системой без необходимости. cacheDir — для временных файлов, которые система может удалить при нехватке памяти. Система не гарантирует сохранность cacheDir.
Прямое копирование из Internal Storage на SD-карту запрещено политикой безопасности. Используйте MediaStore API на Android 10+ или SAF (Storage Access Framework) для создания копий данных в общем доступе с согласия пользователя.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также