O armazenamento externo é gerenciado por uma combinação do serviço de inicialização
vold e do serviço de sistema StorageManagerService. A montagem de
volumes de armazenamento externo físicos é gerenciada por vold, que
executa operações de preparo para preparar a mídia antes de expô-la aos apps.
Observação:no Android 8.0, a
classe MountService foi renomeada como
StorageManagerService.
Mapeamentos de arquivos
Para o Android 4.2.2 e versões anteriores, o arquivo de configuração vold.fstab
específico do dispositivo define mapeamentos de dispositivos sysfs para pontos de montagem
do sistema de arquivos, e cada linha segue este formato:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label: rótulo do volume.mount_point: caminho do sistema de arquivos em que o volume precisa ser montado.partition: número da partição (baseado em 1) ou "auto" para a primeira partição utilizável.sysfs_path: um ou mais caminhos sysfs para dispositivos que podem fornecer esse ponto de montagem. Separados por espaços, e cada um precisa começar com/.flags: lista opcional de flags separadas por vírgulas. Não pode conter/. Os valores possíveis incluemnonremovableeencryptable.
Para as versões do Android 4.3 e mais recentes, os vários arquivos fstab usados por init, vold e
recovery foram unificados no arquivo /fstab.<device>. Para volumes de armazenamento
externos gerenciados por vold, as entradas precisam ter o
seguinte formato:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src: um caminho em sysfs (normalmente montado em /sys) para o dispositivo que pode fornecer o ponto de montagem. O caminho precisa começar com/.mount_point: caminho do sistema de arquivos em que o volume precisa ser montado.type: o tipo do sistema de arquivos no volume. Para cartões externos, geralmente évfat.mnt_flags:Voldignora esse campo e precisa ser definido comodefaults.fs_mgr_flags:Voldignora todas as linhas no fstab unificado que não incluem a flagvoldmanaged=neste campo. Essa flag precisa ser seguida por um rótulo que descreva o cartão e um número de partição ou a palavraauto. Confira um exemplo:voldmanaged=sdcard:auto. Outras flags possíveis sãononremovable,encryptable=sdcard,noemulatedsdeencryptable=userdata.
Detalhes da configuração
As interações de armazenamento externo no nível do framework e acima dele são processadas
por StorageManagerService. Devido a mudanças de configuração no
Android 6.0 (como a remoção da sobreposição de recursos storage_list.xml), os
detalhes de configuração são divididos em duas categorias.
Android 5.x e versões anteriores
O arquivo de configuração storage_list.xml específico do dispositivo, normalmente fornecido por uma sobreposição frameworks/base, define os
atributos e as restrições dos dispositivos de armazenamento. O elemento <StorageList>
contém um ou mais elementos <storage>, sendo que exatamente um deles precisa ser marcado
como primário. Os atributos <storage> incluem:
mountPoint: caminho do sistema de arquivos dessa montagem.storageDescription: recurso de string que descreve essa montagem.primary: verdadeiro se essa montagem for o armazenamento externo principal.removable: verdadeiro se a montagem tiver mídia removível, como um cartão SD físico.emulated: verdadeiro se essa montagem for emulada e tiver o suporte do armazenamento interno, possivelmente usando um daemon FUSE.mtp-reserve: número de MB de armazenamento que o MTP precisa reservar para armazenamento sem custo financeiro. Usado apenas quando a montagem é marcada como emulada.allowMassStorage: verdadeiro se essa montagem puder ser compartilhada pelo armazenamento em massa USB.maxFileSize: tamanho máximo do arquivo em MB.
Os dispositivos podem fornecer armazenamento externo emulando um sistema de arquivos sem
permissões e que não diferencia maiúsculas de minúsculas, com suporte de armazenamento interno. Uma possível
implementação é fornecida pelo daemon FUSE em system/core/sdcard, que pode
ser adicionado como um serviço init.rc específico do dispositivo:
# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
class late_start
Em que source_path é o armazenamento interno de backup e dest_path é o
ponto de montagem de destino.
Ao configurar um script init.rc específico do dispositivo, a variável de ambiente
EXTERNAL_STORAGE precisa ser definida como o caminho para o armazenamento externo
principal. O caminho /sdcard também precisa resolver para o mesmo local, possivelmente
por um link simbólico. Se um dispositivo ajustar o local do armazenamento externo entre
as atualizações da plataforma, os links simbólicos precisam ser criados para que os caminhos antigos continuem funcionando.
Android 6.0
A configuração do subsistema de armazenamento agora está concentrada no
arquivo fstab específico do dispositivo, e vários arquivos/variáveis de configuração estáticos históricos foram
removidos para oferecer suporte a um comportamento mais dinâmico:
- A sobreposição de recursos
storage_list.xmlfoi removida e não é mais usada pelo framework. Os dispositivos de armazenamento agora são configurados de forma dinâmica quando detectados porvold. - As variáveis de ambiente
EMULATED_STORAGE_SOURCE/TARGETforam removidas e não são mais usadas pelo Zygote para configurar pontos de montagem específicos do usuário. Em vez disso, a separação de usuários agora é aplicada com GIDs específicos do usuário, e o armazenamento compartilhado principal é montado no lugar porvoldno momento da execução.- Os desenvolvedores podem continuar criando caminhos dinamicamente ou estaticamente, dependendo do
caso de uso. A inclusão do UUID no caminho identifica cada card para deixar
a localização mais clara para os desenvolvedores. Por exemplo,
/storage/ABCD-1234/report.txté claramente um arquivo diferente de/storage/DCBA-4321/report.txt.
- Os desenvolvedores podem continuar criando caminhos dinamicamente ou estaticamente, dependendo do
caso de uso. A inclusão do UUID no caminho identifica cada card para deixar
a localização mais clara para os desenvolvedores. Por exemplo,
- Os serviços FUSE fixados no código foram removidos dos arquivos
init.rcespecíficos do dispositivo e, em vez disso, são bifurcados dinamicamente dovoldquando necessário.
Além dessas mudanças de configuração, o Android 6.0 inclui a noção de armazenamento adaptável. Para dispositivos Android 6.0, qualquer mídia física que não seja adotada é considerada portátil.
Armazenamento adotável
Para indicar um dispositivo de armazenamento adaptável no fstab, use o atributo encryptable=userdata no campo fs_mgr_flags. Esta é uma definição típica:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Quando um dispositivo de armazenamento é adotado, a plataforma exclui o conteúdo e grava uma tabela de partição GUID que define duas partições:
- uma pequena partição
android_metavazia reservada para uso futuro. O GUID do tipo de partição é 19A710A2-B3CA-11E4-B026-10604B889DCF. - uma partição
android_extgrande criptografada usando dm-crypt e formatada comext4ouf2fs, dependendo dos recursos do kernel. O GUID do tipo de partição é 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Armazenamento portátil
No fstab, os dispositivos de armazenamento com o atributo voldmanaged são considerados portáteis por padrão, a menos que outro atributo
como encryptable=userdata seja definido. Por exemplo, esta é uma definição típica para dispositivos USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults
voldmanaged=usb:auto
A plataforma usa blkid para detectar tipos de sistema de arquivos antes da montagem, e os usuários podem formatar a
mídia quando o sistema de arquivos não é compatível.