Memoria internă a aplicației este un spațiu dedicat pe dispozitiv, accesibil doar aplicației respective prin stocare izolată. Potrivit Android Developers, 2026, fiecare aplicație primește propriul director sandbox, la care alte aplicații nu au acces direct. Această abordare protejează datele împotriva citirii neautorizate și asigură o funcționare stabilă în mediul multitasking al dispozitivelor mobile.
Principalele puncte
Context.getFilesDir(), getCacheDir() și getDataDir() pentru accesul la memoria internăNSDocumentDirectory și NSCachesDirectory în containerul Sandbox al aplicațieiMemoria internă a aplicației este un director izolat pe care sistemul de operare îl alocă fiecărei aplicații la instalare. Alte aplicații și utilizatorul prin intermediul managerilor de fișiere standard nu au acces la acest director. Sistemul garantează că datele din acest director vor fi complet șterse la dezinstalarea aplicației. Această abordare constituie baza modelului de securitate al sistemelor de operare mobile, prevenind scurgerea informațiilor confidențiale între programe.
Spre deosebire de stocarea externă (cardul SD), memoria internă este întotdeauna disponibilă și nu necesită verificarea prezenței suportului. Viteza de citire și scriere în memoria NAND flash a dispozitivelor moderne atinge 800–900 MB/s pentru citire secvențială și 200–300 MB/s pentru scriere secvențială, comparabil cu SATA SSD. Dimensiunea spațiului alocat depinde de volumul total al dispozitivului și de politica producătorului: pe dispozitivele cu 64 GB memorie flash, aplicația primește între 16 și 64 MB spațiu inițial, cu posibilitatea de extindere după necesitate.
Arhitectura stocării interne diferă pe Android și iOS. Pe Android, fiecare aplicație primește un director /data/data/<package_name>/, în care sistemul creează subdirectoarele files/, cache/ și databases/. Pe iOS, aplicația funcționează într-un container Sandbox cu directoarele Documents/, Library/ și tmp/, fiecare având propria destinație și politică de backup.
Dezvoltatorii au la dispoziție mai multe metode de salvare a datelor în memoria internă a aplicației. Fiecare metodă își rezolvă propria sarcină și este potrivită pentru un anumit tip de date. Alegerea metodei corecte influențează direct performanța aplicației, confortul dezvoltării și securitatea datelor utilizatorului.
Cea mai de bază metodă este scrierea directă a fișierelor în directorul files. Aplicația poate crea orice fișiere și directoare în interiorul sandbox-ului său. Această metodă este potrivită pentru stocarea fișierelor media, documentelor utilizatorului și a oricăror date binare care nu necesită o organizare structurată. Pe Android, accesul la director se realizează prin apelul Context.getFilesDir(), care returnează calea absolută către directorul de fișiere al aplicației. Pe iOS, o funcție similară este îndeplinită de NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).
Pentru stocarea perechilor cheie-valoare, Android oferă SharedPreferences și DataStore, mai modern, bazat pe corutinele Kotlin și protocolul protobuf. SharedPreferences stochează datele într-un fișier XML în interiorul directorului /data/data/<package>/shared_prefs/. În ciuda simplității de utilizare, SharedPreferences are dezavantaje: scrierea sincronă poate cauza întârzieri pe firul UI, iar lipsa siguranței tipurilor crește riscul de erori. DataStore rezolvă aceste probleme oferind o API asincronă bazată pe Flow și suport complet pentru tipuri prin scheme protobuf.
Pentru date structurate cu relații relaționale, alegerea optimă este SQLite sau învelișul Room. Baza de date este stocată într-un singur fișier în directorul databases/ și suportă sintaxa SQL completă. Room este o bibliotecă oficială Jetpack care oferă o API sigură din punct de vedere al tipurilor, migrare automată a schemei și suport pentru corutine. Dimensiunea bazei de date poate atinge câțiva gigaocteți fără o pierdere semnificativă de performanță cu indexarea corectă. SQLite pe dispozitivele mobile procesează până la 50.000 de operații de scriere pe secundă pe procesoarele flagship moderne.
Pentru stocarea datelor confidențiale, cum ar fi tokenurile de autentificare și cheile de criptare, Android oferă EncryptedSharedPreferences. Acest înveliș peste SharedPreferences standard criptează automat cheile și valorile utilizând AES256-GCM-None. Criptarea se efectuează la nivel de fișier înainte de scrierea pe disc, astfel încât, chiar și cu acces fizic la dispozitiv, atacatorul nu poate citi conținutul. EncryptedSharedPreferences face parte din biblioteca AndroidX Security, care include și EncryptedFile pentru criptarea fișierelor întregi.
Android SDK oferă un set de metode pentru lucrul cu memoria internă prin clasa Context. Fiecare metodă returnează calea către un anumit director de sistem în interiorul sandbox-ului aplicației. Să examinăm operațiile de bază de scriere și citire a fișierelor pe exemplul Kotlin.
Metoda principală pentru obținerea căii către directorul de fișiere intern este context.filesDir. Aceasta returnează un obiect File care indică directorul /data/data/<package>/files/. La prima apelare, sistemul creează automat toate directoarele părinte necesare. Dimensiunea fișierelor în memoria internă nu este limitată explicit, dar volumul total de date nu trebuie să depășească spațiul disponibil al partiției /data, care constituie de obicei 60–80% din volumul total al memoriei flash a dispozitivului.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Conținutul notiței")
val content = file.readText()
println("Citit: $content")
Metodele writeText și readText sunt funcții de extensie ale bibliotecii standard Kotlin. Ele gestionează automat deschiderea și închiderea fluxurilor, ceea ce previne scurgerile de memorie. Pentru lucrul cu date binare, utilizați writeBytes și readBytes, care nu necesită codificare și lucrează cu tablouri ByteArray. La lucrul cu fișiere mari, se recomandă utilizarea fluxurilor tamponate: BufferedReader și BufferedWriter pentru text, BufferedInputStream și BufferedOutputStream pentru date binare.
Pentru organizarea fișierelor într-o ierarhie, creați subdirectoare în interiorul filesDir. Acest lucru ajută la structurarea datelor pe tipuri: imagini, documente, fișiere de export. Metoda mkdirs() creează toate directoarele lipsă din cale, inclusiv pe cele imbricate. Asigurați-vă că operația de creare a reușit — metoda returnează true doar la crearea de noi directoare. Eroarea de creare este cel mai adesea legată de lipsa spațiului pe partiția /data sau de epuizarea inodurilor sistemului de fișiere.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Director creat")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Pentru verificarea spațiului disponibil înainte de scrierea fișierelor mari, utilizați File.getFreeSpace() sau File.getUsableSpace(). A doua metodă returnează numărul de octeți disponibili aplicației curente, ținând cont de cotele de securitate — este mai precisă în contextul dispozitivelor multi-utilizator. Dacă spațiul disponibil este mai mic decât dimensiunea estimată a fișierului, afișați utilizatorului un mesaj și sugerați eliberarea spațiului în setările dispozitivului.
Pe iOS, fiecare aplicație funcționează într-un container Sandbox izolat. Sistemul nu oferă o API pentru a ieși în afara limitelor sale fără entitlements speciale. Instrumentul principal pentru lucrul cu sistemul de fișiere este clasa FileManager din framework-ul Foundation. Containerul Sandbox include mai multe directoare standard, fiecare având propria politică de backup.
Directorul Documents este destinat datelor utilizatorului care trebuie păstrate între lansările aplicației și restaurate din backup. iOS include automat acest director în backup-ul pe iCloud și iTunes. Metoda urls(for:in:) returnează un tablou de adrese URL ale directorului solicitat — primul element al tabloului este cel principal.
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 suportă un set complet de operații cu fișiere: creare, copiere, mutare, ștergere și redenumire. Fiecare operație poate genera o eroare, de aceea toate apelurile trebuie încapsulate în construcția do-catch. Acordați o atenție deosebită ștergerii fișierelor — operația este ireversibilă, iar restaurarea datelor după removeItem(at:) este imposibilă fără o copie de backup prealabilă.
Nu toate datele din containerul Sandbox trebuie să ajungă în backup-ul iCloud. De exemplu, cache-ul imaginilor descărcate sau fișierele temporare de procesare nu necesită restaurare — ele vor fi recreate la următoarea utilizare. Pentru a exclude un director sau fișier de la backup, setați atributul isExcludedFromBackup la valoarea true. Apple recomandă să excludeți întotdeauna din backup datele care pot fi restaurate de la distanță, pentru a minimiza volumul de stocare iCloud și a reduce timpul de restaurare.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Fiecare tip de stocare pe un dispozitiv mobil are destinația și regulile de utilizare proprii. Înțelegerea acestor diferențe îl ajută pe dezvoltator să aleagă locul potrivit pentru fiecare tip de date. Mai jos este prezentată o comparație a celor trei tipuri principale de stocare disponibile aplicației.
| Caracteristică | Internal Storage | Cache Directory | External Storage |
|---|---|---|---|
| Vizibilitate pentru alte aplicații | Ascunsă | Ascunsă | Accesibilă |
| Ștergerea la dezinstalarea aplicației | Completă | Completă | Depinde de locație |
| Backup | Pe Android — nu, pe iOS — da (Documents) | Nu | Doar la sincronizare |
| Disponibilitate fără suport | Întotdeauna | Întotdeauna | Necesită card SD |
| Risc de pierdere a datelor | Minim | Ridicat | Mediu |
| Dimensiunea recomandată a fișierelor | Până la 100 MB | Până la 50 MB | Oricare |
Memoria internă este optimă pentru stocarea configurațiilor aplicației, fișierelor bazei de date și documentelor utilizatorului care nu trebuie să fie accesibile altor programe. Directorul cache este destinat fișierelor temporare care pot fi recreate la următoarea utilizare: imagini descărcate, răspunsuri API, date intermediare de procesare. Stocarea externă este cea mai potrivită pentru fișiere media mari (fotografii, videoclipuri, muzică) și date pe care utilizatorul dorește să le partajeze cu alte aplicații prin acces partajat.
Alegerea tipului de stocare influențează și clasamentul aplicației în Google Play și App Store. Aplicațiile care salvează volume mari de date în memoria internă fără curățare primesc recenzii negative: utilizatorii se plâng de lipsa spațiului. Conform studiului App Annie, 62% dintre utilizatori șterg aplicația dacă aceasta ocupă mai mult de 500 MB din memoria internă a dispozitivului fără opțiunea de curățare.
Gestionarea corectă a memoriei interne a aplicației îmbunătățește performanța, securitatea și experiența utilizatorului. Următoarele recomandări se bazează pe documentația oficială Android și iOS, precum și pe experiența practică de dezvoltare a aplicațiilor cu milioane de instalări.
O atenție deosebită trebuie acordată testării cazurilor limită. Verificați comportamentul aplicației la umplerea memoriei interne, la întreruperea bruscă a scrierii (prăbușirea aplicației, apel) și la restaurarea din backup-ul iOS. În fiecare dintre aceste scenarii, datele trebuie să rămână consistente sau să fie restaurate la ultima stare stabilă. Utilizați fișiere tranzacționale: scrieți datele într-un fișier temporar, apoi redenumiți-l atomic în fișierul țintă. Acest lucru previne citirea datelor corupte în cazul unei defecțiuni la scriere.
Nu uitați de controlul utilizatorului. Oferiți în setările aplicației opțiunea de curățare a datelor temporare și afișarea volumului ocupat al memoriei interne. Potrivit Google Play Console, aplicațiile cu o astfel de funcție primesc cu 18% mai multe recenzii pozitive la categoria „Performanță”.
Întrebări frecvente
Toate datele din memoria internă a aplicației sunt șterse complet. Sistemul de operare garantează absența fișierelor reziduale, inclusiv baze de date, setări și fișiere temporare. Datele de pe stocarea externă se pot păstra.
Fără acces root la dispozitiv, alte aplicații nu pot citi fișierele din Internal Storage ale altei aplicații. Pe Android, pentru aceasta sunt necesare privilegii de superutilizator, iar pe iOS, izolarea este asigurată la nivelul kernel-ului prin Sandbox.
Nu există o limită explicită, dar volumul total este limitat de spațiul liber pe partiția /data. Se recomandă să nu depășiți 100 MB per aplicație — volumele mai mari este mai bine să fie plasate pe stocarea externă sau în cloud.
filesDir este destinat datelor permanente ale aplicației și nu este șters de sistem fără necesitate. cacheDir este pentru fișiere temporare pe care sistemul le poate șterge la lipsă de memorie. Sistemul nu garantează integritatea cacheDir.
Copierea directă din Internal Storage pe cardul SD este interzisă de politica de securitate. Utilizați MediaStore API pe Android 10+ sau SAF (Storage Access Framework) pentru a crea copii ale datelor în acces partajat cu consimțământul utilizatorului.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și