L'archiviazione esterna è gestita da una combinazione del servizio vold
init e del servizio di sistema StorageManagerService
. Il montaggio dei volumi di archiviazione fisici esterni è gestito da vold
, che esegue operazioni di staging per preparare il supporto prima di esporlo alle app.
Nota: in Android 8.0, la classe MountService
è stata rinominata StorageManagerService
.
Mappature dei file
Per Android 4.2.2 e versioni precedenti, il file di configurazione vold.fstab
specifico del dispositivo definisce le mappature dai dispositivi sysfs ai punti di montaggio del filesystem e ogni riga segue questo formato:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: etichetta per il volume. -
mount_point
: percorso del file system in cui deve essere montato il volume. -
partition
: numero di partizione (basato su 1) o 'auto' per la prima partizione utilizzabile. -
sysfs_path
: uno o più percorsi sysfs ai dispositivi che possono fornire questo punto di montaggio. Separati da spazi e ciascuno deve iniziare con/
. -
flags
: elenco facoltativo di flag separati da virgole, non deve contenere/
. I valori possibili includonononremovable
eencryptable
.
Per le versioni Android 4.3 e successive, i vari file fstab utilizzati da init, vold e recovery sono stati unificati nel file /fstab.<device>
. Per i volumi di archiviazione esterni gestiti da vold
, le voci devono avere il seguente formato:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
-
src
: un percorso sotto sysfs (solitamente montato in /sys) al dispositivo che può fornire il punto di montaggio. Il percorso deve iniziare con/
. -
mount_point
: percorso del file system in cui deve essere montato il volume. -
type
: il tipo di filesystem sul volume. Per le schede esterne, solitamente èvfat
. -
mnt_flags
:Vold
ignora questo campo e dovrebbe essere impostato suidefaults
-
fs_mgr_flags
:Vold
ignora qualsiasi riga nel fstab unificato che non include il flagvoldmanaged=
in questo campo. Questo flag deve essere seguito da un'etichetta che descrive la carta e da un numero di partizione o dalla parolaauto
. Ecco un esempio:voldmanaged=sdcard:auto
. Altri possibili flag sonononremovable
,encryptable=sdcard
,noemulatedsd
eencryptable=userdata
.
Dettagli di configurazione
Le interazioni di archiviazione esterna a livello di framework e superiori vengono gestite tramite StorageManagerService
. A causa delle modifiche alla configurazione in Android 6.0 (come la rimozione della sovrapposizione di risorse storage_list.xml), i dettagli della configurazione sono suddivisi in due categorie.
Android 5.x e versioni precedenti
Il file di configurazione storage_list.xml
specifico del dispositivo, in genere fornito tramite un frameworks/base
, definisce gli attributi e i vincoli dei dispositivi di archiviazione. L'elemento <StorageList>
contiene uno o più elementi <storage>
, esattamente uno dei quali deve essere contrassegnato come primario. Gli attributi <storage>
includono:
-
mountPoint
: percorso del filesystem di questo mount. -
storageDescription
: risorsa stringa che descrive questo montaggio. -
primary
: vero se questo montaggio è l'archiviazione esterna primaria. -
removable
: vero se questo supporto ha un supporto rimovibile, come una scheda SD fisica. -
emulated
: true se questo montaggio è emulato ed è supportato dalla memoria interna, possibilmente utilizzando un demone FUSE. -
mtp-reserve
: numero di MB di spazio di archiviazione che MTP dovrebbe riservare per lo spazio di archiviazione gratuito. Utilizzato solo quando la montatura è contrassegnata come emulata. -
allowMassStorage
: true se questa montatura può essere condivisa tramite archiviazione di massa USB. -
maxFileSize
: dimensione massima del file in MB.
I dispositivi possono fornire archiviazione esterna emulando un file system senza distinzione tra maiuscole e minuscole e senza autorizzazione supportato dalla memoria interna. Una possibile implementazione è fornita dal demone FUSE in system/core/sdcard
, che può essere aggiunto come servizio init.rc
specifico del dispositivo:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Dove source_path
è la memoria interna di supporto e dest_path
è il punto di montaggio di destinazione.
Quando si configura uno script init.rc
specifico del dispositivo, la variabile di ambiente EXTERNAL_STORAGE
deve essere definita come percorso dell'archivio esterno primario. Anche il percorso /sdcard
deve risolversi nella stessa posizione, possibilmente tramite un collegamento simbolico. Se un dispositivo modifica la posizione della memoria esterna tra gli aggiornamenti della piattaforma, è necessario creare collegamenti simbolici in modo che i vecchi percorsi continuino a funzionare.
Android 6.0
La configurazione del sottosistema di archiviazione è ora concentrata nel file fstab
specifico del dispositivo e diversi file/variabili di configurazione statica storica sono stati rimossi per supportare un comportamento più dinamico:
- L'overlay della risorsa
storage_list.xml
è stato rimosso e non è più utilizzato dal framework. I dispositivi di archiviazione ora vengono configurati dinamicamente quando rilevati davold
. - Le variabili d'ambiente
EMULATED_STORAGE_SOURCE/TARGET
sono state rimosse e non vengono più utilizzate da Zygote per configurare punti di montaggio specifici dell'utente. Invece, la separazione degli utenti viene ora applicata con GID specifici dell'utente e lo spazio di archiviazione condiviso primario viene montato davold
in fase di runtime.- Gli sviluppatori possono continuare a creare percorsi in modo dinamico o statico a seconda del caso d'uso. L'inclusione dell'UUID nel percorso identifica ciascuna scheda per rendere la posizione più chiara per gli sviluppatori. (Ad esempio,
/storage/ABCD-1234/report.txt
è chiaramente un file diverso da/storage/DCBA-4321/report.txt
.)
- Gli sviluppatori possono continuare a creare percorsi in modo dinamico o statico a seconda del caso d'uso. L'inclusione dell'UUID nel percorso identifica ciascuna scheda per rendere la posizione più chiara per gli sviluppatori. (Ad esempio,
- I servizi FUSE hardcoded sono stati rimossi dai file
init.rc
specifici del dispositivo e vengono invece biforcati dinamicamente davold
quando necessario.
Oltre a queste modifiche alla configurazione, Android 6.0 include la nozione di spazio di archiviazione adottabile. Per i dispositivi Android 6.0, qualsiasi supporto fisico non adottato è considerato portatile.
Spazio di archiviazione adottabile
Per indicare un dispositivo di archiviazione adottabile nel fstab
, utilizzare l'attributo encryptable=userdata
nel campo fs_mgr_flags
. Ecco una definizione tipica:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Quando viene adottato un dispositivo di archiviazione, la piattaforma cancella il contenuto e scrive una tabella delle partizioni GUID che definisce due partizioni:
- una piccola partizione
android_meta
vuota riservata per uso futuro. Il GUID del tipo di partizione è 19A710A2-B3CA-11E4-B026-10604B889DCF. - una grande partizione
android_ext
crittografata utilizzando dm-crypt e formattata utilizzandoext4
of2fs
a seconda delle capacità del kernel. Il GUID del tipo di partizione è 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Archiviazione portatile
In fstab
, i dispositivi di archiviazione con l'attributo voldmanaged
sono considerati portatili per impostazione predefinita a meno che non venga definito un altro attributo come encryptable=userdata
. Ad esempio, ecco una definizione tipica per i dispositivi USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
La piattaforma utilizza blkid
per rilevare i tipi di file system prima del montaggio e gli utenti possono scegliere di formattare il supporto quando il file system non è supportato.