Interna memorija aplikacije je izdvojeni prostor na uređaju dostupan samo konkretnoj aplikaciji kroz izolovano skladištenje. Prema Android Developers, 2026, svaka aplikacija dobija sopstveni sandbox direktorijum kojem druge aplikacije nemaju direktan pristup. Takav pristup štiti podatke od neovlašćenog čitanja i obezbeđuje stabilan rad u višezadatkovom okruženju mobilnih uređaja.
Glavno
Context.getFilesDir(), getCacheDir() i getDataDir() za pristup internoj memorijiNSDocumentDirectory i NSCachesDirectory u Sandbox kontejneru aplikacijeInterna memorija aplikacije je izolovani direktorijum koji operativni sistem dodeljuje svakoj aplikaciji prilikom instalacije. Ovom direktorijumu nemaju pristup druge aplikacije ni korisnik putem standardnih menadžera fajlova. Sistem garantuje da će podaci unutar ovog direktorijuma biti potpuno obrisani prilikom deinstalacije aplikacije. Ovakav pristup čini osnovu sigurnosnog modela mobilnih operativnih sistema, sprečavajući curenje poverljivih informacija između programa.
Za razliku od eksternog skladišta (SD kartice), interna memorija je uvek dostupna i ne zahteva proveru prisustva medija. Brzina čitanja i pisanja u NAND fleš memoriju savremenih uređaja dostiže 800–900 MB/s sekvencijalnog čitanja i 200–300 MB/s sekvencijalnog pisanja, što je uporedivo sa SATA SSD. Veličina dodeljene oblasti zavisi od ukupnog kapaciteta uređaja i politike proizvođača: na uređajima sa 64 GB fleš memorije, aplikacija dobija od 16 do 64 MB početnog prostora sa mogućnošću proširenja po potrebi.
Arhitektura internog skladištenja se razlikuje na Androidu i iOS-u. Na Androidu svaka aplikacija dobija direktorijum /data/data/<package_name>/, unutar kojeg sistem kreira poddirektorijume files/, cache/ i databases/. Na iOS-u aplikacija radi u Sandbox kontejneru sa direktorijumima Documents/, Library/ i tmp/, od kojih svaki ima svoju namenu i politiku rezervnog kopiranja.
Razvojnim inženjerima je na raspolaganju nekoliko načina čuvanja podataka u internoj memoriji aplikacije. Svaki metod rešava svoj zadatak i odgovara određenom tipu podataka. Pravilan izbor metoda direktno utiče na performanse aplikacije, udobnost razvoja i sigurnost korisničkih podataka.
Najniži nivo metoda je direktno pisanje fajlova u files direktorijum. Aplikacija može kreirati bilo koje fajlove i direktorijume unutar svog peskovnika. Ovaj metod je pogodan za čuvanje medijskih fajlova, korisničkih dokumenata i bilo kakvih binarnih podataka koji ne zahtevaju strukturisanu organizaciju. Na Androidu se pristup direktorijumu ostvaruje pozivom Context.getFilesDir(), koji vraća apsolutnu putanju do direktorijuma fajlova aplikacije. Na iOS-u sličnu funkciju obavlja NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).
Za čuvanje parova ključ-vrednost Android nudi SharedPreferences i moderniji DataStore zasnovan na Kotlin korutinama i protobuf protokolu. SharedPreferences čuva podatke u XML fajlu unutar direktorijuma /data/data/<package>/shared_prefs/. Uprkos jednostavnosti korišćenja, SharedPreferences ima nedostatke: sinhrono pisanje može izazvati kašnjenja na UI niti, a odsustvo tipne sigurnosti povećava rizik od grešaka. DataStore rešava ove probleme pružajući asinhroni API zasnovan na Flow-u i potpunu podršku za tipove kroz protobuf šeme.
Za strukturisane podatke sa relacionim vezama optimalan izbor je SQLite ili omotač Room. Baza podataka se čuva u jedinstvenom fajlu unutar direktorijuma databases/ i podržava potpunu SQL sintaksu. Room je zvanična Jetpack biblioteka koja pruža tipno siguran API, automatsku migraciju šema i podršku za korutine. Veličina baze podataka može dostizati nekoliko gigabajta bez značajnog gubitka performansi uz pravilno indeksiranje. SQLite na mobilnim uređajima obrađuje do 50.000 operacija pisanja u sekundi na savremenim flagship procesorima.
Za čuvanje poverljivih podataka, poput autentifikacionih tokena i ključeva za šifrovanje, Android nudi EncryptedSharedPreferences. Ovaj omotač nad standardnim SharedPreferences automatski šifruje ključeve i vrednosti koristeći AES256-GCM-None. Šifrovanje se obavlja na nivou fajla pre pisanja na disk, tako da čak i uz fizički pristup uređaju napadač ne može pročitati sadržaj. EncryptedSharedPreferences je deo AndroidX Security biblioteke, koja takođe uključuje EncryptedFile za šifrovanje celih fajlova.
Android SDK pruža skup metoda za rad sa internom memorijom kroz klasu Context. Svaki metod vraća putanju do određenog sistemskog direktorijuma unutar sandbox-a aplikacije. Razmotrimo osnovne operacije pisanja i čitanja fajlova na primeru Kotlina.
Glavni metod za dobijanje putanje do internog direktorijuma fajlova je context.filesDir. On vraća File objekat koji pokazuje na direktorijum /data/data/<package>/files/. Prilikom prvog poziva sistem automatski kreira sve potrebne roditeljske direktorijume. Veličina fajlova u internoj memoriji nije eksplicitno ograničena, ali ukupna količina podataka ne sme premašiti raspoloživi prostor na particiji /data, koja obično čini 60–80% od ukupnog kapaciteta fleš memorije uređaja.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Sadržaj beleške")
val content = file.readText()
println("Pročitano: $content")
Metodi writeText i readText su extension funkcije standardne Kotlin biblioteke. Oni automatski upravljaju otvaranjem i zatvaranjem tokova, što isključuje curenje memorije. Za rad sa binarnim podacima koristite writeBytes i readBytes, koji ne zahtevaju kodiranje i rade sa ByteArray nizovima. Pri radu sa velikim fajlovima preporučuje se korišćenje baferovanih tokova: BufferedReader i BufferedWriter za tekst, BufferedInputStream i BufferedOutputStream za binarne podatke.
Za organizaciju fajlova u hijerarhiju kreirajte poddirektorijume unutar filesDir-a. Ovo pomaže u strukturiranju podataka po tipovima: slike, dokumenti, izvozni fajlovi. Metod mkdirs() kreira sve nedostajuće direktorijume u putanji, uključujući ugnježdene. Uverite se da je operacija kreiranja uspela — metod vraća true samo pri kreiranju novih direktorijuma. Greška kreiranja je najčešće povezana sa nedostatkom prostora na particiji /data ili iscrpljivanjem inoda sistema fajlova.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Direktorijum kreiran")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Za proveru raspoloživog prostora pre pisanja velikih fajlova koristite File.getFreeSpace() ili File.getUsableSpace(). Drugi metod vraća broj bajtova dostupnih trenutnoj aplikaciji uzimajući u obzir sigurnosne kvote — precizniji je u kontekstu višekorisničkih uređaja. Ako je raspoloživi prostor manji od očekivane veličine fajla, prikažite korisniku poruku i predložite oslobađanje prostora u podešavanjima uređaja.
Na iOS-u svaka aplikacija radi u izolovanom Sandbox kontejneru. Sistem ne pruža API za izlazak izvan njegovih granica bez posebnih dozvola. Osnovni alat za rad sa sistemom fajlova je klasa FileManager iz Foundation framework-a. Sandbox kontejner uključuje nekoliko standardnih direktorijuma, od kojih svaki ima sopstvenu politiku rezervnog kopiranja.
Documents direktorijum je namenjen korisničkim podacima koji treba da se sačuvaju između pokretanja aplikacije i obnove iz rezervne kopije. iOS automatski uključuje ovaj direktorijum u rezervno kopiranje na iCloud i iTunes. Metod urls(for:in:) vraća niz URL adresa traženog direktorijuma — prvi element niza je glavni.
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 podržava potpuni skup operacija nad fajlovima: kreiranje, kopiranje, premeštanje, brisanje i preimenovanje. Svaka operacija može izazvati grešku, stoga sve pozive treba obmotati u konstrukciju do-catch. Posebnu pažnju posvetite brisanju fajlova — operacija je nepovratna i obnavljanje podataka nakon removeItem(at:) je nemoguće bez prethodne rezervne kopije.
Nisu svi podaci u Sandbox kontejneru potrebni u iCloud rezervnoj kopiji. Na primer, keš preuzetih slika ili privremeni fajlovi obrade ne zahtevaju obnavljanje — oni će biti ponovo kreirani pri sledećem korišćenju. Za isključivanje direktorijuma ili fajla iz rezervnog kopiranja postavite atribut isExcludedFromBackup na true. Apple preporučuje da uvek isključite iz rezerve podatke koji se mogu obnoviti na daljinu, kako biste minimizirali obim iCloud skladišta i skratili vreme obnove.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Svaki tip skladišta na mobilnom uređaju ima svoju namenu i pravila korišćenja. Razumevanje ovih razlika pomaže razvojnom inženjeru da izabere pravo mesto za svaki tip podataka. Ispod je prikazano poređenje tri glavna tipa skladišta dostupnih aplikaciji.
| Karakteristika | Internal Storage | Cache Directory | External Storage |
|---|---|---|---|
| Vidljivost za druge aplikacije | Skrivena | Skrivena | Dostupna |
| Brisanje pri deinstalaciji aplikacije | Potpuno | Potpuno | Zavisi od lokacije |
| Rezervno kopiranje | Na Androidu — ne, na iOS-u — da (Documents) | Ne | Samo pri sinhronizaciji |
| Dostupnost bez medija | Uvek | Uvek | Zahteva SD karticu |
| Rizik od gubitka podataka | Minimalan | Visok | Srednji |
| Preporučena veličina fajlova | Do 100 MB | Do 50 MB | Bilo koja |
Interna memorija je optimalna za čuvanje konfiguracija aplikacije, fajlova baze podataka i korisničkih dokumenata koji ne treba da budu dostupni drugim programima. Keš direktorijum je namenjen privremenim fajlovima koji se mogu ponovo kreirati pri sledećem korišćenju: preuzete slike, API odgovori, međuobradni podaci. Eksterno skladište je najpogodnije za velike medijske fajlove (fotografije, video, muzika) i podatke koje korisnik želi da deli sa drugim aplikacijama putem zajedničkog pristupa.
Izbor tipa skladišta takođe utiče na rangiranje aplikacije u Google Play i App Store. Aplikacije koje čuvaju velike količine podataka u internoj memoriji bez čišćenja dobijaju negativne recenzije: korisnici se žale na nedostatak prostora. Prema istraživanju App Annie, 62% korisnika briše aplikaciju ako ona zauzima više od 500 MB interne memorije uređaja bez opcije za čišćenje.
Pravilno upravljanje internom memorijom aplikacije poboljšava performanse, sigurnost i korisničko iskustvo. Sledeće preporuke su zasnovane na zvaničnoj dokumentaciji Androida i iOS-a, kao i na praktičnom iskustvu razvoja aplikacija sa milionima instalacija.
Posebnu pažnju posvetite testiranju graničnih slučajeva. Proveravajte ponašanje aplikacije prilikom prekoračenja interne memorije, iznenadnog prekida pisanja (pad aplikacije, poziv) i prilikom obnove iz iOS rezervne kopije. U svakom od ovih scenarija podaci moraju ostati konzistentni ili se obnoviti do poslednjeg stabilnog stanja. Koristite transakcione fajlove: upisujte podatke u privremeni fajl, a zatim ga atomski preimenujte u ciljni fajl. Ovo sprečava čitanje oštećenih podataka prilikom otkaza pisanja.
Ne zaboravite na korisničku kontrolu. Obezbedite u podešavanjima aplikacije opciju za čišćenje privremenih podataka i prikaz zauzetog prostora interne memorije. Prema Google Play konzoli, aplikacije sa takvom funkcijom dobijaju 18% više pozitivnih recenzija u kategoriji „Performanse”.
Često postavljana pitanja
Svi podaci iz interne memorije aplikacije se potpuno brišu. Operativni sistem garantuje odsustvo preostalih fajlova, uključujući baze podataka, podešavanja i privremene fajlove. Podaci na eksternom skladištu mogu ostati sačuvani.
Bez root pristupa uređaju, druge aplikacije ne mogu čitati fajlove iz Internal Storage-a druge aplikacije. Na Androidu su za to potrebne superkorisničke privilegije, a na iOS-u izolacija se obezbeđuje na nivou jezgra kroz Sandbox.
Eksplicitnog ograničenja nema, ali ukupna količina je ograničena slobodnim prostorom na /data particiji. Preporučuje se ne prelaziti 100 MB po aplikaciji — veće količine je bolje smestiti na eksterno skladište ili u oblak.
filesDir je namenjen trajnim podacima aplikacije i sistem ga ne briše bez potrebe. cacheDir je za privremene fajlove koje sistem može obrisati pri nedostatku memorije. Sistem ne garantuje očuvanje cacheDir-a.
Direktno kopiranje iz Internal Storage-a na SD karticu je zabranjeno sigurnosnom politikom. Koristite MediaStore API na Android 10+ ili SAF (Storage Access Framework) za kreiranje kopija podataka u zajedničkom pristupu uz saglasnost korisnika.
Zaključak
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође