Stoccaggio tradizionale

Icona HAL di archiviazione esterna Android

Android supporta i dispositivi con archiviazione tradizionale, che è definita come un filesystem senza distinzione tra maiuscole e minuscole con classi e modalità di autorizzazione POSIX immutabili. La nozione di archiviazione tradizionale comprende l'archiviazione emulata e portatile. Per storage portatile si intende qualsiasi storage esterno che non viene adottato dal sistema e quindi non formattato e crittografato o legato ad uno specifico dispositivo. Poiché l'archiviazione esterna tradizionale offre una protezione minima per i dati archiviati, il codice di sistema non deve archiviare i dati sensibili nell'archiviazione esterna. In particolare, i file di configurazione e di registro devono essere archiviati solo nella memoria interna dove possono essere protetti in modo efficace.

Memoria esterna multiutente

A partire da Android 4.2, i dispositivi possono supportare più utenti e l'archiviazione esterna deve soddisfare i seguenti vincoli:

  • Ogni utente deve disporre della propria memoria esterna primaria isolata e non deve avere accesso alla memoria esterna primaria di altri utenti.
  • Il percorso /sdcard deve essere risolto nella memoria esterna primaria specifica dell'utente corretta in base all'utente su cui è in esecuzione un processo.
  • L'archiviazione di file OBB di grandi dimensioni nella directory Android/obb può essere condivisa tra più utenti come ottimizzazione.
  • L'archiviazione esterna secondaria non deve essere scrivibile dalle app, tranne che nelle directory specifiche del pacchetto, come consentito dalle autorizzazioni sintetizzate.

L'implementazione della piattaforma predefinita di questa funzione sfrutta gli spazi dei nomi del kernel Linux per creare tabelle di montaggio isolate per ogni processo biforcato da Zygote, quindi utilizza i montaggi di collegamento per offrire la corretta memoria esterna primaria specifica per l'utente in quello spazio dei nomi privato.

All'avvio, il sistema monta un singolo demone FUSE di archiviazione esterna emulato in EMULATED_STORAGE_SOURCE , nascosto dalle app. Dopo il fork di Zygote, bind monta la sottodirectory specifica dell'utente appropriata da sotto il daemon FUSE a EMULATED_STORAGE_TARGET in modo che i percorsi di archiviazione esterni vengano risolti correttamente per l'app. Poiché un'app non dispone di punti di montaggio accessibili per l'archiviazione di altri utenti, possono accedere all'archiviazione solo per l'utente con cui è stata avviata.

Questa implementazione usa anche la funzionalità del kernel della sottostruttura condivisa per propagare gli eventi di montaggio dallo spazio dei nomi radice predefinito agli spazi dei nomi delle app, il che garantisce che funzionalità come i contenitori ASEC e il montaggio OBB continuino a funzionare correttamente. Lo fa montando rootfs come condiviso e quindi rimontandolo come slave dopo che ogni spazio dei nomi Zygote è stato creato.

Più dispositivi di archiviazione esterni

A partire da Android 4.4, più dispositivi di archiviazione esterni vengono presentati agli sviluppatori tramite Context.getExternalFilesDirs() , Context.getExternalCacheDirs() e Context.getObbDirs() .

I dispositivi di archiviazione esterni emersi tramite queste API devono essere una parte semipermanente del dispositivo (come uno slot per schede SD in un vano batteria). Gli sviluppatori si aspettano che i dati archiviati in queste posizioni siano disponibili per lunghi periodi di tempo. Per questo motivo, i dispositivi di archiviazione transitori (come le unità di archiviazione di massa USB) non devono essere visualizzati tramite queste API.

L'autorizzazione WRITE_EXTERNAL_STORAGE deve concedere solo l'accesso in scrittura alla memoria esterna primaria su un dispositivo. Le app non devono essere autorizzate a scrivere su dispositivi di archiviazione esterni secondari, ad eccezione delle directory specifiche del pacchetto, come consentito dalle autorizzazioni sintetizzate. La limitazione delle scritture in questo modo garantisce che il sistema possa ripulire i file quando le applicazioni vengono disinstallate.

Supporto per supporti USB

Android 6.0 supporta dispositivi di archiviazione portatili che sono collegati al dispositivo solo per un breve periodo di tempo, come le unità flash USB. Quando un utente inserisce un nuovo dispositivo portatile, la piattaforma mostra una notifica per consentirgli di copiare o gestire i contenuti di quel dispositivo.

In Android 6.0, qualsiasi dispositivo non adottato è considerato portatile. Poiché l'archiviazione portatile è collegata solo per un breve periodo, la piattaforma evita operazioni pesanti come la scansione dei media. Le app di terze parti devono passare attraverso Storage Access Framework per interagire con i file nell'archiviazione portatile; l'accesso diretto è esplicitamente bloccato per motivi di privacy e sicurezza.