Recentemente, eu descobri que se eu excluir arquivos /sdcard/Downloaddele exclui arquivos de /storage/emulated/0/Download. E se eu adicionar os arquivos /sdcard/Download, os duplicará /storage/emulated/0/Download.
Então o que é /storage/emulated/0/? Para que fins o temos em nosso sistema de arquivos Android?
/storage/emulated/0/Download é o caminho real para os arquivos.
/sdcard/Download é um link simbólico para o caminho real de /storage/emulated/0/Download
No entanto, os arquivos reais estão localizados no sistema de arquivos em /data/media, que é montado em /storage/emulated/0(e geralmente também em outros pontos de montagem)
A Symlink Em computação, um link simbólico é um termo para qualquer arquivo que contém uma referência a outro arquivo ou diretório na forma de um caminho absoluto ou relativo e que afeta resolução caminho. Links simbólicos já estavam presentes em 1978 nos sistemas operacionais de minicomputadores da DEC e do RDOS da Data General.
Essa resposta seria melhor se explicasse um pouco o porquê de ser "emulado". Eu acredito que o Android faz algum truque para falsificar um FAT fs que é realmente apoiado por algo melhor, mas eu não conheço os detalhes e cliquei nessa pergunta na esperança de aprender algo novo.
R ..
4
@R .. o IMHO "emulado" aponta para o fato de que é um "cartão SD emulado" (não real).
# 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-IDdo usuário atual em caso de , Multiple Usersou Work Profilenormalmente, o 0proprietá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, /sdcarde /storage/emulated/0- que representam um sistema de arquivos FAT / vFAT / FAT32 - aponte para /data/media/0(ou /mnt/expand/[UUID]/media/0no caso de Adoptable Storage ) através de FUSEou sdcardfsemulaçã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 ( ext4ou 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.
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 ioctlssimilares 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 /datapartição (ou partição independente / sdcard em alguns dispositivos anteriormente), que mantém o ext4sistema 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 /datapartiçã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/mediaalcanç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_dire /sdcard/test_dir.
Crie arquivos /sdcard/Android/data/com.termux/test_filee /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:
+1. Acho que entendi mal a parte sobre o MTP. O MTP requer um sistema de arquivos FAT no dispositivo de destino para trabalhar? Caso contrário, o Google não poderia usar o sistema de arquivos ext4 para a implementação do FUSE, pois isso também poderia impor as verificações de permissões necessárias para um aplicativo acessar apenas seus dados no armazenamento compartilhado?
Firelord
11
@Firelord ao discutir emulação, o foco não está na implementação do MTP. O Google já fez alterações no protocolo MTP para atender a certas necessidades do Android e possivelmente elas poderiam implementá-lo através de algum sistema de arquivos Linux nativo. Mas o ponto é que precisamos de um FAT-like permission-less filesystemque costumava ser nos primeiros dias do Android para garantir compatibilidade com versões anteriores e que atenda ao design do conceito de armazenamento externo do Android. Fiz uma edição para elaborar meu argumento.
/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 :
No Android 6 ou superior :
*
>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
ouWork Profile
normalmente, o0
proprietário do dispositivo*
VIEW
é um dosread
(para aplicativos com permissão.READ_EXTERNAL_STORAGE) ouwrite
(permission.WRITE_EXTERNAL_STORAGE) oudefault
(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 deFUSE
ousdcardfs
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
ouf2fs
) que serve basicamente a dois propósitos: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:
ioctls
similaresFS_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:
/data
partição (ou partição independente / sdcard em alguns dispositivos anteriormente), que mantém oext4
sistema de arquivos (sendo gradualmente substituído porf2fs
), implementando totalmente as permissões UNIX./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:
Consulte também O que é o UID "u # _bodyybody"?
Palavras-chave:
fonte
FAT-like permission-less filesystem
que costumava ser nos primeiros dias do Android para garantir compatibilidade com versões anteriores e que atenda ao design do conceito de armazenamento externo do Android. Fiz uma edição para elaborar meu argumento.