Hintergrund: Wie Android M die Speicherkarte anspricht

@ctmagazin | c't Labs

Unter Android M kann der Nutzer eine SD-Karte speziell formatieren und dann wie internen Speicher für Apps und weitere Daten nutzen. Wir haben uns das auf einem Nexus 5 mal näher angeschaut.

Das auf der Google I/O vorab gezeigte Android M verbessert die Anbindung einer SD-Karte. Es ist nun möglich, die Karte speziell zu formatieren und dann ähnlich anzusprechen wie den internen Speicher. Auch Apps kann man dort installieren.

Beim Ausprobieren auf einem Nexus 5 hat uns Google eine Überraschung beschert: Diese neue Formatierung klappt auch bei USB-Medien, nicht nur bei SD-Karten – anders hätten wir diese Funktion auch gar nicht testen können, da das Nexus 5 wie alle anderen Geräte, für die es die Android-M-Preview schon gibt, keinen SD-Slot hat. Es ist daher nicht sicher, ob die USB-Unterstützung auch Einzug ins finale Android M enthält.

Direkt nach dem Anstöpseln eines USB-Geräts fragt Android, ob es die Formatierung durchführen soll. Wann die Aufforderung bei SD-Karten kommt, können wir nicht ausprobieren, man kann sie unter Einstellungen / Speicher jederzeit manuell anstoßen. Im Folgenden schreiben wir der Einfachheit halber nur noch von SD-Karten und hoffen, dass alles weiterhin auch für USB-Geräte gilt.

Das Formatieren löscht alle auf der SD-Karte vorhandenen Daten. Sie wird dabei verschlüsselt, sodass sie auf anderen Geräten nicht lesbar ist. Nach Abschluss der Formatierung fragt Android, ob "Fotos, Dateien und App-Daten" auf die SD-Karte geschoben werden sollen. Dieses Migrieren lässt sich auch später noch in den Einstellungen anschieben.

Danach liegen sämtliche Daten des "erweiterten" Speichers auf der SD-Karte, also die Ordner DCIM, Download, Music, Ringtones, aber auch die von vielen Apps angelegten Ordner. Um genau zu sein: Alles, was die Dateimanager unter dem ExternalStorage-Pfad (meist /sdcard, storage/emulated/0 oder /mnt/sdcard) anzeigen.

Kurzer Einschub: Wer sich jetzt hier über den Pfad /sdcard wundert: Ein Teil des internen Gerätespeichers spricht Android aus historischen Gründen als /sdcard an – bei alten Geräten meist mit 1 GByte Speicher oder weniger lag er nämlich tatsächlich auf einer SD-Karte. Eine Erklärung der verkorksten Speicherverwaltung von Android brachten wir in c't 3/2015, S. 150.

Die Speicherkartenanbindung von Android M (7 Bilder)

Beim Anstecken von USB-Geräten fragt Android M nach, was es tun soll: Den Speicher wie bisher als "tragbaren Speicher" benutzen, dann können nur wenige Android-Apps drauf zugreifen. Oder neu, als internen Speicher (adoptable storage): Dann formatiert Android die Karte und man kann sie wie internen Speicher für Apps und Daten nutzen. Endlich. Bei SD-Karten dürfte das ähnlich sein, allerdings wissen wir noch nicht, ob und wann diese Nachfrage kommt.

Alle Apps haben vollen Zugriff auf so eine migrierte SD-Karte, anders als bei bisherigen Speicherkarten ab Android 4.4. Anders herum ist nun allerdings der interne Gerätespeicher nur noch eingeschränkt nutzbar: Apps können dort installiert werden und ihre private Daten dort speichern, mehr nicht. Ein Rück-Migrieren der Daten zurück in den internen Speicher ist (beispielsweise zum Einsetzen einer größeren SD-Karte) möglich, natürlich nur, sofern man genügend Platz dort hat.

Apps kann der Nutzer jederzeit auch einzeln zwischen internem Speicher und SD-Karte verschieben, unabhängig davon, ob die Daten migriert sind oder nicht. Anders als bisher verschiebt Android sogar die privaten Daten der App auf die Speicherkarte, was mehr Platz im Gerätespeicher schafft. Bisher blieben diese Daten im Gerätespeicher (weil die SD-Karte nicht verschlüsselt war) und Android verschob nur die APK-Datei.

Allerdings dürfte sich nicht jede App dafür eignen; die Einschränkungen nennt Google noch nicht, sie dürften aber wie bei Android 2 sein: Keine Apps mit Widgets, keine Apps, die beim Booten gestartet werden sollen, keine Apps, dessen Entwickler die SD-Installation nicht vorgesehen hat. Und vorinstallierte Apps lassen sich auch nicht wegschieben.

Entnimmt man die SD-Karte, verschwinden die darauf gespeicherten Apps aus der App-Übersicht, etwaige Links auf den Homescreens werden ausgegraut. Die intern installierten Apps funktionieren weiterhin – mit einer Einschränkung: Hat der Nutzer seine Daten auf die SD-Karte migriert, finden diejenigen Apps ihre Daten nicht, die sie dort erwarten. Beispielsweise findet die Kindle-App keine Bücher, die Kamera-App nimmt keine Fotos auf. Nach Einstecken der Karte stehen wieder alle Apps und alle Daten zur Verfügung.

Wenn Sie die SD-Karte als Speichererweiterung für Ihr Android-Gerät nutzen wollen und die Karte daher permanent im Gerät bleiben soll, können Sie die Migration durchführen und Apps je nach Bedarf intern oder extern speichern.

Planen Sie allerdings, die Karte ab und zu zu wechseln, sollten Sie keine Migration durchführen, sondern nur Apps auslagern – Apps, die Sie unterwegs nicht immer benötigen, beispielsweise durchgespielte Spiele, deren Spielstände Sie nicht verlieren möchten.

Wollen Sie die Karte auch in anderen Geräten nutzen, beispielsweise um am PCs Daten aufzuspielen, sollten Sie auf die Neuformatierung verzichten und die Karte so verwenden wie bisher.

Nach bisherigem Kenntnisstand: Für Programmierer ist die neue SD-Migration einerseits noch eine Speicherkonfiguration mehr, die es zu berücksichtigen gilt. Andererseits vereinfacht sich vieles, denn der Zugriff selbst funktioniert genauso wie auf uralten Android-Geräten. Wer seine App sogar noch gar nicht auf Speicherpfade jenseits der ExternalStorage-API angepasst hat und somit seit den Speicherumbauten von Android 3 keine echte SD-Karte nutzt, muss gar nichts tun: Sobald der Nutzer seine SD-Karte migriert, bekommt die alte App automatisch Zugriff.

Beim verschlüsselten Formatieren bekommt die SD-Karte eine spezielle ID und wird unter /storage gemountet, unsere beispielsweise unter /storage/586675d6-6838-4bc0-abdf-df0fab107195/0. Environment.getExternalStorage() liefert nun diesen Pfad zurück. Der bisher gelieferte Pfad /storage/emulated/0 existiert auf dem migrierten Gerät nicht mehr. Der Link /sdcard ist in beiden Fällen nutzbar, er wird immer auf die richtige Stelle umgelenkt. Der bisher ebenfalls funktionierende Alias /mnt/sdcard klappte auf dem Testgerät nicht mehr, was aber auch daran liegen kann, dass es sich nicht um eine echte SD-Karte handelt, sondern halt ein USB-Speicher.

Nun ist die Aufteilung wieder wie früher zu Zeiten von Android 2: Der /data-Pfad liegt im internen Speicher, ExternalStorage ist die SD-Karte. Tatsächlich lässt sich der interne Gerätespeicher bei migrierten Karten nicht mehr anders als per /data erreichen, er steht also nicht mehr als "shared"-Speicher zur Verfügung.

Eine Abfrage, ob die SD-Karte eingelegt ist, bietet diese API ja schon, Environment.getExternalStorageState(). Und auch ob das eine SD-Karte oder der interne Gerätespeicher ist, lässt sich feststellen: Environment.isExternalStorageRemoveable(). Liefert dann Environment.isExternalStorageEmulated() true, dürfte es sich um eine migrierte SD-Karte handeln, false deutet auf eine "alte" unverschlüsselte hin.

Ganz problemlos klappt die neue Speicheranbindung allerdings nicht. Beispielsweise konnten wir nach dem Migrieren keine Screenshots erstellen, sondern mussten dafür neu starten. Offenbar nutzen einige Apps feste Pfade zum Zugriff auf den shared-Speicher, statt ExternalStorage abzufragen.

Und das müssen Programmierer nun beachten: Absolute Pfade sollte man vermeiden, sondern die API-Aufrufe nehmen:

  • Environment.getExternalStorageDirectory() für den shared-Speicher; zeigt entweder auf den Gerätespeicher (/storage/emulated/0 bei aktuellen Geräten) oder bei migrierten SD-Karten auf diese (/storage/<ID>/0).
  • Context.getFilesDir() und andere von Google genannte Context-Methoden für den App-privaten Speicher; zeigt entweder auf den Gerätespeicher (unter /data) oder bei verschobenen Apps (auch auf nicht migrierten Karten) auf die Karte. Bei einer eigenen Test-App lieferte getFilesDir aber auch nach dem Verschieben auf die SD-Karte noch /data. Ob das Verschieben der privaten Daten im Preview-Android noch nicht implementiert ist, konnten wir noch nicht herausfinden.
  • ContextCompat.getExternalFilesDir() & Co für shared-Speicher auf SD-Karten, auf den man auch unter Android 4.4 zugreifen darf (unter /Android/data/<Appname> auf der SD-Karte). Eigentlich braucht man diese API unter Android L nicht mehr, sondern nur zwischen 3.0 und 5.1, wenn man auf die SD-Karte zugreifen möchte; erst ab 4.4 liefert sie allerdings auch die SD-Karte zurück und nicht nur den internen ExternalStorage-Speicher. (Und wen der Ausdruck interner External-Speicher verwirrt, dem sei eine Beschreibung der in der Tat verwirrenden Speichertechnik von Android nochmals ans Herz gelegt.)

Auch sollte man diese Pfade nicht abspeichern, da sie sich bei jedem App-Aufruf ändern können. Stattdessen speichert man besser nur den dahinter liegenden Teil und setzt daraus zusammen mit einem API-Aufruf den echten Pfad dynamisch zusammen. (jow)

Kommentare

Anzeige
Anzeige