Кеш директорията на приложението е временно хранилище за данни, които могат да бъдат повторно създадени при следващото използване. Според Android Developers, 2026, системата може да изтрие файлове от тази директория без предупреждение при недостиг на памет, затова приложението не трябва да разчита на запазеността на кеша за критично важни данни. Правилното използване на кеш директорията намалява обема на заетото пространство и ускорява зареждането на съдържание.
Основни моменти
context.cacheDir и context.externalCacheDir за съхранение на кеш на вътрешната и външната паметNSCachesDirectory, който автоматично се изключва от iCloud резервното копиранеКеш директорията е специална директория във вътрешната (или външната) памет на приложението, предназначена за временни файлове. Основната разлика от Internal Storage: системата има право да изтрива файлове от кеша без предупреждение, ако устройството няма достатъчно свободно място. Затова приложението никога не трябва да съхранява единственото копие на важни потребителски данни в кеша. Кешът е оптимален за изтеглени изображения, отговори от сървър, прекомпилирани ресурси и всякакви други данни, които могат да бъдат възстановени отдалечено или пресъздадени програмно.
На Android кеш директорията се намира на път /data/data/<package>/cache/ и е достъпна чрез context.cacheDir. Размерът на кеша не е изрично ограничен, но Google Play препоръчва да не надвишава 100 MB, тъй като приложенията с голям кеш получават негативни отзиви от потребителите. На iOS кеш директорията се намира вътре в Sandbox контейнера на път Library/Caches/ и е достъпна чрез NSCachesDirectory. iOS може да изтрие файлове от Caches при възстановяване на устройството от резервно копие или при критичен недостиг на място — за това трябва да се предупредят потребителите в документацията на приложението.
Разбирането кои данни могат безопасно да се поставят в кеш и кои трябва да се съхраняват в Internal Storage или Documents е ключово умение за разработчика. Неправилното използване на кеша води до два противоположни проблема: или приложението заема твърде много място (ако разработчикът съхранява в кеша данни, които трябва да са в Documents), или потребителят губи данни (ако разработчикът съхранява в кеша данни, които трябва да се запазват постоянно). Придържайте се към простото правило: ако данните могат да бъдат възстановени — кеш, ако възстановяването не е възможно — Internal Storage или Documents.
Различните типове данни имат различна скорост на възстановяване и изисквания към обема. Разбирането на тези характеристики помага на разработчика правилно да избира кои файлове да поставя в кеш и кои в постоянно хранилище.
Най-често срещаният тип кеширани данни са изображенията, заредени от мрежата. Библиотеките Glide, Picasso и Coil автоматично запазват изтеглените изображения в кеш директорията на приложението. Типичният обем на кеша от изображения в социалните приложения е между 50 и 200 MB. Размерът на кеша зависи от разделителната способност на екрана на устройството и количеството преглеждано съдържание. Glide използва двустепенно кеширане: първо проверява L1 кеш в оперативната памет (LRU алгоритъм), след това L2 кеш на диска. Това осигурява бързо зареждане на повторно преглеждани изображения без допълнителни мрежови заявки. Настройването на максималния размер на дисков кеш чрез DiskCacheStrategy позволява контролиране на заетото пространство: при надвишаване на лимита библиотеката автоматично изтрива най-рядко използваните файлове.
val cacheDir = File(context.cacheDir, "image_cache")
val maxSize = 50 * 1024 * 1024 // 50 MB
val cache = DiskLruCache.open(cacheDir, 1, 1, maxSize)
cache.edit("key")?.let { editor ->
editor.newOutputStream(0).use { stream ->
// запис на данни в кеша
}
}
Отговорите на API заявки могат да се кешират за офлайн достъп и намаляване на натоварването на сървъра. OkHttp предоставя вградена поддръжка за кеширане чрез класа Cache. Cache-Control и ETag заглавките на отговора управляват политиката за кеширане: сървърът указва колко време отговорът се счита за актуален. При правилна настройка кешът на мрежови заявки може да намали времето за зареждане на данни с 60–80% при повторни посещения и да осигури основна функционалност на приложението без интернет връзка. Размерът на кеша за мрежови заявки рядко надвишава 10–20 MB, но при активна употреба на приложението може да достигне 50 MB. Настройвайте максималния размер на кеша чрез конструктора OkHttpClient.Builder и проверявайте актуалността на кешираните данни при всяко стартиране на приложението.
SQLite базите данни могат да генерират временни файлове по време на работа: WAL файлове (Write-Ahead Log), журнали за отмяна и индексни страници. Тези файлове се съхраняват до основната база данни, но за временни бази данни (например за пълнотекстово търсене или анализи) може да се посочи разположение в кеш директорията. Прекомпилираните шейдър програми за OpenGL и Vulkan също се кешират в тази директория, което ускорява първото зареждане на графични сцени. На iOS NSCachesDirectory се препоръчва за съхранение на прекомпилирани Core Data данни и временни файлове за обработка на изображения.
Изчистването на кеша може да става автоматично (от системата) или ръчно (от потребителя или приложението). Разбирането на поведението на системата в различни сценарии е необходимо за предотвратяване на загуба на данни.
На Android системата стартира процес на изчистване на кеша, когато свободното място на дяла /data падне под критичен праг (обикновено 500 MB). Процесът cacheflush анализира размера на кеша на всички инсталирани приложения и изтрива най-рядко използваните файлове, започвайки от най-старите. Потребителят може също ръчно да изчисти кеша на всички приложения чрез системните настройки: „Настройки → Съхранение → Кеш → Изчистване на кеша“. На iOS автоматично изчистване на Caches се случва при възстановяване на устройството от резервно копие — iOS не възстановява съдържанието на Library/Caches/. Освен това iOS може селективно да изтрива файлове от Caches, когато свободното място на устройството се изчерпва, използвайки механизъм за почистваемо хранилище за изолирани данни.
let fm = FileManager.default
let cachesURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
let contents = try fm.contentsOfDirectory(
at: cachesURL,
includingPropertiesForKeys: nil
)
for fileURL in contents {
try fm.removeItem(at: fileURL)
}
Разработчикът може да реализира програмно изчистване на кеша по заявка на потребителя или по разписание. На Android за изчистване на собствения кеш е достатъчно да се изтрият всички файлове в context.cacheDir и context.externalCacheDir. На iOS може да се изчисти съдържанието на Library/Caches/, но не изтривайте самата директория — само нейното съдържание. Препоръчва се да показвате на потребителя текущия размер на кеша в настройките на приложението и бутон „Изчистване на кеша“ с потвърждение. Според Google Play Console, приложенията с бутон за изчистване на кеша получават 22% по-малко оплаквания за липса на място в сравнение с приложения без такава функция. Изчистването на кеша трябва да бъде безопасно: приложението трябва правилно да обработва ситуацията, когато кешираните файлове са изтрити, и прозрачно да ги презарежда при следващото обръщение.
Въпреки еднаквото предназначение, реализацията на кеш директориите на Android и iOS има съществени разлики. Разработчикът трябва да ги вземе предвид за коректната работа на приложението на двете платформи.
| Характеристика | Android | iOS |
|---|---|---|
| Път по подразбиране | /data/data/<package>/cache/ | Library/Caches/ |
| API за достъп | context.cacheDir | NSCachesDirectory |
| Външен кеш | context.externalCacheDir | Липсва |
| Резервно копиране | Не се архивира | Не се архивира |
| Системно изчистване | При недостиг на място | При възстановяване от резервно копие и недостиг на място |
| Видимост за потребителя | В настройките на приложението | Само при свързване към компютър |
Android предоставя отделна директория за външен кеш чрез context.externalCacheDir — тя се намира на SD картата (ако е инсталирана) и не се изтрива при деинсталиране на приложението. Това е удобно за големи медийни файлове, но създава риск от оставяне на боклук на картата с памет. iOS няма концепция за външен кеш: всички временни файлове се съхраняват вътре в Sandbox контейнера и гарантирано се изтриват при деинсталация. На Android кешът е видим за потребителя в настройките на приложението и той може да го изчисти ръчно. На iOS системните настройки не показват размера на кеша на отделните приложения — потребителят може да изчисти кеша само чрез изтриване и повторно инсталиране на приложението, ако разработчикът не е добавил бутон за изчистване в интерфейса.
Важна разлика е поведението при възстановяване. На iOS при възстановяване от iTunes или iCloud резервно копие директорията Caches не се възстановява, тъй като iOS счита, че кешираните данни ще бъдат пресъздадени при първото стартиране. На Android при възстановяване от Google Drive се архивира само Internal Storage — кешът остава празен след възстановяване. И в двата случая приложението трябва да работи коректно с празен кеш, без да показва грешки на потребителя и без да губи функционалност.
Доброто управление на кеша на приложението е един от факторите, влияещи върху потребителското изживяване и рейтинга на приложението. Следващите препоръки ще помогнат да избегнете типични проблеми и да повишите удовлетвореността на потребителите.
context.externalCacheDir може да върне null, ако SD картата не е инсталирана или недостъпна. Винаги предвиждайте резервен вариант с вътрешен кешРедовно мониторирайте размера на кеша в анализите на приложението. Интегрирайте изпращане на метрика за размера на кеша към Firebase Analytics или подобна система. Ако средният размер на кеша надвишава 100 MB, оптимизирайте стратегията за кеширане: намалете TTL за рядко използвани данни, въведете компресия на изображения преди кеширане (WebP вместо PNG, намалете качеството на JPEG до 85%), използвайте пагинация за зареждане на съдържание от сървъра. Помнете, че потребителите с устройства от 16–32 GB са особено чувствителни към размера на приложението: при достигане на 200 MB кеш много потребители започват да търсят начин за изчистване или просто изтриват приложението. Според проучване на Google, 38% от потребителите са изтрили поне едно приложение поради неконтролиран растеж на кеша и заето място.
Често задавани въпроси
Не, изчистването на кеша премахва само временни файлове (запазени изображения, отговори от сървър). Потребителските данни (пароли, настройки, бази данни) се съхраняват в Internal Storage и не се засягат при изчистване на кеша.
Google Play препоръчва да не надвишава 100 MB. За приложения с интензивно медийно съдържание (социални мрежи, месинджъри) е допустимо до 200 MB при условие че се реализира автоматично изчистване и настройка на лимит чрез дискретен кеш.
Да, iOS може да изтрива файлове от Library/Caches при недостиг на място или възстановяване от резервно копие. Системата използва механизъм за почистваемо хранилище за автоматично изчистване на некритични данни.
cacheDir се намира във вътрешната памет на устройството и се изтрива при деинсталиране на приложението. externalCacheDir се намира на SD картата и може да остане след деинсталиране — трябва да се изчисти ръчно чрез код при първото стартиране след преинсталиране.
Библиотеки като Glide, Picasso и Coil използват двустепенно кеширане: L1 — оперативна памет (LRU кеш за моментален достъп), L2 — диск (кеш директория на приложението). Дисковият кеш има конфигурируем лимит на размера и политика за изтриване на стари файлове.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също