L'unità di archiviazione esterna è gestita da una combinazione dell'init vold
e StorageManagerService
servizio di sistema. Montaggio di
i volumi di archiviazione esterna fisica sono gestiti da vold
, che
esegue operazioni di gestione temporanea per preparare i contenuti multimediali prima di esporli alle app.
Nota: in Android 8.0,
MountService
corso è stato rinominato in
StorageManagerService
.
Mappature dei file
Per Android 4.2.2 e versioni precedenti, vold.fstab
il file di configurazione definisce le mappature dai dispositivi sysfs al montaggio del file system
punti e ogni linea segue questo formato:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: etichetta del volume.mount_point
: percorso del file system in cui montare il volume.partition
: numero di partizione (in base a 1) o "auto" per la prima partizione utilizzabile.sysfs_path
: uno o più percorsi sysfs per i dispositivi che possono fornire questo supporto punto di accesso. Sono separate da spazi e devono iniziare con/
.flags
: elenco facoltativo di flag separati da virgole; non deve contenere/
. I valori possibili sonononremovable
eencryptable
.
Per Android 4.3 e versioni successive, i vari file fstab usati da init, vold e
il ripristino è stato unificato nel file /fstab.<device>
. Per esterni
volumi di archiviazione gestiti da vold
, le voci devono avere
seguente formato:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: un percorso in sysfs (di solito montato su /sys) per il dispositivo che può fornire il punto di montaggio. Il percorso deve iniziare con/
.mount_point
: percorso del file system in cui montare il volume.type
: il tipo di file system nel volume. Per le schede esterne, solitamente èvfat
.mnt_flags
:Vold
ignora questo campo e dovrebbe essere impostato adefaults
fs_mgr_flags
:Vold
ignora tutte le righe nel fstab unificato che non includono 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 flag possibili sonononremovable
,encryptable=sdcard
,noemulatedsd
eencryptable=userdata
.
Dettagli configurazione
Le interazioni con l'archiviazione esterna al livello del framework e anche al di sopra vengono gestite
tramite StorageManagerService
. A causa di modifiche alla configurazione in
Android 6.0 (come la rimozione dell'overlay di risorse storage_list.xml),
i dettagli della configurazione sono suddivisi in due categorie.
Android 5.x e versioni precedenti
La configurazione di storage_list.xml
specifica per il dispositivo
, solitamente 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>
, uno dei quali deve essere contrassegnato
principale. Gli attributi <storage>
includono:
mountPoint
: percorso del file system di questo montaggio.storageDescription
: risorsa stringa che descrive questa montatura.primary
: true se questo supporto è l'unità di archiviazione esterna principale.removable
: true se questa piastra da muro ha un supporto rimovibile, ad esempio una SD fisica .emulated
: true se questa montatura è emulata ed è supportata dalla memoria interna, magari usando un daemon FUSE.mtp-reserve
: numero di MB di spazio di archiviazione che MTP deve prenotare senza costi archiviazione. Utilizzato solo quando la montatura è contrassegnata come emulata.allowMassStorage
: true se questa piastra da muro può essere condivisa tramite archivio di massa USB.maxFileSize
: dimensione massima del file in MB.
I dispositivi potrebbero fornire spazio di archiviazione esterno emulando un'istanza senza distinzione tra maiuscole e minuscole,
senza autorizzazione, supportato dalla memoria interna. Uno possibile
viene fornita dal daemon FUSE in system/core/sdcard
, che può
Essere aggiunto come servizio init.rc
specifico per il 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
è la
punto di montaggio di destinazione.
Quando configuri uno script init.rc
specifico per il dispositivo, il EXTERNAL_STORAGE
la variabile di ambiente deve essere definita come il percorso
archiviazione. Anche il percorso /sdcard
deve risolversi nella stessa posizione, possibilmente
attraverso un collegamento simbolico. Se un dispositivo regola la posizione della memoria esterna tra
degli aggiornamenti della piattaforma, è necessario creare i collegamenti simbolici affinché i percorsi precedenti continuino a funzionare.
Android 6.0
La configurazione del sottosistema di archiviazione è ora concentrata
specifico del dispositivo fstab
e vari file/variabili di configurazione statiche storiche sono stati
rimossa per supportare un comportamento più dinamico:
- L'overlay della risorsa
storage_list.xml
è stato rimosso e non è più utilizzato dal framework. Ora i dispositivi di archiviazione sono 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 e configurare punti di montaggio specifici dell'utente. Ora viene applicata la separazione degli utenti con GID specifici dell'utente e lo spazio di archiviazione condiviso principale viene montato davold
in fase di runtime.- Gli sviluppatori possono continuare a creare percorsi in modo dinamico o statico a seconda
al loro caso d'uso. L'inclusione dell'UUID nel percorso consente di identificare ogni carta da effettuare
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
al loro caso d'uso. L'inclusione dell'UUID nel percorso consente di identificare ogni carta da effettuare
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 creati fork in modo dinamico davold
quando necessario.
Oltre a queste modifiche alla configurazione, Android 6.0 include la nozione di di archiviazione utilizzabili. Per i dispositivi Android 6.0, qualsiasi supporto fisico che non è è considerata portabile.
Spazio di archiviazione utilizzabile
Per indicare un dispositivo di archiviazione adattabile 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 viene adottato un dispositivo di archiviazione, la piattaforma cancella i contenuti e scrive un Tabella di partizione GUID che definisce due partizioni:
- una piccola partizione
android_meta
vuota, riservata per uso futuro. Il tipo di partizione GUID è 19A710A2-B3CA-11E4-B026-10604B889DCF. - una partizione
android_ext
di grandi dimensioni criptata con dm-crypt e formattata conext4
of2fs
, a seconda delle funzionalità del kernel. Il tipo di partizione GUID è 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Memoria portatile
In fstab
, i dispositivi di archiviazione con l'attributo voldmanaged
sono considerati portabili per impostazione predefinita, a meno che non venga fornito un altro attributo
come encryptable=userdata
. Ad esempio, di seguito è riportata una definizione tipica di 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 file
quando il file system non è supportato.