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 físico externo é feita por vold
, que executa operações de preparação 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 arquivos
Para 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 onde o volume deve ser montado. -
partition
: número da partição (com base em 1) ou 'automático' 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 deve começar com/
. -
flags
: lista opcional de flags separadas por vírgulas, não deve 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 recovery foram unificados no arquivo /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 em sysfs (normalmente 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 do sistema de arquivos no volume. Para placas externas, geralmente évfat
. -
mnt_flags
:Vold
ignora este campo e deve ser definido comodefaults
-
fs_mgr_flags
:Vold
ignora quaisquer linhas no fstab unificado que não incluam o sinalizadorvoldmanaged=
neste campo. Este sinalizador deve ser seguido por um rótulo descrevendo o cartão e um número de partição ou a palavraauto
. Aqui está um exemplo:voldmanaged=sdcard:auto
. Outros sinalizadores possíveis sãononremovable
,encryptable=sdcard
,noemulatedsd
eencryptable=userdata
.
Detalhes de configuração
As interações de armazenamento externo no nível da estrutura e acima dele são tratadas por meio de StorageManagerService
. Devido a alterações 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 anteriores
O arquivo de configuração storage_list.xml
específico do dispositivo, normalmente fornecido por meio de uma sobreposição frameworks/base
, define os atributos e restrições dos dispositivos de armazenamento. O elemento <StorageList>
contém um ou mais elementos <storage>
, dos quais exatamente um deve ser marcado como primário. Os atributos <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 esta montagem 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
: verdadeiro 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 que não diferencia maiúsculas de 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 dispositivo:
# 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 dispositivo, 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 ser resolvido para o mesmo local, possivelmente por meio de um link simbólico. Se um dispositivo ajustar a localização do armazenamento externo entre as atualizações da plataforma, links simbólicos deverão 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 recursos
storage_list.xml
foi removida e não é mais usada pela estrutura. 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 Zygote para configurar pontos de montagem específicos do usuário. Em vez disso, a separação de usuários agora é imposta com GIDs específicos do usuário, e o armazenamento primário compartilhado é montado porvold
em tempo de execução.- Os desenvolvedores podem continuar a construir caminhos de forma dinâmica ou estática, dependendo do caso de uso. A inclusão do UUID no caminho identifica cada cartão 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 desenvolvedores podem continuar a construir caminhos de forma dinâmica ou estática, dependendo do caso de uso. A inclusão do UUID no caminho identifica cada cartão para tornar a localização mais clara para os desenvolvedores. (Por exemplo,
- Os serviços FUSE codificados foram removidos dos arquivos
init.rc
específicos do dispositivo e, em vez disso, são bifurcados dinamicamente dovold
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 adotável 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 reservada para uso futuro. O GUID do tipo de partição é 19A710A2-B3CA-11E4-B026-10604B889DCF. - uma grande partição
android_ext
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
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 sistemas de arquivos antes da montagem, e os usuários podem optar por formatar a mídia quando o sistema de arquivos não for compatível.