Lo spazio di archiviazione esterno è gestito da una combinazione del servizio vold
init
e del servizio di sistema StorageManagerService
. Il montaggio dei volumi di archiviazione esterni fisici è gestito da vold
, che esegue operazioni di staging per preparare i contenuti multimediali prima di esporli alle app.
Nota: in Android 8.0, la classe MountService
è stata rinominata StorageManagerService
.
Mappature 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 del 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 ognuno deve iniziare con/
.flags
: elenco facoltativo di flag separati da virgole, non deve contenere/
. I valori possibili includonononremovable
eencryptable
.
Per le release di 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 in sysfs (di solito 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 file system sul volume. Per le carte esterne, solitamente èvfat
.mnt_flags
:Vold
ignora questo campo e deve essere impostato sudefaults
fs_mgr_flags
:Vold
ignora le righe nel file fstab unificato che non includono il flagvoldmanaged=
in questo campo. Questo flag deve essere seguito da un'etichetta che descriva la scheda 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 della configurazione
Le interazioni con lo spazio di archiviazione esterno a livello di framework e superiore vengono gestite tramite StorageManagerService
. A causa delle modifiche alla configurazione in Android 6.0 (come la rimozione dell'overlay della risorsa 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 overlay frameworks/base
, definisce gli attributi e i vincoli dei dispositivi di archiviazione. L'elemento <StorageList>
contiene uno o più elementi <storage>
, di cui esattamente uno deve essere contrassegnato come principale. Gli attributi <storage>
includono:
mountPoint
: percorso del file system di questo montaggio.storageDescription
: risorsa stringa che descrive questo montaggio.primary
: true se questo montaggio è lo spazio di archiviazione esterno principale.removable
: true se questo montaggio ha un supporto rimovibile, ad esempio una scheda SD fisica.emulated
: true se questo montaggio è emulato e supportato dallo spazio di archiviazione interno, possibly using a FUSE daemon.mtp-reserve
: numero di MB di spazio di archiviazione che MTP deve riservare per lo spazio di archiviazione senza costi. Viene utilizzato solo quando il montaggio è contrassegnato come simulato.allowMassStorage
: true se questo montaggio può essere condiviso tramite archiviazione di massa USB.maxFileSize
: dimensioni massime del file in MB.
I dispositivi possono fornire spazio di archiviazione esterno emulando un file system senza lettere maiuscole, senza autorizzazioni e basato sulla memoria interna. Un'implementazione possibile è 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 configuri uno script init.rc
specifico per il dispositivo, la variabile di ambiente EXTERNAL_STORAGE
deve essere definita come il percorso dello spazio di archiviazione esterno principale. Anche il percorso /sdcard
deve risolvere nella stessa posizione, eventualmente tramite un link simbolico. Se un dispositivo regola la posizione della memoria esterna tra gli aggiornamenti della piattaforma, devono essere creati link 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 diverse variabili/file di configurazione statici storici sono stati
rimossi per supportare un comportamento più dinamico:
- L'overlay delle risorse
storage_list.xml
è stato rimosso e non è più utilizzato dal framework. I dispositivi di archiviazione ora vengono configurati in modo dinamico quando vengono rilevati davold
. - Le variabili di ambiente
EMULATED_STORAGE_SOURCE/TARGET
sono state rimosse e non sono più utilizzate da Zygote per configurare i punti di montaggio specifici dell'utente. Ora, invece, la separazione degli utenti viene applicata con GID specifici per utente e lo spazio di archiviazione condiviso principale viene montato davold
in fase di esecuzione.- Gli sviluppatori possono continuare a creare percorsi in modo dinamico o statico a seconda del loro caso d'uso. L'inclusione dell'UUID nel percorso identifica ogni scheda per chiarire la posizione 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 loro caso d'uso. L'inclusione dell'UUID nel percorso identifica ogni scheda per chiarire la posizione per gli sviluppatori. Ad esempio,
- I servizi FUSE hardcoded sono stati rimossi dai file
init.rc
specifici del dispositivo e vengono invece derivati dinamicamente davold
, se necessario.
Oltre a queste modifiche di configurazione, Android 6.0 include il concetto di stoccaggio adottabile. Per i dispositivi Android 6.0, tutti i supporti fisici non adottati vengono considerati portatili.
Archiviazione adottabile
Per indicare un dispositivo di archiviazione adottabile in fstab
, utilizza 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 un dispositivo di archiviazione viene adottato, la piattaforma ne cancella i contenuti e scrive una tabella delle partizioni GUID che definisce due partizioni:
- una piccola partizione
android_meta
vuota riservata per un utilizzo futuro. Il GUID del tipo di partizione è 19A710A2-B3CA-11E4-B026-10604B889DCF. - una partizione
android_ext
di grandi dimensioni criptata utilizzando dm-crypt e formattata utilizzandoext4
of2fs
a seconda delle funzionalità 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 sia definito un altro attributo come encryptable=userdata
. Ad esempio, di seguito è riportata 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 i supporti quando il file system non è supportato.