Interne opslag van de app is een toegewezen ruimte op het apparaat die alleen toegankelijk is voor de specifieke app via geïsoleerde opslag. Volgens Android Developers, 2026 krijgt elke app een eigen sandbox-directory waar andere apps geen directe toegang toe hebben. Deze benadering beschermt gegevens tegen ongeautoriseerd lezen en zorgt voor stabiele werking in de multitasking-omgeving van mobiele apparaten.
Belangrijkste punten
Context.getFilesDir(), getCacheDir() en getDataDir() voor toegang tot interne opslagNSDocumentDirectory en NSCachesDirectory in de Sandbox-container van de appInterne opslag van de app is een geïsoleerde directory die het besturingssysteem bij installatie aan elke app toewijst. Andere apps en de gebruiker via standaard bestandsbeheerders hebben geen toegang tot deze directory. Het systeem garandeert dat gegevens in deze directory volledig worden verwijderd bij deïnstallatie van de app. Deze benadering vormt de basis van het beveiligingsmodel van mobiele besturingssystemen, waardoor lekkage van vertrouwelijke informatie tussen programma's wordt voorkomen.
In tegenstelling tot externe opslag (SD-kaart) is interne opslag altijd beschikbaar en vereist geen controle op aanwezigheid van de drager. Lees- en schrijfsnelheid in NAND-flashgeheugen van moderne apparaten bereikt 800–900 MB/s sequentieel lezen en 200–300 MB/s sequentieel schrijven, vergelijkbaar met SATA SSD. De grootte van het toegewezen gebied hangt af van de totale capaciteit van het apparaat en het beleid van de fabrikant: op apparaten met 64 GB flashgeheugen krijgt de app 16 tot 64 MB initiële ruimte met de mogelijkheid tot uitbreiding indien nodig.
De architectuur van de interne opslag verschilt op Android en iOS. Op Android krijgt elke app een directory /data/data/<package_name>/, waarbinnen het systeem subdirectories files/, cache/ en databases/ aanmaakt. Op iOS werkt de app in een Sandbox-container met directories Documents/, Library/ en tmp/, elk met hun eigen doel en back-upbeleid.
Ontwikkelaars hebben verschillende manieren om gegevens op te slaan in de interne opslag van de app. Elke methode lost zijn eigen taak op en is geschikt voor een bepaald type gegevens. De juiste keuze van methode heeft directe invloed op de prestaties van de app, het ontwikkelgemak en de beveiliging van gebruikersgegevens.
De meest basale methode is het direct schrijven van bestanden naar de files-directory. De app kan alle bestanden en directories binnen zijn sandbox creëren. Deze methode is geschikt voor het opslaan van mediabestanden, gebruikersdocumenten en alle binaire gegevens die geen gestructureerde organisatie vereisen. Op Android wordt toegang tot de directory verkregen via de aanroep Context.getFilesDir(), die het absolute pad naar de bestandsdirectory van de app retourneert. Op iOS wordt een vergelijkbare functie vervuld door NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).
Voor het opslaan van sleutel-waardeparen biedt Android SharedPreferences en de modernere DataStore op basis van Kotlin-coroutines en het protobuf-protocol. SharedPreferences slaat gegevens op in een XML-bestand in de directory /data/data/<package>/shared_prefs/. Ondanks de eenvoud van gebruik heeft SharedPreferences nadelen: synchroon schrijven kan vertragingen veroorzaken op de UI-thread en het ontbreken van typeveiligheid verhoogt het risico op fouten. DataStore lost deze problemen op door een asynchrone API op basis van Flow en volledige typeondersteuning via protobuf-schema's.
Voor gestructureerde gegevens met relationele verbanden is SQLite of de wrapper Room de optimale keuze. De database wordt opgeslagen in een enkel bestand in de directory databases/ en ondersteunt volledige SQL-syntaxis. Room is een officiële Jetpack-bibliotheek die een typeveilige API, automatische schema-migratie en ondersteuning voor coroutines biedt. De grootte van de database kan enkele gigabytes bereiken zonder significant prestatieverlies bij correcte indexering. SQLite verwerkt op mobiele apparaten tot 50.000 schrijfbewerkingen per seconde op moderne flagship-processors.
Voor het opslaan van vertrouwelijke gegevens, zoals authenticatietokens en encryptiesleutels, biedt Android EncryptedSharedPreferences. Deze wrapper over de standaard SharedPreferences versleutelt automatisch sleutels en waarden met AES256-GCM-None. Encryptie vindt plaats op bestandsniveau voordat naar schijf wordt geschreven, zodat zelfs bij fysieke toegang tot het apparaat een aanvaller de inhoud niet kan lezen. EncryptedSharedPreferences maakt deel uit van de AndroidX Security-bibliotheek, die ook EncryptedFile bevat voor het versleutelen van volledige bestanden.
Android SDK biedt een set methoden voor het werken met interne opslag via de klasse Context. Elke methode retourneert het pad naar een specifieke systeemdirectory in de sandbox van de app. Laten we de basisbewerkingen van het schrijven en lezen van bestanden bekijken aan de hand van Kotlin.
De belangrijkste methode om het pad naar de interne bestandsdirectory te krijgen is context.filesDir. Het retourneert een File-object dat verwijst naar de directory /data/data/<package>/files/. Bij de eerste aanroep maakt het systeem automatisch alle benodigde bovenliggende directories aan. De grootte van bestanden in de interne opslag is niet expliciet beperkt, maar de totale hoeveelheid gegevens mag de beschikbare ruimte van de /data-partitie niet overschrijden, die gewoonlijk 60–80% van de totale flashgeheugencapaciteit van het apparaat bedraagt.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Notitie-inhoud")
val content = file.readText()
println("Gelezen: $content")
De methoden writeText en readText zijn extensiefuncties van de Kotlin-standaardbibliotheek. Ze beheren automatisch het openen en sluiten van stromen, waardoor geheugenlekken worden voorkomen. Voor het werken met binaire gegevens gebruikt u writeBytes en readBytes, die geen codering vereisen en met ByteArray-arrays werken. Bij het werken met grote bestanden wordt aanbevolen gebufferde stromen te gebruiken: BufferedReader en BufferedWriter voor tekst, BufferedInputStream en BufferedOutputStream voor binaire gegevens.
Om bestanden hiërarchisch te organiseren, maakt u subdirectories aan in filesDir. Dit helpt gegevens te structureren per type: afbeeldingen, documenten, exportbestanden. De methode mkdirs() maakt alle ontbrekende directories in het pad aan, inclusief geneste directories. Zorg ervoor dat de creatie is gelukt — de methode retourneert alleen true bij het aanmaken van nieuwe directories. Een fout bij het aanmaken wordt meestal veroorzaakt door gebrek aan ruimte op de /data-partitie of uitputting van inodes van het bestandssysteem.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Directory aangemaakt")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Controleer de beschikbare ruimte voordat u grote bestanden schrijft met File.getFreeSpace() of File.getUsableSpace(). De tweede methode retourneert het aantal bytes dat beschikbaar is voor de huidige app, rekening houdend met beveiligingsquota — dit is nauwkeuriger in de context van multi-gebruikersapparaten. Als de beschikbare ruimte kleiner is dan de verwachte bestandsgrootte, toon dan een bericht aan de gebruiker en stel voor ruimte vrij te maken in de apparaatinstellingen.
Op iOS werkt elke app in een geïsoleerde Sandbox-container. Het systeem biedt geen API om buiten de grenzen ervan te komen zonder speciale machtigingen. Het belangrijkste hulpmiddel voor het werken met het bestandssysteem is de klasse FileManager uit het Foundation-framework. De Sandbox-container bevat verschillende standaard directories, elk met hun eigen back-upbeleid.
De Documents-directory is bedoeld voor gebruikersgegevens die moeten worden bewaard tussen het starten van de app en moeten worden hersteld uit back-up. iOS neemt deze directory automatisch op in de back-up naar iCloud en iTunes. De methode urls(for:in:) retourneert een array van URL-adressen van de aangevraagde directory — het eerste element van de array is de primaire.
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 ondersteunt een volledige set bestandsbewerkingen: maken, kopiëren, verplaatsen, verwijderen en hernoemen. Elke bewerking kan een fout genereren, dus alle aanroepen moeten worden ingekapseld in een do-catch-constructie. Besteed speciale aandacht aan het verwijderen van bestanden — de bewerking is onomkeerbaar en het herstellen van gegevens na removeItem(at:) is onmogelijk zonder een voorafgaande back-up.
Niet alle gegevens in de Sandbox-container hoeven in de iCloud-back-up terecht te komen. Bijvoorbeeld, de cache van gedownloade afbeeldingen of tijdelijke verwerkingsbestanden hoeven niet te worden hersteld — ze worden opnieuw aangemaakt bij volgend gebruik. Om een directory of bestand uit te sluiten van back-up, stelt u het attribuut isExcludedFromBackup in op true. Apple raadt aan altijd gegevens uit back-up uit te sluiten die op afstand kunnen worden hersteld, om de iCloud-opslagruimte te minimaliseren en de hersteltijd te verkorten.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Elk type opslag op een mobiel apparaat heeft zijn doel en gebruiksregels. Inzicht in deze verschillen helpt de ontwikkelaar de juiste plek te kiezen voor elk type gegevens. Hieronder vindt u een vergelijking van de drie belangrijkste typen opslag die beschikbaar zijn voor de app.
| Kenmerk | Internal Storage | Cache Directory | External Storage |
|---|---|---|---|
| Zichtbaarheid voor andere apps | Verborgen | Verborgen | Toegankelijk |
| Verwijdering bij deïnstallatie | Volledig | Volledig | Afhankelijk van locatie |
| Back-up | Op Android — nee, op iOS — ja (Documents) | Nee | Alleen bij synchronisatie |
| Beschikbaarheid zonder drager | Altijd | Altijd | Vereist SD-kaart |
| Risico op gegevensverlies | Minimaal | Hoog | Gemiddeld |
| Aanbevolen bestandsgrootte | Tot 100 MB | Tot 50 MB | Elke grootte |
Interne opslag is optimaal voor het opslaan van app-configuraties, databasebestanden en gebruikersdocumenten die niet toegankelijk mogen zijn voor andere programma's. De cache-directory is bedoeld voor tijdelijke bestanden die bij volgend gebruik opnieuw kunnen worden aangemaakt: gedownloade afbeeldingen, API-antwoorden, tussenliggende verwerkingsgegevens. Externe opslag is het meest geschikt voor grote mediabestanden (foto's, video's, muziek) en gegevens die de gebruiker met andere apps wil delen via gedeelde toegang.
De keuze van het opslagtype beïnvloedt ook de app-ranglijst in Google Play en App Store. Apps die grote hoeveelheden gegevens in de interne opslag bewaren zonder op te schonen, krijgen negatieve beoordelingen: gebruikers klagen over ruimtegebrek. Volgens een onderzoek van App Annie verwijdert 62% van de gebruikers een app als deze meer dan 500 MB interne opslag van het apparaat in beslag neemt zonder opschoningsoptie.
Correct beheer van de interne opslag van de app verbetert prestaties, beveiliging en gebruikerservaring. De volgende aanbevelingen zijn gebaseerd op de officiële documentatie van Android en iOS en op praktijkervaring met het ontwikkelen van apps met miljoenen installaties.
Speciale aandacht moet worden besteed aan het testen van randgevallen. Controleer het gedrag van de app bij vol raken van de interne opslag, plotselinge onderbreking van het schrijven (app-crash, telefoongesprek) en bij herstel uit iOS-back-up. In elk van deze scenario's moeten gegevens consistent blijven of worden hersteld naar de laatste stabiele toestand. Gebruik transactionele bestanden: schrijf gegevens naar een tijdelijk bestand en hernoem het vervolgens atomair naar het doelbestand. Dit voorkomt het lezen van beschadigde gegevens bij een schrijffout.
Vergeet de gebruikerscontrole niet. Bied in de app-instellingen de optie om tijdelijke gegevens op te schonen en de gebruikte interne opslag weer te geven. Volgens de Google Play Console krijgen apps met een dergelijke functie 18% meer positieve beoordelingen in de categorie „Prestaties”.
Veelgestelde vragen
Alle gegevens uit de interne opslag van de app worden volledig verwijderd. Het besturingssysteem garandeert de afwezigheid van resterende bestanden, inclusief databases, instellingen en tijdelijke bestanden. Gegevens op externe opslag kunnen behouden blijven.
Zonder root-toegang tot het apparaat kunnen andere apps geen bestanden uit Internal Storage van een andere app lezen. Op Android zijn hiervoor superuser-privileges nodig, en op iOS wordt isolatie op kernelniveau via Sandbox gegarandeerd.
Er is geen expliciete limiet, maar de totale hoeveelheid is beperkt tot de beschikbare ruimte op de /data-partitie. Het wordt aanbevolen niet meer dan 100 MB per app te gebruiken — grotere hoeveelheden kunnen beter op externe opslag of in de cloud worden geplaatst.
filesDir is bedoeld voor permanente gegevens van de app en wordt niet door het systeem verwijderd zonder noodzaak. cacheDir is voor tijdelijke bestanden die het systeem kan verwijderen bij gebrek aan geheugen. Het systeem garandeert de integriteit van cacheDir niet.
Direct kopiëren van Internal Storage naar SD-kaart is verboden door het beveiligingsbeleid. Gebruik de MediaStore API op Android 10+ of SAF (Storage Access Framework) om kopieën van gegevens te maken in gedeelde toegang met toestemming van de gebruiker.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook