Interní paměť aplikace je vyhrazený prostor na zařízení, přístupný pouze konkrétní aplikaci prostřednictvím izolovaného úložiště. Podle Android Developers, 2026 každá aplikace získá vlastní sandboxový adresář, k němuž ostatní aplikace nemají přímý přístup. Tento přístup chrání data před neoprávněným čtením a zajišťuje stabilní provoz v multitaskingovém prostředí mobilních zařízení.
Hlavní body
Context.getFilesDir(), getCacheDir() a getDataDir() pro přístup k interní pamětiNSDocumentDirectory a NSCachesDirectory v sandboxovém kontejneru aplikaceInterní paměť aplikace je izolovaný adresář, který operační systém přidělí každé aplikaci při její instalaci. K tomuto adresáři nemají přístup jiné aplikace ani uživatel prostřednictvím běžných správců souborů. Systém zaručuje, že data v tomto adresáři budou při odinstalaci aplikace zcela smazána. Tento přístup tvoří základ bezpečnostního modelu mobilních operačních systémů a zabraňuje úniku důvěrných informací mezi programy.
Na rozdíl od externího úložiště (SD karty) je interní paměť vždy k dispozici a nevyžaduje kontrolu přítomnosti média. Rychlost čtení a zápisu do paměti NAND flash moderních zařízení dosahuje 800–900 MB/s sekvenčního čtení a 200–300 MB/s sekvenčního zápisu, což je srovnatelné s SATA SSD. Velikost přidělené oblasti závisí na celkové kapacitě zařízení a politice výrobce: u zařízení s 64 GB flash paměti aplikace získá 16–64 MB počátečního prostoru s možností rozšíření podle potřeby.
Architektura interního úložiště se liší na Androidu a iOS. Na Androidu každá aplikace získá adresář /data/data/<package_name>/, uvnitř kterého systém vytvoří podadresáře files/, cache/ a databases/. Na iOS aplikace pracuje v sandboxovém kontejneru s adresáři Documents/, Library/ a tmp/, z nichž každý má svůj vlastní účel a politiku zálohování.
Vývojáři mají k dispozici několik způsobů ukládání dat do interní paměti aplikace. Každá metoda řeší svůj úkol a je vhodná pro určitý typ dat. Výběr správného způsobu přímo ovlivňuje výkon aplikace, pohodlí vývoje a bezpečnost uživatelských dat.
Nejnižší úrovní je přímý zápis souborů do adresáře files. Aplikace může vytvářet libovolné soubory a adresáře ve svém sandboxu. Tato metoda je vhodná pro ukládání multimediálních souborů, uživatelských dokumentů a jakýchkoli binárních dat, která nevyžadují strukturovanou organizaci. Na Androidu se k adresáři přistupuje voláním Context.getFilesDir(), které vrací absolutní cestu k adresáři souborů aplikace. Na iOS plní podobnou funkci NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).
Pro ukládání párů klíč-hodnota Android nabízí SharedPreferences a modernější DataStore založený na Kotlin korutinách a protokolu protobuf. SharedPreferences ukládá data do XML souboru v adresáři /data/data/<package>/shared_prefs/. Přes jednoduchost použití má SharedPreferences nevýhody: synchronní zápis může způsobovat zpoždění na UI vlákně a absence typové bezpečnosti zvyšuje riziko chyb. DataStore tyto problémy řeší poskytováním asynchronního API založeného na Flow a plnou podporou typů prostřednictvím protobuf schémat.
Pro strukturovaná data s relačními vazbami je optimální volbou SQLite nebo obálka Room. Databáze je uložena v jediném souboru v adresáři databases/ a podporuje plnou syntaxi SQL. Room je oficiální knihovna Jetpack, která poskytuje typově bezpečné API, automatickou migraci schémat a podporu korutin. Velikost databáze může dosáhnout několika gigabajtů bez výrazné ztráty výkonu při správném indexování. SQLite na mobilních zařízeních zpracuje až 50 000 zápisových operací za sekundu na moderním špičkovém procesoru.
Pro ukládání důvěrných dat, jako jsou autentizační tokeny a šifrovací klíče, Android poskytuje EncryptedSharedPreferences. Tato obálka nad standardními SharedPreferences automaticky šifruje klíče i hodnoty pomocí AES256-GCM-None. Šifrování probíhá na úrovni souboru před zápisem na disk, takže i při fyzickém přístupu k zařízení útočník nemůže obsah přečíst. EncryptedSharedPreferences je součástí knihovny AndroidX Security, která také obsahuje EncryptedFile pro šifrování celých souborů.
Android SDK poskytuje sadu metod pro práci s interní pamětí prostřednictvím třídy Context. Každá metoda vrací cestu k určitému systémovému adresáři v sandboxu aplikace. Podívejme se na základní operace zápisu a čtení souborů na příkladu v Kotlinu.
Hlavní metoda pro získání cesty k internímu adresáři souborů je context.filesDir. Vrací objekt File ukazující na adresář /data/data/<package>/files/. Při prvním volání systém automaticky vytvoří všechny potřebné nadřazené adresáře. Velikost souborů v interní paměti není explicitně omezena, ale celkový objem dat by neměl překročit dostupný prostor oddílu /data, který obvykle tvoří 60–80 % celkové flash paměti zařízení.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Obsah poznámky")
val content = file.readText()
println("Přečteno: $content")
Metody writeText a readText jsou rozšiřující funkce standardní knihovny Kotlin. Automaticky spravují otevírání a zavírání proudů, což vylučuje úniky paměti. Pro binární data použijte writeBytes a readBytes, které nevyžadují kódování a pracují s poli ByteArray. Při práci s velkými soubory se doporučuje používat bufferované proudy: BufferedReader a BufferedWriter pro text, BufferedInputStream a BufferedOutputStream pro binární data.
Pro organizaci souborů do hierarchie vytvářejte podadresáře uvnitř filesDir. To pomáhá strukturovat data podle typu: obrázky, dokumenty, exportní soubory. Metoda mkdirs() vytvoří všechny chybějící adresáře v cestě včetně vnořených. Ujistěte se, že operace vytvoření byla úspěšná — metoda vrací true pouze při vytvoření nových adresářů. Chyba vytvoření nejčastěji souvisí s nedostatkem místa na oddílu /data nebo vyčerpáním inod souborového systému.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Adresář vytvořen")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Pro kontrolu dostupného místa před zápisem velkých souborů použijte File.getFreeSpace() nebo File.getUsableSpace(). Druhá metoda vrací počet bajtů dostupných aktuální aplikaci s ohledem na bezpečnostní kvóty — je přesnější v kontextu víceuživatelských zařízení. Pokud je dostupné místo menší než očekávaná velikost souboru, zobrazte uživateli zprávu a navrhněte uvolnění místa v nastavení zařízení.
Na iOS každá aplikace pracuje v izolovaném sandboxovém kontejneru. Systém neposkytuje API pro opuštění jeho hranic bez zvláštních oprávnění. Hlavním nástrojem pro práci se souborovým systémem je třída FileManager z frameworku Foundation. Sandboxový kontejner obsahuje několik standardních adresářů, z nichž každý má svou vlastní politiku zálohování.
Adresář Documents je určen pro uživatelská data, která by měla přetrvat mezi spuštěními aplikace a být obnovena ze zálohy. iOS automaticky zahrnuje tento adresář do zálohování na iCloud a iTunes. Metoda urls(for:in:) vrací pole URL adres požadovaného adresáře — první prvek pole je primární.
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 podporuje plnou sadu souborových operací: vytváření, kopírování, přesouvání, mazání a přejmenovávání. Každá operace může vyvolat chybu, proto je třeba všechna volání obalit do konstrukce do-catch. Zvláštní pozornost věnujte mazání souborů — operace je nevratná a data po removeItem(at:) nelze obnovit bez předchozí zálohy.
Ne všechna data v sandboxovém kontejneru by se měla dostat do zálohy iCloud. Například cache stažených obrázků nebo dočasné soubory zpracování není třeba obnovovat — budou znovu vytvořeny při příštím použití. Pro vyloučení adresáře nebo souboru ze zálohování nastavte atribut isExcludedFromBackup na hodnotu true. Apple doporučuje vždy vyloučit ze zálohy data, která lze obnovit vzdáleně, aby se minimalizoval objem úložiště iCloud a zkrátila doba obnovy.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Každý typ úložiště na mobilním zařízení má svůj účel a pravidla použití. Pochopení těchto rozdílů pomáhá vývojáři vybrat správné místo pro každý typ dat. Níže je uvedeno srovnání tří hlavních typů úložiště dostupných aplikaci.
| Charakteristika | Internal Storage | Cache Directory | External Storage |
|---|---|---|---|
| Viditelnost pro jiné aplikace | Skrytá | Skrytá | Přístupná |
| Smazání při odinstalaci aplikace | Úplné | Úplné | Závisí na umístění |
| Zálohování | Na Androidu ne, na iOS ano (Documents) | Ne | Pouze při synchronizaci |
| Dostupnost bez média | Vždy | Vždy | Vyžaduje SD kartu |
| Riziko ztráty dat | Minimální | Vysoké | Střední |
| Doporučená velikost souborů | Do 100 MB | Do 50 MB | Libovolná |
Interní paměť je optimální pro ukládání konfigurací aplikace, databázových souborů a uživatelských dokumentů, které by neměly být přístupné jiným programům. Adresář cache je určen pro dočasné soubory, které lze při příštím použití znovu vytvořit: stažené obrázky, odpovědi API, mezilehlá data zpracování. Externí úložiště je nejvhodnější pro velké multimediální soubory (fotografie, videa, hudba) a data, která chce uživatel sdílet s jinými aplikacemi prostřednictvím společného přístupu.
Výběr typu úložiště také ovlivňuje hodnocení aplikace v Google Play a App Store. Aplikace, které ukládají velké objemy dat do interní paměti bez čištění, získávají negativní recenze: uživatelé si stěžují na nedostatek místa. Podle průzkumu App Annie 62 % uživatelů odstraní aplikaci, pokud zabírá více než 500 MB interní paměti zařízení bez možnosti čištění.
Správná správa interní paměti aplikace zvyšuje výkon, bezpečnost a uživatelský zážitek. Následující doporučení vycházejí z oficiální dokumentace Android a iOS a také z praktických zkušeností s vývojem aplikací s miliony instalací.
Zvláštní pozornost věnujte testování okrajových případů. Otestujte chování aplikace při přeplnění interní paměti, při náhlém přerušení zápisu (pád aplikace, hovor) a při obnově ze zálohy iOS. V každém z těchto scénářů musí data zůstat konzistentní nebo být obnovena do posledního stabilního stavu. Používejte transakční soubory: zapisujte data do dočasného souboru a poté je atomicky přejmenujte na cílový. Tím zabráníte čtení poškozených dat při selhání zápisu.
Nezapomínejte na kontrolu uživatelem. V nastavení aplikace poskytněte možnost čištění dočasných dat a zobrazení využívaného objemu interní paměti. Podle Google Play Console získávají aplikace s touto funkcí o 18 % více pozitivních recenzí v kategorii „Výkon“.
Často kladené dotazy
Všechna data z interní paměti aplikace jsou zcela smazána. Operační systém zaručuje absenci zbytkových souborů včetně databází, nastavení a dočasných souborů. Data na externím úložišti přitom mohou zůstat zachována.
Bez root přístupu k zařízení nemohou jiné aplikace číst soubory z Internal Storage jiné aplikace. Na Androidu jsou k tomu vyžadována oprávnění superuživatele, na iOS je izolace zajištěna na úrovni jádra prostřednictvím Sandboxu.
Neexistuje žádný explicitní limit, ale celkový objem je omezen volným místem na oddílu /data. Doporučuje se nepřekračovat 100 MB na aplikaci — větší objemy je lepší umístit na externí úložiště nebo do cloudu.
filesDir je určen pro trvalá data aplikace a systém jej bez potřeby nemaže. cacheDir je pro dočasné soubory, které systém může smazat při nedostatku paměti. Systém nezaručuje zachování cacheDir.
Přímé kopírování z Internal Storage na SD kartu je zakázáno bezpečnostní politikou. Použijte MediaStore API na Androidu 10+ nebo SAF (Storage Access Framework) pro vytvoření kopií dat ve sdíleném přístupu se souhlasem uživatele.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také