Stoccaggio tradizionale

Icona HAL della memoria esterna Android

Android supporta i dispositivi con archiviazione tradizionale, definita come un file system senza distinzione tra maiuscole e minuscole con classi e modalità di autorizzazione POSIX immutabili. La nozione di storage tradizionale comprende lo storage emulato e quello portatile. Per archiviazione portatile si intende qualsiasi archiviazione esterna non adottata dal sistema e quindi non formattata e crittografata o legata a un dispositivo specifico. Poiché l'archiviazione esterna tradizionale offre una protezione minima per i dati archiviati, il codice di sistema non dovrebbe archiviare dati sensibili nell'archiviazione esterna. Nello specifico, 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:

  • Ciascun utente deve disporre del proprio archivio esterno primario isolato e non deve avere accesso all'archivio primario esterno di altri utenti.
  • Il percorso /sdcard deve risolversi nell'archivio esterno primario specifico dell'utente corretto in base all'utente con cui è in esecuzione un processo.
  • Lo spazio di archiviazione per file OBB di grandi dimensioni nella directory Android/obb può essere condiviso tra più utenti come ottimizzazione.
  • La memoria 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 funzionalità sfrutta gli spazi dei nomi del kernel Linux per creare tabelle di montaggio isolate per ciascun processo con fork di Zygote, quindi utilizza i montaggi di associazione per offrire la corretta archiviazione esterna primaria specifica dell'utente in quello spazio dei nomi privato.

All'avvio, il sistema monta un singolo demone FUSE di archiviazione esterna emulato su EMULATED_STORAGE_SOURCE , che è nascosto dalle app. Dopo il fork di Zygote, il collegamento monta la sottodirectory specifica dell'utente appropriata dal demone FUSE a EMULATED_STORAGE_TARGET in modo che i percorsi di archiviazione esterni si risolvano correttamente per l'app. Poiché un'app non dispone di punti di montaggio accessibili per lo spazio di archiviazione di altri utenti, questi possono accedere solo allo spazio di archiviazione dell'utente con cui è stata avviata.

Questa implementazione utilizza anche la funzionalità del kernel della sottostruttura condivisa per propagare gli eventi di montaggio dallo spazio dei nomi root predefinito agli spazi dei nomi delle app, garantendo 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 la creazione di ogni spazio dei nomi Zygote.

Più dispositivi di archiviazione esterni

A partire da Android 4.4, più dispositivi di archiviazione esterni vengono resi disponibili 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 scheda SD nel 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 temporanei (come le unità di archiviazione di massa USB) non dovrebbero essere resi visibili tramite queste API.

L'autorizzazione WRITE_EXTERNAL_STORAGE deve concedere solo l'accesso in scrittura all'archivio esterno primario su un dispositivo. Alle app non deve essere consentito di scrivere su dispositivi di archiviazione esterni secondari, tranne che nelle directory specifiche del pacchetto, come consentito dalle autorizzazioni sintetizzate. Limitare le scritture in questo modo garantisce che il sistema possa ripulire i file quando le applicazioni vengono disinstallate.

Supporto multimediale USB

Android 6.0 supporta dispositivi di archiviazione portatili che vengono 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 è connessa 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 su dispositivi di archiviazione portatili; l'accesso diretto è esplicitamente bloccato per motivi di privacy e sicurezza.