Der app-interne Speicher ist ein dedizierter Bereich auf dem Gerät, der nur einer bestimmten Anwendung über isolierten Speicher zugänglich ist. Laut Android Developers, 2026 erhält jede Anwendung ihr eigenes Sandbox-Verzeichnis, auf das andere Anwendungen keinen direkten Zugriff haben. Dieser Ansatz schützt Daten vor unbefugtem Lesen und gewährleistet einen stabilen Betrieb in einer Multitasking-Umgebung mobiler Geräte.
Wichtige Punkte
Context.getFilesDir(), getCacheDir() und getDataDir() für den Zugriff auf den internen SpeicherNSDocumentDirectory und NSCachesDirectory im Sandbox-Container der AppDer app-interne Speicher ist ein isoliertes Verzeichnis, das das Betriebssystem jeder Anwendung während der Installation zuweist. Andere Anwendungen und der Benutzer können nicht über Standard-Dateimanager auf dieses Verzeichnis zugreifen. Das System garantiert, dass alle Daten in diesem Verzeichnis bei der Deinstallation der Anwendung vollständig gelöscht werden. Dieser Ansatz bildet die Grundlage des Sicherheitsmodells mobiler Betriebssysteme und verhindert das Durchsickern vertraulicher Informationen zwischen Programmen.
Im Gegensatz zum externen Speicher (SD-Karte) ist der interne Speicher immer verfügbar und erfordert keine Überprüfung auf vorhandene Medien. Die Lese- und Schreibgeschwindigkeiten im NAND-Flash-Speicher moderner Geräte erreichen 800–900 MB/s sequenzielles Lesen und 200–300 MB/s sequenzielles Schreiben, vergleichbar mit SATA-SSDs. Die Größe des zugewiesenen Bereichs hängt von der Gesamtkapazität des Geräts und der Herstellerrichtlinie ab: Bei Geräten mit 64 GB Flash-Speicher erhält die App 16 bis 64 MB anfänglichen Speicherplatz mit der Möglichkeit der Erweiterung nach Bedarf.
Die Architektur des internen Speichers unterscheidet sich zwischen Android und iOS. Unter Android erhält jede Anwendung ein Verzeichnis /data/data/<package_name>/, in dem das System die Unterverzeichnisse files/, cache/ und databases/ erstellt. Unter iOS arbeitet die Anwendung in einem Sandbox-Container mit den Verzeichnissen Documents/, Library/ und tmp/, die jeweils ihren eigenen Zweck und ihre eigene Sicherungsrichtlinie haben.
Entwickler haben Zugriff auf mehrere Methoden zum Speichern von Daten im app-internen Speicher. Jede Methode löst eine bestimmte Aufgabe und eignet sich für eine bestimmte Art von Daten. Die Wahl der richtigen Methode wirkt sich direkt auf die Anwendungsleistung, die Entwicklungseffizienz und die Sicherheit der Benutzerdaten aus.
Die Methode der niedrigsten Ebene ist das direkte Schreiben von Dateien in das Dateiverzeichnis. Eine App kann beliebige Dateien und Verzeichnisse innerhalb ihrer Sandbox erstellen. Diese Methode eignet sich zum Speichern von Mediendateien, Benutzerdokumenten und allen binären Daten, die keine strukturierte Organisation erfordern. Unter Android erfolgt der Zugriff auf das Verzeichnis über den Aufruf Context.getFilesDir(), der den absoluten Pfad zum Dateiverzeichnis der App zurückgibt. Unter iOS erfüllt die Funktion NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) einen ähnlichen Zweck.
Zum Speichern von Schlüssel-Wert-Paaren bietet Android SharedPreferences und den moderneren DataStore basierend auf Kotlin-Koroutinen und dem Protobuf-Protokoll. SharedPreferences speichert Daten in einer XML-Datei im Verzeichnis /data/data/<package>/shared_prefs/. Trotz der Einfachheit hat SharedPreferences Nachteile: Synchrones Schreiben kann Verzögerungen im UI-Thread verursachen, und das Fehlen von Typsicherheit erhöht das Fehlerrisiko. DataStore löst diese Probleme durch eine asynchrone API basierend auf Flow und vollständige Typunterstützung über Protobuf-Schemata.
Für strukturierte Daten mit relationalen Verknüpfungen ist SQLite oder der Room-Wrapper die optimale Wahl. Die Datenbank wird in einer einzigen Datei im Verzeichnis databases/ gespeichert und unterstützt die vollständige SQL-Syntax. Room ist eine offizielle Jetpack-Bibliothek, die eine typsichere API, automatische Schema-Migration und Koroutinen-Unterstützung bietet. Die Datenbankgröße kann bei ordnungsgemäßer Indizierung mehrere Gigabyte erreichen, ohne dass die Leistung wesentlich beeinträchtigt wird. SQLite auf mobilen Geräten verarbeitet auf einem modernen Flaggschiff-Prozessor bis zu 50.000 Schreiboperationen pro Sekunde.
Zum Speichern vertraulicher Daten wie Authentifizierungstoken und Verschlüsselungsschlüssel bietet Android EncryptedSharedPreferences. Dieser Wrapper über die Standard-SharedPreferences verschlüsselt automatisch Schlüssel und Werte mit AES256-GCM-None. Die Verschlüsselung erfolgt auf Dateiebene vor dem Schreiben auf die Festplatte, sodass ein Angreifer selbst bei physischem Zugriff auf das Gerät den Inhalt nicht lesen kann. EncryptedSharedPreferences ist Teil der AndroidX Security Library, die auch EncryptedFile zum Verschlüsseln ganzer Dateien enthält.
Das Android SDK bietet eine Reihe von Methoden zum Arbeiten mit dem internen Speicher über die Context-Klasse. Jede Methode gibt einen Pfad zu einem bestimmten Systemverzeichnis innerhalb der App-Sandbox zurück. Sehen wir uns grundlegende Dateischreib- und Lesevorgänge am Beispiel von Kotlin an.
Die wichtigste Methode zum Abrufen des Pfads zum internen Dateiverzeichnis ist context.filesDir. Sie gibt ein File-Objekt zurück, das auf das Verzeichnis /data/data/<package>/files/ verweist. Beim ersten Zugriff erstellt das System automatisch alle erforderlichen übergeordneten Verzeichnisse. Die Dateigröße im internen Speicher ist nicht explizit begrenzt, aber das gesamte Datenvolumen darf den verfügbaren Speicherplatz auf der Partition /data nicht überschreiten, der in der Regel 60–80 % der gesamten Flash-Speicherkapazität ausmacht.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Notizinhalt")
val content = file.readText()
println("Gelesen: $content")
Die Methoden writeText und readText sind Erweiterungsfunktionen der Kotlin-Standardbibliothek. Sie verwalten automatisch das Öffnen und Schließen von Streams, wodurch Speicherlecks vermieden werden. Für Binärdaten verwenden Sie writeBytes und readBytes, die keine Kodierung erfordern und mit ByteArray-Arrays arbeiten. Bei der Arbeit mit großen Dateien wird die Verwendung von gepufferten Streams empfohlen: BufferedReader und BufferedWriter für Text, BufferedInputStream und BufferedOutputStream für Binärdaten.
Um Dateien hierarchisch zu organisieren, erstellen Sie Unterverzeichnisse in filesDir. Dies hilft, Daten nach Typ zu strukturieren: Bilder, Dokumente, Exportdateien. Die Methode mkdirs() erstellt alle fehlenden Verzeichnisse im Pfad, einschließlich verschachtelter. Stellen Sie sicher, dass der Erstellungsvorgang erfolgreich war — die Methode gibt nur dann true zurück, wenn neue Verzeichnisse erstellt wurden. Erstellungsfehler hängen meist mit unzureichendem Speicherplatz auf der Partition /data oder der Erschöpfung von Dateisystem-Inodes zusammen.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Verzeichnis erstellt")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Um den verfügbaren Speicherplatz vor dem Schreiben großer Dateien zu überprüfen, verwenden Sie File.getFreeSpace() oder File.getUsableSpace(). Die zweite Methode gibt die Anzahl der Bytes zurück, die der aktuellen Anwendung unter Berücksichtigung von Sicherheitskontingenten zur Verfügung stehen — sie ist im Kontext von Multi-User-Geräten genauer. Wenn der verfügbare Speicherplatz kleiner als die erwartete Dateigröße ist, zeigen Sie dem Benutzer eine Meldung an und schlagen Sie vor, in den Geräteeinstellungen Speicherplatz freizugeben.
Unter iOS arbeitet jede Anwendung in einem isolierten Sandbox-Container. Das System bietet keine API, um ohne spezielle Berechtigungen über dessen Grenzen hinauszugehen. Das wichtigste Werkzeug zur Arbeit mit dem Dateisystem ist die Klasse FileManager aus dem Foundation-Framework. Der Sandbox-Container enthält mehrere Standardverzeichnisse, die jeweils ihre eigene Sicherungsrichtlinie haben.
Das Documents-Verzeichnis ist für Benutzerdaten vorgesehen, die zwischen den App-Starts erhalten bleiben und aus dem Backup wiederhergestellt werden sollen. iOS bindet dieses Verzeichnis automatisch in iCloud- und iTunes-Backups ein. Die Methode urls(for:in:) gibt ein Array von URLs des angeforderten Verzeichnisses zurück — das erste Element des Arrays ist das primäre.
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 unterstützt eine vollständige Reihe von Dateioperationen: Erstellen, Kopieren, Verschieben, Löschen und Umbenennen von Dateien. Jede Operation kann einen Fehler auslösen, daher müssen alle Aufrufe in ein do-catch-Konstrukt eingeschlossen werden. Achten Sie besonders auf das Löschen von Dateien — der Vorgang ist irreversibel und eine Datenwiederherstellung nach removeItem(at:) ist ohne vorheriges Backup unmöglich.
Nicht alle Daten im Sandbox-Container sollten in das iCloud-Backup aufgenommen werden. Beispielsweise müssen zwischengespeicherte heruntergeladene Bilder oder temporäre Verarbeitungsdateien nicht wiederhergestellt werden — sie werden bei der nächsten Verwendung neu erstellt. Um ein Verzeichnis oder eine Datei vom Backup auszuschließen, setzen Sie das Attribut isExcludedFromBackup auf true. Apple empfiehlt, Daten, die aus der Ferne wiederhergestellt werden können, immer vom Backup auszuschließen, um die iCloud-Speichernutzung zu minimieren und die Wiederherstellungszeit zu verkürzen.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Jeder Speichertyp auf einem mobilen Gerät hat seinen eigenen Zweck und seine eigenen Nutzungsregeln. Das Verständnis dieser Unterschiede hilft dem Entwickler, den richtigen Ort für jede Datenart zu wählen. Nachfolgend finden Sie einen Vergleich der drei wichtigsten Speichertypen, die einer Anwendung zur Verfügung stehen.
| Eigenschaft | Internal Storage | Cache-Verzeichnis | External Storage |
|---|---|---|---|
| Sichtbarkeit für andere Apps | Versteckt | Versteckt | Zugänglich |
| Löschung bei App-Deinstallation | Vollständig | Vollständig | Abhängig vom Standort |
| Backup | Android — nein, iOS — ja (Documents) | Nein | Nur bei Synchronisierung |
| Verfügbarkeit ohne Medium | Immer | Immer | Erfordert SD-Karte |
| Risiko des Datenverlusts | Minimal | Hoch | Mittel |
| Empfohlene Dateigröße | Bis zu 100 MB | Bis zu 50 MB | Beliebig |
Interner Speicher ist optimal für die Speicherung von App-Konfigurationen, Datenbankdateien und Benutzerdokumenten, die für andere Programme nicht zugänglich sein sollen. Das Cache-Verzeichnis ist für temporäre Dateien vorgesehen, die bei der nächsten Verwendung neu erstellt werden können: heruntergeladene Bilder, API-Antworten, zwischengespeicherte Verarbeitungsdaten. Externer Speicher eignet sich am besten für große Mediendateien (Fotos, Videos, Musik) und Daten, die der Benutzer über gemeinsamen Zugriff mit anderen Anwendungen teilen möchte.
Die Wahl des Speichertyps wirkt sich auch auf die App-Bewertung im Google Play Store und App Store aus. Anwendungen, die ohne Bereinigung große Datenmengen im internen Speicher speichern, erhalten negative Bewertungen: Benutzer beschweren sich über Speichermangel. Laut einer Studie von App Annie löschen 62 % der Benutzer eine App, wenn sie mehr als 500 MB des internen Gerätespeichers belegt, ohne dass eine Bereinigungsoption angeboten wird.
Die ordnungsgemäße Verwaltung des app-internen Speichers verbessert Leistung, Sicherheit und Benutzererfahrung. Die folgenden Empfehlungen basieren auf der offiziellen Android- und iOS-Dokumentation sowie auf praktischer Erfahrung bei der Entwicklung von Anwendungen mit Millionen von Installationen.
Besondere Aufmerksamkeit sollte dem Testen von Grenzfällen gewidmet werden. Überprüfen Sie das Verhalten der Anwendung, wenn der interne Speicher voll ist, wenn ein Schreibvorgang unerwartet unterbrochen wird (App-Absturz, eingehender Anruf) und bei der Wiederherstellung aus einem iOS-Backup. In jedem dieser Szenarien müssen die Daten konsistent bleiben oder auf den letzten stabilen Zustand zurückgesetzt werden. Verwenden Sie Transaktionsdateien: Schreiben Sie Daten in eine temporäre Datei und benennen Sie sie dann atomar in die Ziel-Datei um. Dies verhindert das Lesen beschädigter Daten bei einem Schreibfehler.
Vergessen Sie nicht die Benutzerkontrolle. Stellen Sie in den App-Einstellungen eine Option zum Löschen temporärer Daten und zur Anzeige des belegten internen Speichervolumens bereit. Laut Google Play Console erhalten Apps mit dieser Funktion 18 % mehr positive Bewertungen in der Kategorie «Leistung».
Häufig gestellte Fragen
Alle Daten aus dem internen Speicher der App werden vollständig gelöscht. Das Betriebssystem garantiert, dass keine Restdateien, einschließlich Datenbanken, Einstellungen und temporärer Dateien, zurückbleiben. Daten auf dem externen Speicher können erhalten bleiben.
Ohne Root-Zugriff auf das Gerät können andere Apps keine Dateien aus dem Internal Storage einer anderen App lesen. Unter Android sind dafür Superuser-Rechte erforderlich, während unter iOS die Isolierung auf Kernel-Ebene durch Sandbox gewährleistet wird.
Es gibt keine explizite Grenze, aber das Gesamtvolumen ist durch den verfügbaren Speicherplatz auf der /data-Partition begrenzt. Es wird empfohlen, 100 MB pro Anwendung nicht zu überschreiten — größere Mengen sollten auf externem Speicher oder in der Cloud abgelegt werden.
filesDir ist für dauerhafte App-Daten vorgesehen und wird vom System nur bei Bedarf gelöscht. cacheDir ist für temporäre Dateien, die das System bei Speicherknappheit löschen kann. Das System garantiert nicht die Beständigkeit von cacheDir.
Das direkte Kopieren vom Internal Storage auf eine SD-Karte ist aus Sicherheitsgründen untersagt. Verwenden Sie die MediaStore-API unter Android 10+ oder SAF (Storage Access Framework), um mit Zustimmung des Benutzers Kopien der Daten im gemeinsam genutzten Speicher zu erstellen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.