L'archiviazione esterna è gestita 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 il supporto prima di esporlo alle app.
Nota: in Android 8.0, la classe MountService
è stata rinominata StorageManagerService
.
Mappature di file
Per Android 4.2.2 e 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 filesystem 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. Separato da spazi, e ognuno deve iniziare con/
. -
flags
: elenco opzionale di flag separati da virgole, non deve contenere/
. I valori possibili includonononremovable
rimovibile 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 formato seguente:
<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 filesystem in cui deve essere montato il volume. -
type
: il tipo di filesystem sul volume. Per le schede esterne, questo è solitamentevfat
. -
mnt_flags
:Vold
ignora questo campo e dovrebbe essere impostato suidefaults
-
fs_mgr_flags
:Vold
ignora tutte le righe nell'fstab unificato che non includono il flagvoldmanaged=
in questo campo. Questo flag deve essere seguito da un'etichetta che descriva la tessera 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 al di sopra sono gestite tramite StorageManagerService
. A causa delle modifiche alla configurazione in Android 6.0 (come la rimozione dell'overlay di risorse storage_list.xml), i dettagli di configurazione sono divisi in due categorie.
Android 5.xe precedenti
Il file di configurazione storage_list.xml
specifico del dispositivo, generalmente 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 di <storage>
includono:
-
mountPoint
: percorso del filesystem di questo mount. -
storageDescription
: risorsa stringa che descrive questo montaggio. -
primary
: true se questo montaggio è la memoria esterna principale. -
removable
: vero se questo supporto ha un supporto rimovibile, come una scheda SD fisica. -
emulated
: true se questo mount è emulato ed è supportato da una memoria interna, possibilmente usando un demone FUSE. -
mtp-reserve
: numero di MB di spazio di archiviazione che MTP deve riservare per lo spazio di archiviazione gratuito. Utilizzato solo quando mount è contrassegnato come emulato. -
allowMassStorage
: true se questo supporto può essere condiviso tramite memoria di massa USB. -
maxFileSize
: dimensione massima del file in MB.
I dispositivi possono fornire memoria esterna emulando un filesystem senza distinzione tra maiuscole e minuscole e senza autorizzazioni supportato da 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 il percorso della memoria esterna primaria. Anche il percorso /sdcard
deve risolversi nella stessa posizione, possibilmente tramite un collegamento simbolico. Se un dispositivo regola la posizione dell'archiviazione 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 statici cronologici sono stati rimossi per supportare un comportamento più dinamico:
- L'overlay di risorse
storage_list.xml
è stato rimosso e non è più utilizzato dal framework. I dispositivi di archiviazione sono ora configurati dinamicamente quando rilevati davold
. - Le variabili di ambiente
EMULATED_STORAGE_SOURCE/TARGET
sono state rimosse e non sono più utilizzate da Zygote per configurare punti di montaggio specifici dell'utente. Al contrario, la separazione degli utenti viene ora applicata con GID specifici dell'utente e l'archiviazione condivisa primaria viene montata in posizione davold
in fase di runtime.- Gli sviluppatori possono continuare a creare percorsi in modo dinamico o statico a seconda del loro caso d'uso. Includere l'UUID nel percorso identifica ogni carta per rendere più chiara 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. Includere l'UUID nel percorso identifica ogni carta per rendere più chiara la posizione 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 storage adottabile. Per i dispositivi Android 6.0, qualsiasi supporto fisico non adottato viene considerato portatile.
Memoria adottabile
Per indicare un dispositivo di archiviazione adottabile in 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 che è riservata per un 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 filesystem prima del montaggio e gli utenti possono scegliere di formattare il supporto quando il filesystem non è supportato.