“Ο κατάλογος προσωρινής αποθήκευσης εφαρμογής” είναι ένας προσωρινός χώρος αποθήκευσης δεδομένων που μπορούν να δημιουργηθούν ξανά κατά την επόμενη χρήση. Σύμφωνα με το Android Developers, 2026, το σύστημα μπορεί να διαγράψει αρχεία από αυτόν τον κατάλογο όταν υπάρχει έλλειψη μνήμης χωρίς προειδοποίηση, επομένως η εφαρμογή δεν πρέπει να βασίζεται στη διατήρηση της κρυφής μνήμης για κρίσιμα δεδομένα. Η σωστή χρήση του καταλόγου προσωρινής αποθήκευσης μειώνει τον όγκο του χρησιμοποιούμενου χώρου και επιταχύνει τη φόρτωση περιεχομένου.
Κύρια σημεία
context.cacheDir και context.externalCacheDir για αποθήκευση κρυφής μνήμης σε εσωτερική και εξωτερική μνήμηNSCachesDirectory, το οποίο εξαιρείται αυτόματα από το αντίγραφο ασφαλείας iCloudΟ κατάλογος προσωρινής αποθήκευσης είναι ένας ειδικός κατάλογος στην εσωτερική (ή εξωτερική) μνήμη της εφαρμογής που προορίζεται για προσωρινά αρχεία. Η κύρια διαφορά από το Internal Storage: το σύστημα έχει το δικαίωμα να διαγράφει αρχεία από την κρυφή μνήμη χωρίς ειδοποίηση, εάν η συσκευή δεν έχει αρκετό ελεύθερο χώρο. Επομένως, η εφαρμογή δεν πρέπει ποτέ να αποθηκεύει στην κρυφή μνήμη το μοναδικό αντίγραφο σημαντικών δεδομένων χρήστη. Η κρυφή μνήμη είναι βέλτιστη για ληφθείσες εικόνες, αποκρίσεις διακομιστή, προμεταγλωττισμένους πόρους και οποιαδήποτε άλλα δεδομένα που μπορούν να ανακτηθούν εξ αποστάσεως ή να αναδημιουργηθούν προγραμματιστικά.
Στο Android, ο κατάλογος κρυφής μνήμης βρίσκεται στη διαδρομή /data/data/<package>/cache/ και είναι προσβάσιμος μέσω context.cacheDir. Το μέγεθος της κρυφής μνήμης δεν είναι ρητά περιορισμένο, αλλά το Google Play συνιστά να μην υπερβαίνει τα 100 MB, καθώς οι εφαρμογές με μεγάλη κρυφή μνήμη λαμβάνουν αρνητικές αξιολογήσεις χρηστών. Στο iOS, ο κατάλογος κρυφής μνήμης βρίσκεται εντός του Sandbox-container στη διαδρομή Library/Caches/ και είναι προσβάσιμος μέσω NSCachesDirectory. Το iOS μπορεί να διαγράψει αρχεία από το Caches κατά την επαναφορά της συσκευής από αντίγραφο ασφαλείας ή σε κρίσιμη έλλειψη χώρου — αυτό πρέπει να αναφέρεται στους χρήστες στην τεκμηρίωση της εφαρμογής.
Η κατανόηση του ποια δεδομένα μπορούν να τοποθετηθούν με ασφάλεια στην κρυφή μνήμη και ποια πρέπει να αποθηκεύονται στο Internal Storage ή στο Documents είναι βασική δεξιότητα του προγραμματιστή. Η λανθασμένη χρήση της κρυφής μνήμης οδηγεί σε δύο αντίθετα προβλήματα: είτε η εφαρμογή καταλαμβάνει πολύ χώρο (αν ο προγραμματιστής αποθηκεύει στην κρυφή μνήμη ό,τι θα έπρεπε να είναι στο Documents), είτε ο χρήστης χάνει δεδομένα (αν ο προγραμματιστής αποθηκεύει στην κρυφή μνήμη ό,τι θα έπρεπε να διατηρείται μόνιμα). Ακολουθήστε έναν απλό κανόνα: εάν τα δεδομένα μπορούν να ανακτηθούν — κρυφή μνήμη, εάν η ανάκτηση είναι αδύνατη — Internal Storage ή Documents.
Διαφορετικοί τύποι δεδομένων έχουν διαφορετική ταχύτητα αναδημιουργίας και απαιτήσεις όγκου. Η κατανόηση αυτών των χαρακτηριστικών βοηθά τον προγραμματιστή να επιλέξει σωστά ποια αρχεία θα τοποθετήσει στην κρυφή μνήμη και ποια στη μόνιμη αποθήκευση.
Ο πιο συνηθισμένος τύπος δεδομένων κρυφής μνήμης — οι εικόνες που λήφθηκαν από το δίκτυο. Οι βιβλιοθήκες Glide, Picasso και Coil αποθηκεύουν αυτόματα τις ληφθείσες εικόνες στον κατάλογο κρυφής μνήμης της εφαρμογής. Το τυπικό μέγεθος κρυφής μνήμης εικόνων σε κοινωνικές εφαρμογές είναι από 50 έως 200 MB. Το μέγεθος κρυφής μνήμης εξαρτάται από την ανάλυση οθόνης της συσκευής και την ποσότητα του περιεχομένου που προβάλλεται. Το Glide χρησιμοποιεί κρυφή μνήμη δύο επιπέδων: πρώτα ελέγχει την κρυφή μνήμη L1 στη μνήμη RAM (αλγόριθμος 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), ημερολόγια αναίρεσης και σελίδες ευρετηρίου. Αυτά τα αρχεία αποθηκεύονται δίπλα στην κύρια βάση δεδομένων, αλλά για προσωρινές βάσεις δεδομένων (π.χ. πλήρους κειμένου αναζήτησης ή αναλυτικής) μπορεί να καθοριστεί τοποθέτηση στον κατάλογο κρυφής μνήμης. Οι προμεταγλωττισμένες προγράμματα shader OpenGL και Vulkan αποθηκεύονται επίσης σε αυτόν τον κατάλογο, επιταχύνοντας την αρχική φόρτωση γραφικών σκηνών. Στο iOS, το NSCachesDirectory συνιστάται για αποθήκευση προμεταγλωττισμένων δεδομένων Core Data και προσωρινών αρχείων επεξεργασίας εικόνας.
Ο καθαρισμός κρυφής μνήμης μπορεί να γίνει αυτόματα (από το σύστημα) ή χειροκίνητα (από τον χρήστη ή την εφαρμογή). Η κατανόηση της συμπεριφοράς του συστήματος σε διαφορετικά σενάρια είναι απαραίτητη για την αποφυγή απώλειας δεδομένων.
Στο Android, το σύστημα ξεκινά τη διαδικασία καθαρισμού κρυφής μνήμης όταν ο όγκος ελεύθερου χώρου στο διαμέρισμα /data πέσει κάτω από το κρίσιμο όριο (συνήθως 500 MB). Η διαδικασία cacheflush αναλύει το μέγεθος κρυφής μνήμης όλων των εγκατεστημένων εφαρμογών και διαγράφει τα λιγότερο χρησιμοποιούμενα αρχεία, ξεκινώντας από τα παλαιότερα. Ο χρήστης μπορεί επίσης να καθαρίσει χειροκίνητα την κρυφή μνήμη όλων των εφαρμογών μέσω των ρυθμίσεων συστήματος: “Ρυθμίσεις → Αποθήκευση → Κρυφή μνήμη → Εκκαθάριση κρυφής μνήμης”. Στο iOS, ο αυτόματος καθαρισμός Caches γίνεται κατά την επαναφορά της συσκευής από αντίγραφο ασφαλείας — το iOS δεν επαναφέρει το περιεχόμενο του Library/Caches/. Επιπλέον, το iOS μπορεί επιλεκτικά να διαγράφει αρχεία από το Caches όταν τελειώνει ο ελεύθερος χώρος στη συσκευή, χρησιμοποιώντας τον μηχανισμό purgeable storage για απομονωμένα δεδομένα.
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-container και διαγράφονται εγγυημένα κατά την απεγκατάσταση. Στο 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 σε περίπτωση έλλειψης χώρου ή επαναφοράς από αντίγραφο ασφαλείας. Το σύστημα χρησιμοποιεί τον μηχανισμό purgeable storage για αυτόματο καθαρισμό μη κρίσιμων δεδομένων.
Το cacheDir βρίσκεται στην εσωτερική μνήμη της συσκευής και διαγράφεται κατά την απεγκατάσταση της εφαρμογής. Το externalCacheDir βρίσκεται στην κάρτα SD και μπορεί να παραμείνει μετά τη διαγραφή — πρέπει να καθαρίζεται χειροκίνητα μέσω κώδικα κατά την πρώτη εκκίνηση μετά από επανεγκατάσταση.
Βιβλιοθήκες όπως Glide, Picasso και Coil χρησιμοποιούν κρυφή μνήμη δύο επιπέδων: L1 — μνήμη RAM (κρυφή μνήμη LRU για άμεση πρόσβαση), L2 — δίσκος (κατάλογος κρυφής μνήμης εφαρμογής). Η κρυφή μνήμη δίσκου έχει ρυθμιζόμενο όριο μεγέθους και πολιτική διαγραφής παλαιών αρχείων.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης