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 incluemnonremovable
eencryptable
.
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
: oVold
ignora esse campo e precisa ser definido paradefaults
fs_mgr_flags
:Vold
ignora todas as linhas no fstab unificado que não incluam a flagvoldmanaged=
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 palavraauto
: Confira um exemplo:voldmanaged=sdcard:auto
. Outras sinalizações possíveis sãononremovable
,encryptable=sdcard
,noemulatedsd
eencryptable=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 pelovold
. - 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 pelovold
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 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,
- Os serviços FUSE codificados foram removidos dos arquivos
init.rc
específicos do dispositivo e são bifurcados dinamicamente devold
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 usandoext4
ouf2fs
, 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.