Android hat schon immer externes Speicherzubehör (z. B. SD-Karten) unterstützt, aber dieses Zubehör war historisch auf einfache Dateispeicherung beschränkt, aufgrund seiner erwarteten Vergänglichkeit und des minimalen Datenschutzes, den herkömmliche externe Speicher bieten. Android 6.0 führte die Möglichkeit ein, externe Speichermedien zu übernehmen , die sich wie interner Speicher verhalten.
Wenn externe Speichermedien übernommen werden, werden sie so formatiert und verschlüsselt, dass sie jeweils nur mit einem einzigen Android-Gerät funktionieren. Da die Medien stark an das Android-Gerät gebunden sind, das sie übernommen hat, können sie sowohl Apps als auch private Daten für alle Benutzer sicher speichern.
Wenn Benutzer neue Speichermedien (z. B. eine SD-Karte) an einem geeigneten Ort einlegen, fragt Android sie, wie sie die Medien verwenden möchten. Sie können wählen, ob sie die Medien übernehmen, die sie formatieren und verschlüsseln, oder sie können sie unverändert für die einfache Dateispeicherung verwenden. Wenn sie sich für eine Übernahme entscheiden, bietet die Plattform an, die Inhalte des primären gemeinsam genutzten Speichers (normalerweise unter /sdcard
) auf die neu übernommenen Medien zu migrieren, wodurch wertvoller Speicherplatz im internen Speicher frei wird. Im Gegensatz zu herkömmlichem Speicher, der aufgrund der Verwendung von MBR auf 2 TB begrenzt ist, verwendet Adoptable Storage GPT und hat daher eine Dateispeichergrenze von ~9 ZB.
Apps können nur dann auf angenommenen Speichermedien platziert werden, wenn der Entwickler die Unterstützung durch das Attribut android:installLocation
angegeben hat. Neue Installationen von unterstützten Apps werden automatisch auf dem Speichergerät mit dem meisten freien Speicherplatz abgelegt, und Benutzer können unterstützte Apps in der App „Einstellungen “ zwischen Speichergeräten verschieben. Apps, die auf übernommene Medien verschoben wurden, werden gespeichert, während die Medien ausgeworfen werden, und kehren zurück, wenn die Medien erneut eingelegt werden.
Sicherheit
Die Plattform generiert zufällig Verschlüsselungsschlüssel für jedes angenommene Gerät und speichert sie im internen Speicher des Android-Geräts. Dies macht die angenommenen Medien effektiv so sicher wie interne Speicher. Schlüssel werden angenommenen Geräten basierend auf der angenommenen Partitions-GUID zugeordnet.
Wenn das Gerät für die Verwendung der dateibasierten Verschlüsselung (FBE) auf seinem internen Speicher konfiguriert ist, verwendet der adoptierbare Speicher sowohl die FBE- als auch die Metadatenverschlüsselung . Andernfalls verwendet Adoptable Storage Full Disk Encryption (FDE).
Das On-Disk-Layout des angenommenen Geräts spiegelt genau die interne Datenpartition wider, einschließlich SELinux-Labels usw. Wenn Mehrbenutzer auf dem Android-Gerät unterstützt wird, unterstützt das angenommene Speichergerät auch Mehrbenutzer mit der gleichen Isolationsstufe wie intern Lagerung.
Da der Inhalt eines übernommenen Speichergeräts stark an das Android-Gerät gebunden ist, das es übernommen hat, sollten die Verschlüsselungsschlüssel nicht vom übergeordneten Gerät extrahierbar sein, und daher kann das Speichergerät nicht an anderer Stelle gemountet werden.
Wenn Ihr Gerät FBE verwendet, lesen Sie die FBE-Dokumentation und die Dokumentation zur Metadatenverschlüsselung, um zu erfahren, wie Sie FBE und die Metadatenverschlüsselung auf adoptierbarem Speicher konfigurieren.
Leistung und Stabilität
Nur externe Speichermedien an stabilen Orten, wie z. B. einem Steckplatz in einem Batteriefach oder hinter einer Schutzabdeckung, sollten für die Einführung in Betracht gezogen werden, um versehentlichen Datenverlust oder -beschädigung zu vermeiden. Insbesondere sollten USB-Geräte, die an ein Telefon oder Tablet angeschlossen sind, niemals für eine Einführung in Betracht gezogen werden. Eine häufige Ausnahme wäre ein externes USB-Laufwerk, das an ein Fernsehgerät angeschlossen ist, da der gesamte Fernseher normalerweise an einem stabilen Ort installiert ist.
Wenn ein Benutzer ein neues Speichergerät einsetzt, führt die Plattform einen Benchmark durch und vergleicht seine Leistung mit dem internen Speicher. Wenn das angenommene Gerät deutlich langsamer als der interne Speicher ist, warnt die Plattform den Benutzer vor einer möglicherweise verschlechterten Erfahrung. Dieser Benchmark wurde aus dem tatsächlichen I/O-Verhalten beliebter Android-Apps abgeleitet. Derzeit warnt die AOSP-Implementierung Benutzer nur über einen einzigen Schwellenwert hinaus, aber Gerätehersteller können dies weiter anpassen, z. B. die Übernahme vollständig ablehnen, wenn die Karte extrem langsam ist.
Angenommene Geräte müssen mit einem Dateisystem formatiert sein, das POSIX-Berechtigungen und erweiterte Attribute wie ext4
oder f2fs
. Für eine optimale Leistung wird das f2fs
-Dateisystem für Flash-basierte Speichergeräte empfohlen.
Bei der regelmäßigen Leerlaufwartung gibt die Plattform FI_TRIM
an übernommene Medien aus, genau wie für den internen Speicher. Die aktuelle SD-Kartenspezifikation unterstützt den DISCARD
Befehl nicht; aber der Kernel greift stattdessen auf den ERASE
-Befehl zurück, den die SD-Karten-Firmware möglicherweise zu Optimierungszwecken verwendet.
Testen
Führen Sie diesen CTS-Test aus, um zu testen, ob Adoptable Storage funktioniert:
cts-tradefed run commandAndExit cts-dev \ -m CtsAppSecurityHostTestCases \ -t android.appsecurity.cts.AdoptableHostTest
Um das Verhalten von USB-Laufwerken und SD-Karten zu überprüfen, wenn ein Gerät keinen integrierten Steckplatz hat oder wenn der USB-Anschluss für eine aktive ADB-Verbindung verwendet wird, verwenden Sie:
adb shell sm set-virtual-disk true