Start Magazin Probleme mit MicroSD-Karten unter Android 4.4

Probleme mit MicroSD-Karten unter Android 4.4

294
0
Teilen

Für viele Android-Nutzer ist es der Bug schlechthin: seit dem Update auf Android 4.4 dürfen die meisten Apps nicht mehr auf die externe MicroSD-Karte schreiben. Doch stammt der Bug überhaupt von Android 4.4 und ist es überhaupt ein Fehler? Android User klärt auf.

Nachdem die ersten Galaxy-Note-Nutzer und Samsung-Galaxy-S4-Besitzer über (inoffizielle) Firmware-Updates aus Polen ihr Gerät auf Android 4.4 "KitKat" gehievt hatten, mehrten sich hierzulande die Beschwerden über Probleme mit der MicroSD-Karte. Apps konnten auf einmal weder Dateien auf der MicroSD-Karte anlegen noch die vorhandenen verschieben oder löschen. Bei diesem Verhalten handelt es sich weder um einen Bug in Android noch um eine komplette Neuerung in Android 4.4 "KitKat". Einzig die Tatsache, dass einige der großen Hersteller wie Samsung und HTC dieses geplante Verhalten von Android zum ersten Mal mit Android 4.4 umsetzten, führte dazu, dass viele Seiten im Netz über Probleme mit MicroSD-Karten und Android 4.4 berichteten. In Wirklichkeit verhält sich Android aber bereits seit Version 3.2 "Honeycomb" offiziell so, dass nur vom Smartphone-Hersteller vorinstallierte Apps vollen Zugriff auf den externen Speicher erhalten.

Dieser Artikel erklärt, wo das eigentliche Problem liegt, wie es zur Änderung kam und wie Sie Abhilfe schaffen können. Dieser Artikel beschäftigt sich nicht mit der Frage, wie man Apps auf die SD-Karte auslagern kann. Lesen Sie unseren Artikel aus dem Android-User-Archiv [1], wenn Sie Apps auf die SD-Karte auslagern möchten.

Eigentlich seit Android 3.2?

Cody Toombs hat in einem Artikel bei androidpolice.com Mitte Februar die Neuerungen hervorragend unter dem Stichwort "External Blues" zusammengefasst [2] und dabei auch angemerkt, dass das aktuell bemängelte Verhalten laut Entwickler Chainfire eigentlich bereits seit Android 3.2 Standard ist [3]. Damals änderte Google die Schreibzugriffe auf den externen Speicher, indem die bisherige Berechtigung WRITE_EXTERNAL_STORAGE um WRITE_MEDIA_STORAGE für den Zugriff auf externen Speicher erweitert wurde. Die neue Berechtigung setzte hingegen das Sicherheitslevel systemOrSignature voraus, das unter Android nur System-Apps oder von Google/vom Hersteller signierte Apps erhalten können.

Zeitgleich mit dieser Umstellung wechselte Android von USB Storage für den Zugriff auf MicroSD-Karten und den internen Flash-Speicher von Android (der auch als EXTERNAL gilt, dazu später mehr) auf das MTP-Protokoll, das die Dateien in einer Art Datenbank pflegt und so externen Tools mehr Möglichkeiten für den bequemen Zugriff bietet. Warum diese Umstellung notwendig war und welche Vor- und Nachteile sie für die meisten Android-Nutzer brachte, haben wir im Artikel "Mediaserver oder Medien sorgt fuer zu hohen Akkuverbrauch" im Januar 2014 ausführlich beschrieben [4].

Abbildung 1: Die jetzt durchgeführten Änderungen haben ihren Ursprung bei Android 3.2 "Honeycomb".
Abbildung 1: Die jetzt durchgeführten Änderungen haben ihren Ursprung bei Android 3.2 "Honeycomb".

Die im Artikel erwähnten Neuerungen hielten nicht wie erwähnt in Android 4.0 Einzug, sondern ebenfalls mit Honeycomb, allerdings erst mit Version 3.2. Da es Honeycomb 3.2 aber nie auf eine wirklich große Anzahl Tablets mit MicroSD-Kartenslot geschafft hat, und es den Quellcode erst mit dem Release von Android 4.0 öffentlich gab, hielten viele das Verhalten zunächst für einen Bug. Die meisten Hersteller wagten zudem den Switch zu MTP noch nicht gleich sofort (einige bieten auch unter Android 4 noch das traditionelle USB-Storage als Zugriffslösung an. Das einzige Tablet, das eigentlich die jetzt mit Android 4.4 "KitKat" bekannt gewordenen Änderungen schon mit Android 3.2 implementierte, war das Xoom von Motorola. Das Xoom wurde bekannterweise zunächst ohne funktionierenden MicroSD-Kartentreiber ausgeliefert (Slot war vorhanden, funktionierte aber nicht) und erhielt erst mit Android 3.2 einen nutzbaren SD-Kartenleser. Die meisten Nutzer dürften die Neuerung somit als Bug abgetan haben. Ein kleines und wichtiges Detail hat sich aber tatsächlich erst mit Android 4.4 geändert, dazu mehr im übernächsten Abschnitt.

Alles externer Speicher, oder was?

Die ersten Geräte mit Android 4.4 waren das Nexus 5 und das neue Nexus 7 (2013). Beide verfügen über keinen MicroSD-Kartenslot, aber Android führt dennoch ein Verzeichnis namens /sdcard0 auf. Dabei handelt es sich um eine separate Partition, die den Apps als Datenspeicher zur Verfügung steht, nicht zu verwechseln mit der MicroSD-Karte (entfernbar), die üblicherweise unter dem Pfad bzw. der Bezeichnung ext_sd oder sdcard1 erreichbar ist. Last but not least gibt es viele Handys und Tablets mit USB-OTG-Support. Einen angeschlossenen USB-Stick bindet das Android-System unter usb0 ein.

Um in öffentliche Verzeichnisse im internen Speicher (sdcard0) schreiben zu können, muss eine App über die Berechtigung WRITE_EXTERNAL_STORAGE verfügen. Ohne diese Berechtigung darf sie nur in ihr eigenes App-Verzeichnis schreiben.

Um in öffentliche Verzeichnisse auf der MicroSD-Karte (ext_sd) schreiben zu können, muss seit Android 4.4 die Gruppe media_rw für die Berechtigung WRITE_EXTERNAL_STORAGE eingetragen sein. Standardmäßig ist das nicht der Fall, deshalb dürfen Apps seit Android 4.4 nicht mehr in ein beliebiges Verzeichnis auf der externen SD-Karte schreiben und auch keine Änderungen an bestehenden Dateien vornehmen. Es ist hingegen weiterhin möglich, in das App-eigene Verzeichnis zu schreiben, dazu ist nicht einmal die Berechtigung WRITE_EXTERNAL_STORAGE notwendig.

Für einen via USB angeschlossenen Speicher gelten noch einmal andere Rechte. Hier ist generell alles möglich und jeder Hersteller kocht sein eigenes Süppchen, was erlaubt ist und was nicht.

Eigenes Verzeichnis

Als eigenes Verzeichis einer App gilt der Ordner Android/data/App-Name, für die App mit dem Namen com.android.user als zum Beispiel Android/data/android.user. Befindet sich ein solches Verzeichnis auf der MicroSD-Karte kann eine App seit Android 4.4 ohne jegliche besonderen Berechtiungen darin schreiben. Neu werden diese Daten beim Löschen einer App auch mit entfernt. Achten Sie darauf, bevor Sie zum Beispiel eine Kamera-App oder eine Zeichnungs-App löschen! Google weist zudem in der Android-Dokumentation darauf hin, dass Daten in diesen Verzeichnissen vom Mediascanner nicht erfasst werden [6].

War es also eine App unter Android 4.3 noch möglich, in ein beliebiges Verzeichnis der MicroSD-Karte via WRITE_EXTERNAL_STORAGE zu schreiben, dürfen Apps ab Android 4.4 nur noch in das eigene Verzeichnis schreiben. Dass diese Neuerung von Android 4.4 [5] erst im Februar 2014 so richtig bekannt wurde, hängt damit zusammen, dass dann die ersten Geräte mit MicroSD-Kartenslot das Update auf Android 4.4 erhielten (Galaxy Note 3, Samsung Galaxy S4).

Das Problem mit dem externen Speicher

Unabhängig vom bisher Geschilderten kämpft Android seit eh und je mit einem (Sicherheits-) Problem: Einmal installierte Apps können im externen Speicher quasi beliebig viele und beliebige Verzeichnisse anlegen, die beim Löschen der Apps erhalten bleiben. Dadurch entsteht über die Monate recht viel Datenmüll. Denn in den wenigsten Fällen ist klar, welche Verzeichnissse von welcher App stammen. So konnten Sie sich zum Beispiel ein 5 MByte großes Spiel installieren, das anschließend 2 GByte an Gamedaten nachlud. Beim Löschen des Spiels blieben diese 2 GByte aber erhalten.

Mit den Apps zusammen auch den Datenmüll zu löschen, war noch nie eine besondere Stärke von Android. Je nach Entwickler wurden die Daten auf dem "internen" externen Speicher zwar entfernt, aber was einmal auf der externen SD-Karte landete, blieb dort meistens für die Ewigkeit. Um sicher zu gehen, dass die entsprechenden Verzeichnisse auch gelöscht werden, musste Android zwei Voraussetzungen erfüllen: Apps müssen sich an Konventionen für die Datenverzeichnisse halten und: Apps dürfen nur in bestimmte Verzeichnisse schreiben. Mit Android 4.4 sah Google den Zeitpunkt endlich gekommen, um diese Neuerung umzusetzen. Schreibt also eine App auf die SD-Karte, dann werden diese Daten ab Android 4.4 beim Löschen der App entfernt.

Abbildung 2: Wissen Sie immer, zu welcher App welches Verzeichnis gehört?
Abbildung 2: Wissen Sie immer, zu welcher App welches Verzeichnis gehört?

Lässt sich dieses neue Verhalten abstellen?

Ja, aber nur mit Root-Rechten: Wenn Sie ihr Handy oder Tablet gerootet haben, können Sie diese Neuerung recht einfach über einen zusätzlichen Eintrag in der Datei /system/etc/permissions/platform.xml quasi rückgängig machen. Um eine Lösung des Problems können sich also auch die Gerätehersteller und natürlich auch die ROM-Köche bemühen. Dazu ergänzen Sie den Abschnitt für android.permission.WRITE_EXTERNAL_STORAGE um Zeile 70 herum um den Eintrag group gid="media_rw". Das Recht für WRITE_EXTERNAL_STORAGE verhält sich dann, wie wenn es das Recht für WRITE_MEDIA_STORAGE wäre (das von Haus aus nur System-Apps und vom Hersteller signierten Apps zusteht).

    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
        <group gid="media_rw" />
    </permission>

Achten Sie unbedingt darauf, dass die Datei die Unix-Rechte 644 (rw-/r--/r--) behält, da es sonst beim Neustart zu Problemen kommt. Diese Änderung ist aber lediglich ein Spiel auf Zeit. Wenn Sie ihr Handy eh schon gerootet haben, dann empfehlen wir Ihnen, mit symbolischen Verknüpfungen zu arbeiten. Also zum Beispiel einen Link von Musik-Verzeichnis auf der SD-Karte als /sdcard0/Music anzulegen.

Beachten Sie, dass beim Löschen einer App ab Android 4.4 die Home-Verzeichnisse der App auf dem internen und dem externen Speicher mit gelöscht werden. Benutzen Sie deshalb als App-Entwickler stets entsprechende öffentliche Verzeichnisse, um Fotos, Musik, Videos oder andere Daten abzulegen, die der Nutzer eventuell auch nach dem Löschen noch behalten möchte [6].

Abbildung 3: Mit einer kleinen Änderung an der Datei platform.xml lässt sich die Änderung wieder rückgängig machen.
Abbildung 3: Mit einer kleinen Änderung an der Datei platform.xml lässt sich die Änderung wieder rückgängig machen.

Workarounds

Viele App-Entwickler haben das Problem erkannt und bieten für Ihre Apps entsprechende Updates an. Bei XDA-Developers gibt es auch ein Stück-Code, das zum Beispiel einem Dateimanager über Umwegen das Anlegen von Dateien auf der externen SD-Karte auch ohne Root-Rechte möglich macht [7]. Deshalb ist es zum Beispiel mit dem ES Datei Explorer und einigen weiteren Dateimanagern auch unter KitKat noch möglich, beliebige Verzeichnisse auf der SD-Karte anzulegen (das Löschen aber schon nicht mehr). Generell sollte man sich jedoch mit den neuen Spielregeln von Google abfinden.

Ein Umweg, der in vielen Fällen funktioniert, ist das Umbenennen der entsprechenden Verzeichnisse via PC. Denn das Lesen der entsprechenden Dateien ist in jedem Fall weiterhin möglich, lediglich beim Schreiben fehlen die nötigen Rechte (schreiben bedeutet auch verschieben, löschen, umbenennen). Haben Sie Ihre Musik zum Beispiel bisher auf der MicroSD-Karte im Ordner Musik (im Verzeichnis /ext_sd/Musik aufbewahrt, dann können zwar sämtliche Player die dort vorhandenen Titel abspielen, aber eine App, die sich auf den Download von MP3-Dateien spezialisiert hat, darf dort keine Dateien mehr speichern und auch keine vorhandenen ändern. Kritisch wird das Problem dann, wenn Sie eine MP3-Datei vom Verzeichnis der Download-App ins Verzeichnis "Musik" verschieben möchten. Das klappt nur mit einer System-App. Deshalb kann zum Beispiel die neueste Version von Google Play Music Daten auf die SD-Karte auslagern, andere Apps dürfen das hingegen nicht. Liefert der Hersteller wie zum Beispiel bei HTC keinen Dateimanager mit, dann gibt es tatsächlich keine Möglichkeit, auf dem Android-Gerät selbst Daten vom internen auf den externen Speicher zu verschieben.

Abbildung 4: Als eine von Google signierte App darf Google Play Music Dateien auf der externen SD-Karte ablegen.
Abbildung 4: Als eine von Google signierte App darf Google Play Music Dateien auf der externen SD-Karte ablegen.

Dateitypen statt Verzeichnisse

Das Android-Design-Team hat sich lange dagegen gesträubt, Android von Haus aus mit einem Dateimanager zu versehen. Lange war es nicht möglich, in der Gmail-App eine beliebige Datei als Anhang auszuwählen, lediglich Bilder zu verschicken, sah die App von Haus aus vor (über das Teilen-Menü gab es allerdings stets einen Workaround für andere Dateitypen). Seit einigen Versionen gibt es jedoch auch bei Gmail den Menüpunkt Datei anhängen. Die darauf startende App ist eine Art Mini-Dateimanager von Google, der der neuen Downloads-App nicht unähnlich sieht. Das Konzept dahinter ist nicht schwer zu verstehen: statt den Nutzer nach einem bestimmten Foto in einem bestimmten Verzeichnis browsen zu lassen, gibt es lediglich ein Verzeichnis Fotos zur Auswahl, das sämtliche Fotos auf dem Android-Gerät auflistet. Sie müssen nicht zuerst herausfinden, wo die MP3-Download-App die Musik speichert, der Mini-Dateimanager von Android zeigt Ihnen alle Musikstücke an, egal in welchem Verzeichnis sich diese befinden. Möglich macht dies das Media Transfer Protokoll: MTP. Somit schließt sich hier der Kreis zu Android 3.2 wieder, bei dem die Änderungen ihren Ursprung haben.

Abbildung 5: Seit Android 4.4 kann man über den Datei anhängen Dialog von Gmail eine beliebige Datei auswählen.
Abbildung 5: Seit Android 4.4 kann man über den Datei anhängen Dialog von Gmail eine beliebige Datei auswählen.

Zusammenfassung

Mit Android 3.2 "Honeycomb" hat Google begonnen, den Zugriff auf Verzeichnisse im internen und externen Speicher zu beschränken und die Daten auf dem Android-System in einer Datenbank-ähnlichen Struktur zu speichern (MTP). Beim Löschen von Apps hat das Android-System oft Verzeichnisse auf dem externen Speicher zurückgelassen. Seit Android 4.4 dürfen Apps ohne spezielle Berechtigung nur noch in ihre privaten Verzeichnisse (Home-Verzeichnisse) schreiben. Diese Verzeichnisse werden beim Deinstallieren einer App gelöscht. Außerhalb des privaten Verzeichnisses zu schreiben, ist seit Android 4.4 für gewöhnliche Apps nur noch mit der Berechtigung WRITE_EXTERNAL_STORAGE und nur auf dem "internen" externen Speicher (sdcard0) möglich. Die Berechtigung für das Schreiben auf die MicroSD-Karte WRITE_MEDIA_STORAGE gibt es nur für System-/Hersteller-Apps. Nicht System-Apps können deshalb seit Android 4.4 keine Änderungen mehr an den Daten auf der SD-Karte vornehmen. Wie bisher gilt auch mit Android 4.4 weiterhin: Wer sein Gerät gerootet hat, kann damit machen, was er will!