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 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 includono nonremovable 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 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 sui defaults
  • fs_mgr_flags : Vold ignora qualsiasi riga nel fstab unificato che non include il flag voldmanaged= in questo campo. Questo flag deve essere seguito da un'etichetta che descrive la carta 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 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 da vold .
  • 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 da vold 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 .)
  • 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 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 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 file system prima del montaggio e gli utenti possono scegliere di formattare il supporto quando il file system non è supportato.