O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Configuração do dispositivo

O armazenamento externo é gerenciado por uma combinação do serviço vold init e do serviço do sistema StorageManagerService . A montagem de volumes de armazenamento externo físico é feita por vold , que realiza operações de teste para preparar a mídia antes de expô-la aos aplicativos.

Observação: no Android 8.0, a classe MountService foi renomeada para StorageManagerService .

Mapeamentos de arquivo

Para Android 4.2.2 e anterior, 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 para o volume.
  • mount_point : caminho do sistema de arquivos onde o volume deve ser montado.
  • partition : Número da partição (com base em 1) ou 'auto' para a primeira partição utilizável.
  • sysfs_path : Um ou mais caminhos sysfs para dispositivos que podem fornecer este ponto de montagem. Separados por espaços, e cada um deve começar com / .
  • flags : lista opcional de sinalizadores separados por vírgulas, não deve conter / . Os valores possíveis incluem nonremovable e encryptable .

Para as versões 4.3 e posteriores do Android, os vários arquivos fstab usados ​​por init, vold e recovery foram unificados no /fstab.<device> . Para volumes de armazenamento externo gerenciados por vold , as entradas devem ter o seguinte formato:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src : Um caminho sob sysfs (geralmente montado em / sys) para o dispositivo que pode fornecer o ponto de montagem. O caminho deve começar com / .
  • mount_point : caminho do sistema de arquivos onde o volume deve ser montado.
  • type : O tipo de sistema de arquivos no volume. Para placas externas, geralmente é vfat .
  • mnt_flags : Vold ignora este campo e deve ser definido para o defaults
  • fs_mgr_flags : Vold ignora todas as linhas no fstab unificado que não incluem o voldmanaged= neste campo. Este sinalizador deve ser seguido por uma etiqueta descrevendo o cartão e um número de partição ou a palavra auto . Aqui está um exemplo: voldmanaged=sdcard:auto . Outras bandeiras possíveis são nonremovable , encryptable=sdcard , noemulatedsd e encryptable=userdata .

Detalhes de configuração

As interações de armazenamento externo no nível da estrutura e acima dele são tratadas por meio do StorageManagerService . Devido às mudanças de configuração no Android 6.0 (como a remoção da sobreposição de recurso storage_list.xml), os detalhes de configuração são divididos em duas categorias.

Android 5.x e anterior

O arquivo de configuração storage_list.xml específico do dispositivo, normalmente fornecido por meio de uma sobreposição de frameworks/base , define os atributos e restrições dos dispositivos de armazenamento. O elemento <StorageList> contém um ou mais elementos <storage> , exatamente um dos quais deve ser marcado como primário. <storage> atributos de <storage> incluem:

  • mountPoint : caminho do sistema de arquivos desta montagem.
  • storageDescription : recurso de string que descreve esta montagem.
  • primary : verdadeiro se esta montagem for o armazenamento externo primário.
  • removable : verdadeiro se este suporte tiver mídia removível, como um cartão SD físico.
  • emulated : verdadeiro se esta montagem for emulada e apoiada por armazenamento interno, possivelmente usando um daemon FUSE.
  • mtp-reserve : número de MB de armazenamento que o MTP deve reservar para armazenamento gratuito. Usado apenas quando a montagem está marcada como emulada.
  • allowMassStorage : true se esta montagem puder ser compartilhada via 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ão e sem distinção entre maiúsculas e minúsculas, apoiado por armazenamento interno. Uma implementação possível é fornecida pelo daemon FUSE em system/core/sdcard , que pode ser adicionado como um serviço init.rc específico do init.rc :

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start

Onde source_path é o armazenamento interno de apoio e dest_path é o ponto de montagem de destino.

Ao configurar um script init.rc específico do init.rc , a variável de ambiente EXTERNAL_STORAGE deve ser definida como o caminho para o armazenamento externo primário. O caminho /sdcard também deve resolver para o mesmo local, possivelmente por meio de um link simbólico. Se um dispositivo ajusta a localização do armazenamento externo entre as atualizações da plataforma, links simbólicos devem 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ática histórica foram removidos para suportar um comportamento mais dinâmico:

  • A sobreposição de recurso storage_list.xml foi removida e não é mais usada pela estrutura. Os dispositivos de armazenamento agora são configurados dinamicamente quando detectados por vold .
  • As variáveis ​​de ambiente EMULATED_STORAGE_SOURCE/TARGET foram 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 do usuário agora é aplicada com GIDs específicos do usuário e o armazenamento compartilhado primário é montado no local por vold no tempo de execução.
    • Os desenvolvedores podem continuar a construir caminhos de forma dinâmica ou estática, dependendo do caso de uso. Incluir o UUID no caminho identifica cada placa para tornar 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 serviços FUSE init.rc em código foram removidos dos arquivos init.rc específicos do dispositivo e, em vez disso, são bifurcados dinamicamente do vold quando necessário.

Além dessas mudanças de configuração, o Android 6.0 inclui a noção de armazenamento adotá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 encryptable=userdata no fstab , use o atributo encryptable=userdata no campo fs_mgr_flags . Aqui está 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 apaga o conteúdo e grava uma tabela de partição GUID que define duas partições:

  • uma pequena partição android_meta vazia que é reservada para uso futuro. O tipo de partição GUID é 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • uma grande partição android_ext que é criptografada usando dm-crypt e formatada usando ext4 ou f2fs dependendo dos recursos do kernel. O tipo de partição GUID é 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, aqui está 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 escolher formatar a mídia quando o sistema de arquivos não for compatível.