Configurazione del dispositivo

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 includono nonremovable rimovibile e encryptable .

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 è solitamente vfat .
  • mnt_flags : Vold ignora questo campo e dovrebbe essere impostato sui defaults
  • fs_mgr_flags : Vold ignora tutte le righe nell'fstab unificato che non includono il flag voldmanaged= in questo campo. Questo flag deve essere seguito da un'etichetta che descriva la tessera e da un numero di partizione o dalla parola auto . Ecco un esempio: voldmanaged=sdcard:auto . Altri possibili flag sono nonremovable , encryptable=sdcard , noemulatedsd e encryptable=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 da vold .
  • 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 da vold 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 .)
  • I servizi FUSE hardcoded sono stati rimossi dai file init.rc specifici del dispositivo e vengono invece biforcati dinamicamente da vold 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 utilizzando ext4 o f2fs 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.