Внутрішня пам’ять додатка — це виділений простір на пристрої, доступний тільки конкретному додатку через ізольоване сховище. За даними 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також