O que é / storage / emulated / 0 /?

40

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?

Nazarii Moshenskiy
fonte

Respostas:

40

/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.

Bo Lawson
fonte
15
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).
Izzy
10
@R .. Ele usa SDCardFS. Aqui está um excelente artigo sobre isso: xda-developers.com/… ( arquivo )
Nonny Moose
16

/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-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.

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 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:

without_storage_perm * 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:

with_storage_perm

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:

Irfan Latif
fonte
2
+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.
precisa