Внутрішня пам’ять додатка: що це, способи зберігання даних і як працює в розробці

Автор: IT Sectr Опубліковано: 2026-03-13 Час читання: 11 хв

Внутрішня пам’ять додатка — це виділений простір на пристрої, доступний тільки конкретному додатку через ізольоване сховище. За даними Android Developers, 2026, кожен додаток отримує власний sandbox-каталог, до якого інші додатки не мають прямого доступу. Такий підхід захищає дані від несанкціонованого читання і забезпечує стабільну роботу в багатозадачному середовищі мобільних пристроїв.

Головне

  • Internal Storage — ізольоване сховище кожного додатка, недоступне іншим програмам
  • Sandbox-модель гарантує, що дані одного додатка не можуть бути прочитані іншим без спеціальних дозволів
  • Android надає Context.getFilesDir(), getCacheDir() і getDataDir() для доступу до внутрішньої пам’яті
  • iOS використовує 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).

SharedPreferences і DataStore

Для зберігання пар ключ-значення Android пропонує SharedPreferences і більш сучасний DataStore на основі Kotlin-корутин і протоколу protobuf. SharedPreferences зберігає дані в XML-файлі всередині директорії /data/data/<package>/shared_prefs/. Незважаючи на простоту використання, SharedPreferences має недоліки: синхронний запис може викликати затримки на UI-потоці, а відсутність типобезпеки підвищує ризик помилок. DataStore вирішує ці проблеми, надаючи асинхронний API на основі Flow і повну підтримку типів через protobuf-схеми.

База даних SQLite і Room

Для структурованих даних з реляційними зв’язками оптимальним вибором стає SQLite або обгортка Room. База даних зберігається в єдиному файлі всередині директорії databases/ і підтримує повний SQL-синтаксис. Room — це офіційна бібліотека Jetpack, яка надає типобезпечний API, автоматичну міграцію схем і підтримку корутин. Розмір бази даних може досягати декількох гігабайт без істотної втрати продуктивності при правильній індексації. SQLite на мобільних пристроях обробляє до 50 000 операцій запису в секунду на сучасному флагманському процессорі.

EncryptedSharedPreferences

Для зберігання конфіденційних даних, таких як токени автентифікації та ключі шифрування, Android надає EncryptedSharedPreferences. Ця обгортка над стандартними SharedPreferences автоматично шифрує ключі та значення з використанням AES256-GCM-None. Шифрування виконується на рівні файлу перед записом на диск, тому навіть при фізичному доступі до пристрою зловмисник не зможе прочитати вміст. EncryptedSharedPreferences входить до складу бібліотеки AndroidX Security, яка також включає EncryptedFile для шифрування цілих файлів.

Як працювати з внутрішньою пам’яттю на Android

Android SDK надає набір методів для роботи з внутрішньою пам’яттю через клас Context. Кожен метод повертає шлях до певної системної директорії всередині пісочниці додатка. Розглянемо базові операції запису та читання файлів на прикладі Kotlin.

Доступ до filesDir через Context

Головний метод для отримання шляху до внутрішньої файлової директоріїcontext.filesDir. Він повертає об’єкт File, що вказує на каталог /data/data/<package>/files/. При першому зверненні система створює всі необхідні батьківські каталоги автоматично. Розмір файлів у внутрішній пам’яті не обмежений явно, але сумарний об’єм даних не повинен перевищувати доступний простір розділу /data, який зазвичай становить 60–80% від загального об’єму флеш-пам’яті пристрою.

kotlin
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 або вичерпанням інодів файлової системи.

kotlin
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
    println("Директорію створено")
}

val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)

Для перевірки доступного простору перед записом великих файлів використовуйте File.getFreeSpace() або File.getUsableSpace(). Другий метод повертає кількість байт, доступних поточному додатку з урахуванням квот безпеки, — він більш точний у контексті багатокористувацьких пристроїв. Якщо доступний простір менший за очікуваний розмір файлу, покажіть користувачеві повідомлення і запропонуйте звільнити місце в налаштуваннях пристрою.

Як працювати з внутрішньою пам’яттю на iOS

На iOS кожен додаток працює в ізольованому Sandbox-контейнері. Система не надає API для виходу за його межі без спеціальних entitlements. Основним інструментом для роботи з файловою системою служить клас FileManager із Foundation framework. Sandbox-контейнер включає декілька стандартних каталогів, кожен з яких має свою політику резервного копіювання.

Доступ до Documents Directory через FileManager

Директорія Documents призначена для користувацьких даних, які повинні зберігатися між запусками додатка і відновлюватися з резервної копії. iOS автоматично включає цей каталог у резервне копіювання на iCloud та iTunes. Метод urls(for:in:) повертає масив URL-адрес запитаної директорії — перший елемент масиву є основним.

swift
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-сховища і скоротити час відновлення.

swift
var cacheURL = fm.urls(
    for: .cachesDirectory,
    in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true

var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)

Відмінності внутрішньої пам’яті від кеша та зовнішнього сховища

У кожного типу сховища на мобільному пристрої є своє призначення і правила використання. Розуміння цих відмінностей допомагає розробнику вибрати правильне місце для кожного виду даних. Нижче наведено порівняння трьох основних типів сховища, доступних додатку.

ХарактеристикаInternal StorageCache DirectoryExternal Storage
Видимість для інших додатківПрихованаПрихованаДоступна
Видалення при видаленні додаткаПовнеПовнеЗалежить від розташування
Резервне копіюванняНа Android — ні, на iOS — так (Documents)НіТільки при синхронізації
Доступність без носіяЗавждиЗавждиПотребує SD-карту
Ризик втрати данихМінімальнийВисокийСередній
Рекомендований розмір файлівДо 100 МБДо 50 МББудь-який

Внутрішня пам’ять оптимальна для зберігання конфігурацій додатка, файлів бази даних і користувацьких документів, які не повинні бути доступні іншим програмам. Кеш-директорія призначена для тимчасових файлів, які можна перестворити при наступному використанні: завантажені зображення, відповіді API, проміжні дані обробки. Зовнішнє сховище найкраще підходить для великих медіафайлів (фото, відео, музика) і даних, якими користувач хоче ділитися з іншими додатками через спільний доступ.

Вибір типу сховища також впливає на рейтинг додатка в Google Play і App Store. Додатки, що зберігають великі об’єми даних у внутрішній пам’яті без очищення, отримують негативні відгуки: користувачі скаржаться на нестачу місця. Згідно з дослідженням App Annie, 62% користувачів видаляють додаток, якщо він займає більше 500 МБ внутрішньої пам’яті пристрою без опції очищення.

Рекомендації щодо використання внутрішньої пам’яті

Правильне управління внутрішньою пам’яттю додатка підвищує продуктивність, безпеку та користувацький досвід. Наступні рекомендації засновані на офіційній документації Android і iOS, а також на практичному досвіді розробки додатків з мільйонами встановлень.

  • Мінімізуйте об’єм даних, що зберігаються. Використовуйте внутрішню пам’ять тільки для критично важливих файлів, решту розміщуйте в кеші або на зовнішньому сховищі
  • Регулярно очищайте тимчасові файли. Перевіряйте директорію cache при кожному запуску і видаляйте файли старші 24 годин — це знижує навантаження на систему і запобігає переповненню розділу /data
  • Шифруйте конфіденційні дані за допомогою EncryptedSharedPreferences або EncryptedFile з бібліотеки AndroidX Security. Зберігання токенів і паролів у відкритому вигляді — поширена вразливість, яку експлуатують трояни з root-доступом
  • Використовуйте міграцію при оновленні структури файлів. При випуску нової версії додатка перевіряйте наявність старих файлів і переносьте їх у нові директорії, перш ніж видаляти старі

Окрему увагу варто приділити тестуванню граничних випадків. Перевіряйте поведінку додатка при переповненні внутрішньої пам’яті, при раптовому перериванні запису (падіння додатка, дзвінок) і при відновленні з резервної копії iOS. У кожному з цих сценаріїв дані повинні залишатися консистентними або відновлюватися до останнього стабільного стану. Використовуйте транзакційні файли: записуйте дані в тимчасовий файл, а потім атомарно перейменовуйте його в цільовий. Це запобігає читанню пошкоджених даних при збої запису.

Не забувайте про користувацький контроль. Надайте в налаштуваннях додатка опцію очищення тимчасових даних і відображення зайнятого об’єму внутрішньої пам’яті. За даними Google Play Console, додатки з такою функцією отримують на 18% більше позитивних відгуків у категорії «Продуктивність».

Часті запитання

Що станеться з Internal Storage після видалення додатка?

Всі дані з внутрішньої пам’яті додатка видаляються повністю. Операційна система гарантує відсутність залишкових файлів, включаючи бази даних, налаштування та тимчасові файли. Дані на зовнішньому сховищі при цьому можуть зберегтися.

Чи може інший додаток прочитати мої файли з Internal Storage?

Без root-доступу до пристрою інші додатки не можуть читати файли з Internal Storage іншого додатка. На Android для цього потрібні привілеї суперкористувача, а на iOS ізоляція забезпечується на рівні ядра через Sandbox.

Який максимальний об’єм даних можна зберігати у внутрішній пам’яті?

Явного ліміту немає, але загальний об’єм обмежений вільним простором на розділі /data. Рекомендується не перевищувати 100 МБ на додаток — великі об’єми краще розміщувати на зовнішньому сховищі або в хмарі.

У чому різниця між filesDir і cacheDir на Android?

filesDir призначений для постійних даних додатка і не видаляється системою без необхідності. cacheDir — для тимчасових файлів, які система може видалити при нестачі пам’яті. Система не гарантує збереженість cacheDir.

Як перенести дані з Internal Storage на SD-карту?

Пряме копіювання з Internal Storage на SD-карту заборонено політикою безпеки. Використовуйте MediaStore API на Android 10+ або SAF (Storage Access Framework) для створення копій даних у спільному доступі за згодою користувача.

Підсумки

  • Internal Storage — ізольована директорія кожного додатка, захищена від доступу інших програм і користувача
  • Sandbox-архітектура на Android і iOS гарантує, що дані різних додатків не перетинаються і не можуть бути прочитані без root-доступу
  • Вибір способу зберігання залежить від типу даних: файли — через filesDir, налаштування — через DataStore, структуровані дані — через Room
  • iOS Sandbox включає політику резервного копіювання, яку необхідно контролювати через атрибут isExcludedFromBackup для некритичних даних
  • Відмінність від кеша в гарантії збереженості: Internal Storage не видаляється системою, на відміну від cacheDir, який може бути очищений при нестачі пам’яті
  • Рекомендований об’єм даних у внутрішній пам’яті — до 100 МБ. Великі файли слід розміщувати на зовнішньому сховищі або в хмарному сервісі
  • Користувацький контроль зайнятого простору і можливість очищення даних підвищують довіру та рейтинг додатка в магазинах

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також