Configuração do dispositivo

O armazenamento externo é gerenciado por uma combinação do comando init vold e o serviço do sistema StorageManagerService. Montagem de volumes físicos e externos de armazenamento são processados pelo vold, que executa operações de teste para preparar a mídia antes de expô-la aos apps.

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

Mapeamentos de arquivos

Para o Android 4.2.2 e versões anteriores, a configuração vold.fstab arquivo de configuração define mapeamentos de dispositivos sysfs para montagem no 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 será montado.
  • partition: número de 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 essa montagem. ponto Separadas por espaços, e cada uma precisa começar com /.
  • flags: lista opcional de sinalizações separadas por vírgulas, não pode 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 recuperação foram unificadas no arquivo /fstab.<device>. Para ambientes externos de armazenamento gerenciados por vold, as entradas precisam ter o formato:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: um caminho em sysfs (geralmente 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 será montado.
  • type: o tipo de sistema de arquivos no volume. Para cartões externos, geralmente é vfat.
  • mnt_flags: o Vold ignora esse campo e precisa ser definido para defaults
  • fs_mgr_flags: Vold ignora todas as linhas no fstab unificado que não incluam a flag voldmanaged= nesse campo. Essa sinalização precisa seguido de um rótulo que descreve o cartão e um número de partição ou a palavra auto: Confira um exemplo: voldmanaged=sdcard:auto. Outras sinalizações possíveis são nonremovable, encryptable=sdcard, noemulatedsd e encryptable=userdata.

Detalhes da configuração

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

Android 5.x e anteriores

A configuração storage_list.xml específica do dispositivo. , normalmente fornecido por uma sobreposição frameworks/base, define o atributos e restrições dos dispositivos de armazenamento. O elemento <StorageList> contém um ou mais elementos <storage>, e exatamente um deles deve ser marcado principal. Os atributos <storage> incluem:

  • mountPoint: caminho do sistema de arquivos da montagem.
  • storageDescription: recurso de string que descreve essa ativação.
  • primary: verdadeiro se essa montagem for o armazenamento externo principal.
  • removable: verdadeiro se a montagem tiver mídia removível, como um SD físico carda.
  • emulated: verdadeiro se a montagem for emulada e estiver respaldada pelo armazenamento interno. possivelmente usando um daemon do FUSE.
  • mtp-reserve: número de MB de armazenamento que o MTP deve reservar sem custo financeiro armazenamento. Usado apenas quando a montagem está marcada como emulada.
  • allowMassStorage: verdadeiro se o suporte puder ser compartilhado por armazenamento USB em massa.
  • maxFileSize: tamanho máximo do arquivo em MB.

Os dispositivos podem fornecer armazenamento externo emulando um sem permissões e com o apoio do armazenamento interno. Uma possível é fornecida pelo daemon do FUSE em system/core/sdcard, que pode ser adicionado como um serviço init.rc específico ao 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 de destino.

Ao configurar um script init.rc específico do dispositivo, o EXTERNAL_STORAGE variável de ambiente precisa ser definida como o caminho para o armazenamento. O caminho /sdcard também precisa levar ao mesmo local, possivelmente por meio de um link simbólico. Se um dispositivo ajustar o local do armazenamento externo entre atualizações de 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 históricos de configuração estática foram foram removidos para permitir um comportamento mais dinâmico:

  • A sobreposição de recurso storage_list.xml foi removida e não é mais usada pelo framework. Os dispositivos de armazenamento agora são configurados dinamicamente quando detectados pelo vold.
  • As variáveis de ambiente EMULATED_STORAGE_SOURCE/TARGET foram removidas e não são mais usadas pelo Zigoto para configurar pontos de montagem específicos do usuário. Em vez disso, a separação de usuários é aplicada com GIDs específicos do usuário, e o armazenamento compartilhado principal é montado no local pelo vold durante a execução.
    • Os desenvolvedores podem continuar a criar caminhos de forma dinâmica ou estática, dependendo o caso de uso. Incluir o UUID no caminho identifica cada cartão a ser mais clara a localização para os desenvolvedores. Por exemplo, /storage/ABCD-1234/report.txt é claramente um arquivo diferente de /storage/DCBA-4321/report.txt.
  • Os serviços FUSE codificados foram removidos dos arquivos init.rc específicos do dispositivo e são bifurcados dinamicamente de vold quando necessário.

Além dessas mudanças de configuração, o Android 6.0 inclui a noção de o armazenamento adotável. Para dispositivos Android 6.0, qualquer mídia física que não seja adotado é visto como portátil.

Armazenamento adotável

Para indicar um dispositivo de armazenamento adotável na fstab, use o atributo encryptable=userdata no campo fs_mgr_flags. Veja 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 A tabela de partições GUID que define duas partições:

  • uma pequena partição android_meta vazia que é reservada para uso futuro. O GUID do tipo de partição é 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • uma partição android_ext grande que é criptografada usando dm-crypt e formatada usando ext4 ou f2fs, 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 está definido. Por exemplo, veja 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 sistemas de arquivos antes da montagem, e os usuários podem escolher formatar o mídia quando o sistema de arquivos não tem suporte.