/storage/emulated/0/
é realmente /data/media/0/
exposto através de um sistema de arquivos emulado / virtual, não o atual.
Isto é com referência à minha resposta anterior aqui , mas com detalhes mais relevantes.
ARMAZENAMENTO ANDROID:
No Android 5 :
/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media
No Android 6 ou superior :
# for (Java) Android apps (running inside zygote virtual machine)
# "/storage to VIEW" bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media
# for services/daemons/processes in root/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media
* >S>
para link simbólico, >E>
para >B>
montagem emulada e para ligação
* USER-ID
do usuário atual em caso de , Multiple Users
ou Work Profile
normalmente, o 0
proprietário do dispositivo
* VIEW
é um dos read
(para aplicativos com permissão.READ_EXTERNAL_STORAGE) ou write
(permission.WRITE_EXTERNAL_STORAGE) ou default
(para processos em execução no root / espaço para nome de montagem global, ou seja, fora do zigoto)
* Havia pequenas diferenças nas versões anteriores do Android, mas o conceito de emulação era o mesmo desde a implementação.
* Para obter mais detalhes sobre a implementação do namespace de montagem do Android, consulte esta resposta .
Em resumo, /sdcard
e /storage/emulated/0
- que representam um sistema de arquivos FAT / vFAT / FAT32 - aponte para /data/media/0
(ou /mnt/expand/[UUID]/media/0
no caso de Adoptable Storage ) através de FUSE
ou sdcardfs
emulação.
Não sendo específico do Android, mas geralmente relacionado ao Linux, o link simbólico e a montagem de ligação (consulte "Criando uma montagem de ligação") estão fora do escopo desta pergunta, pois a questão é principalmente sobre parte da emulação.
EMULAÇÃO:
Por que a emulação está aqui? O sistema de arquivos emulado é uma camada de abstração no sistema de arquivos real ( ext4
ou f2fs
) que serve basicamente a dois propósitos:
- Reter a conectividade USB de dispositivos Android com PCs (implementado através do MTP hoje em dia)
- Restrinja o acesso não autorizado de aplicativos / processos à mídia privada do usuário e aos dados de outros aplicativos no cartão SD.
Leia a Jornada de armazenamento do Android para obter detalhes, o resumo é:
Os primeiros dispositivos Android tinham pouco armazenamento interno e dependiam de cartões SD externos (fisicamente) que tradicionalmente usam a família de sistemas de arquivos FAT para garantir a compatibilidade com a maioria dos PCs (consulte o domínio da Microsoft no mundo dos PCs).
Quando o armazenamento interno aumentou de tamanho, o mesmo sistema de arquivos foi transferido para o cartão SD interno (ainda chamado de "externo").
Mas a implementação do FAT / vFAT teve dois grandes problemas que foram abordados pelo Google gradualmente:
- Os dispositivos Android foram conectados diretamente aos PCs ( USB Mass Storage ), assim como conectamos uma unidade USB atualmente. O UMS expõe o dispositivo no nível do bloco e desconecta o cartão SD da estrutura do Android (desmonta), tornando os dados completos indisponíveis para os aplicativos e possivelmente quebrando muitas funcionalidades.
- O FAT (sendo o favorito do Windows nos dias de desenvolvimento) nunca foi projetado para impor permissões do UNIX (mode, uid, gid e links simbólicos da mesma forma , e
ioctls
similares FS_IOC_FIEMAP
). Portanto, todos os dados no cartão SD estavam disponíveis para todos os aplicativos (já que todo aplicativo Android é um usuário UNIX / Linux e possui um uid) sem restrições, gerando sérias preocupações de privacidade e segurança.
Ambos os problemas foram resolvidos através da emulação:
- O armazenamento real do cartão SD foi movido para a
/data
partição (ou partição independente / sdcard em alguns dispositivos anteriormente), que mantém o ext4
sistema de arquivos (sendo gradualmente substituído por f2fs
), implementando totalmente as permissões UNIX.
- Esse design tornou impossível o uso do UMS porque a
/data
partição inteira não pôde ser exposta ao PC por mais dois motivos: (1)
contém muitas configurações e dados de aplicativos que devem ser protegidos de outros aplicativos e de usuários humanos. (2)
Os sistemas de arquivos Linux não são suportados pelo Windows.
Portanto, o UMS foi substituído pelo Media Transfer Protocol, que é uma extensão do tipo cliente-servidor para o PTP - um protocolo já estabelecido. O MTP não expõe o dispositivo de bloco, mas funciona através da pilha de software. O host MTP é executado no Android como um aplicativo ( android.process.media
) totalmente em área restrita na estrutura do Android, não capaz de executar tarefas escaladas.
Agora, os aplicativos (e o MTP, que também é um aplicativo) interagem com o armazenamento emulado, em vez de /data/media
alcançar os dois objetivos ao mesmo tempo, ou seja, impor verificações de permissão por baixo e parecer com o sistema de arquivos FAT na superfície superior.
O Google agora está implementando emulação através do sdcardfs para superar as deficiências do FUSE ; uma das principais é a sobrecarga de entrada / saída, ou seja, para melhorar as velocidades de leitura / gravação.
PERMISSÕES DE ARMAZENAMENTO EXTERNO: O
conceito de arquivos públicos e privados no armazenamento externo pode ser demonstrado usando um exemplo:
Instale o aplicativo Termux.
Crie diretórios /sdcard/Android/data/com.termux/test_dir
e /sdcard/test_dir
.
Crie arquivos /sdcard/Android/data/com.termux/test_file
e /sdcard/Android/data/com.termux/test_file
.
Execute os seguintes comandos:
* Você deve ter o WhatsApp instalado ou selecionar a pasta privada de outro aplicativo.
Agora force Pare o aplicativo Termux e conceda permissão de armazenamento . Execute os comandos novamente:
Veja a diferença nas permissões dos mesmos arquivos e diretórios. Isso parece não ser simplesmente possível sem a emulação em um sistema de arquivos Linux nativo quando existem centenas de aplicativos (usuários) para serem tratados simultaneamente. Essa é a emulação do sistema de arquivos que permite que o mesmo arquivo seja exposto com três conjuntos diferentes de permissões ao mesmo tempo, independentemente de suas permissões originais no sistema de arquivos real:
# touch /data/media/0/test_file
# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file
# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file
Consulte também O que é o UID "u # _bodyybody"?
Palavras-chave: