O armazenamento com escopo limita o acesso dos apps ao armazenamento externo. No Android 11 ou versões mais recentes, os apps direcionados à API 30 ou mais recente precisam usar armazenamento com escopo. Antes, no Android 10, os apps podiam desativar o armazenamento com escopo.
Restrições de acesso a apps
O objetivo do armazenamento com escopo é proteger a privacidade dos dados de apps e usuários. Isso inclui proteger informações do usuário (como metadados de fotos), impedir que apps modifiquem ou excluam arquivos do usuário sem permissão explícita e proteger documentos sensíveis do usuário baixados para a pasta "Download" ou outras pastas.
Os apps que usam o armazenamento com escopo podem ter os seguintes níveis de acesso (o acesso real é específico da implementação).
- Acesso de leitura e gravação aos próprios arquivos sem permissões
- Acesso de leitura aos arquivos de mídia de outros apps com a permissão
READ_EXTERNAL_STORAGE
- O acesso de gravação aos arquivos de mídia de outros apps só é permitido com o consentimento direto do usuário. Há exceções para a Galeria do sistema e apps qualificados para o acesso a todos os arquivos.
- Sem acesso de leitura ou gravação aos diretórios de dados de apps externos de outros apps
Usar o armazenamento com escopo com o FUSE
O Android 11 ou versões mais recentes oferecem suporte ao sistema de arquivos no espaço do usuário (FUSE), que permite ao módulo MediaProvider examinar operações de arquivos no espaço do usuário e restringir o acesso a arquivos com base na política de acesso permitir, negar ou ocultar. Os apps no armazenamento com escopo que usam o FUSE recebem os recursos de privacidade do armazenamento com escopo e a capacidade de acessar arquivos usando um caminho direto para o arquivo (mantendo as APIs File funcionando nos apps).
O Android 10 aplicou regras de armazenamento com escopo em acessos a arquivos pelo MediaProvider, mas não para acesso direto ao caminho do arquivo (por exemplo, usando a API File e as APIs NDK) devido ao esforço necessário para interceptar chamadas do kernel. Como resultado, os apps no armazenamento com escopo não podiam acessar arquivos usando um caminho de arquivo direto. Essa restrição afetou a capacidade dos desenvolvedores de apps de se adaptar, já que exigia mudanças substanciais no código para reescrever o acesso à API File para a API MediaProvider.
FUSE e SDCardFS
O suporte do Android 11 ao FUSE não está relacionado à descontinuação do SDCardFS, mas oferece uma alternativa à Media Store para dispositivos que usavam o SDCardFS. Dispositivos:
- Dispositivos lançados com o Android 11 ou versões mais recentes usando o kernel 5.4 ou mais recente não podem usar o SDCardFS.
- Fazer upgrade para o Android 11 ou versões mais recentes pode hospedar o FUSE em cima do SDCardFS para interceptar as operações de arquivo e atender às metas de privacidade.
Ajuste de desempenho do FUSE
O Android oferecia suporte ao FUSE no Android 7 ou versões anteriores, em que o armazenamento
externo era montado como FUSE. Devido a problemas de desempenho e deadlock com essa implementação do
FUSE, o Android 8 introduziu o SDCardFS. O Android
11 reintroduz o suporte ao FUSE usando uma implementação aprimorada e
mais testada de libfuse
que pode ser ajustada para resolver os
problemas de desempenho no Android 7 ou versões anteriores.
O ajuste do FUSE inclui as seguintes modificações:
- Ignorar o FUSE para os diretórios
Android/data
eAndroid/obb
para melhorar o desempenho de apps de jogos que dependem desses diretórios. - Otimizações (como ajuste das proporções de leitura antecipada e suja do sistema de arquivos FUSE) para manter a leitura eficiente e a reprodução de mídia sem problemas.
- Usando o cache de gravação FUSE.
- Permissões de armazenamento em cache para reduzir as IPCs no servidor do sistema.
- Otimizações para apps com acesso a todos os arquivos, tornando as operações em massa mais rápidas.
Os ajustes acima podem produzir um desempenho comparável entre dispositivos FUSE e não FUSE. Por exemplo, o teste de um Pixel 2 ajustado usando FUSE e um Pixel 2 usando Media Store encontrou desempenho de leitura sequencial comparável (por exemplo, reprodução de vídeo) entre o acesso ao caminho do arquivo e o Media Store. No entanto, as gravações sequenciais foram um pouco piores com o FUSE, e as leituras e gravações aleatórias podem ser até duas vezes mais lentas.
As medições de desempenho podem mudar de dispositivo para dispositivo e entre casos de uso específicos. Como as APIs MediaProvider oferecem o desempenho mais consistente, os desenvolvedores de apps que se preocupam com o desempenho precisam usar essas APIs nos apps deles.
Reduzir o impacto na performance do FUSE
O impacto no desempenho do FUSE é limitado a usuários frequentes de arquivos armazenados em armazenamento compartilhado externo. O armazenamento externo privado (que inclui os diretórios android/data
e android/obb
) é ignorado pelo FUSE, enquanto o armazenamento interno (como /data/data
, em que muitos apps armazenam dados para mantê-los criptografados e seguros) não é montado pelo FUSE.
Apps que usam pouco o armazenamento externo compartilhado geralmente interagem com um conjunto limitado de arquivos (normalmente menos de 100). Esses apps se beneficiam das otimizações atuais de operações comuns de leitura e gravação e não devem ter nenhum impacto no desempenho relacionado ao FUSE no Android 11.
Apps que usam muito o armazenamento externo compartilhado geralmente realizam operações em massa de arquivos, como listar ou remover um diretório com mil arquivos ou criar ou excluir um diretório com um milhão de arquivos no sistema de arquivos. As operações em massa de arquivos podem ser afetadas pelo FUSE no Android 11, mas se esses apps forem qualificados para a permissão
MANAGE_EXTERNAL_STORAGE
, eles vão se beneficiar das otimizações de desempenho incluídas na atualização de outubro de 2020.
Para evitar a sobrecarga de desempenho do FUSE, os apps podem armazenar dados em armazenamento externo particular
ou usar APIs em massa na classe ContentProvider
para ignorar o FUSE e ter um
caminho otimizado para desempenho. Além disso, a atualização de outubro de 2020 do componente do sistema
MediaProvider inclui otimizações de desempenho para gerenciadores de
arquivos e apps semelhantes (como backup/restauração, antivírus) que têm a permissão
MANAGE_EXTERNAL_STORAGE
.
Privacidade acima da performance
Em dispositivos ajustados para FUSE, a maioria das jornadas de usuário críticas tem o mesmo desempenho no Android 10 e no Android 11. No entanto, ao testar comparativos de mercado em um conjunto de operações de arquivo, o Android 11 pode ter uma performance pior do que o Android 10. Para padrões de acesso a arquivos que têm desempenho pior no Android 11 (por exemplo, leituras ou gravações aleatórias), recomendamos usar as APIs MediaProvider para oferecer aos apps um modo de acesso não FUSE, que é a melhor opção e tem desempenho consistente.
Atualizações do MediaProvider e do FUSE
O comportamento do componente do sistema MediaProvider varia entre as versões do Android.
No Android 10 e em versões anteriores, o SDCardFS era o sistema de arquivos, e o MediaProvider fornecia uma interface para coleções de arquivos (por exemplo, imagens, vídeos, arquivos de música etc.). Quando um app criava um arquivo usando a API File, ele podia pedir ao MediaProvider para verificar o arquivo e gravá-lo no banco de dados.
No Android 11 ou versões mais recentes, o SDCardFS foi descontinuado e o MediaProvider se tornou o gerenciador do sistema de arquivos (para FUSE) para armazenamento externo, tornando o sistema de arquivos no armazenamento externo e o banco de dados do MediaProvider consistentes. Como o manipulador do espaço do usuário para o sistema de arquivos FUSE, o MediaProvider pode interceptar chamadas do kernel e garantir que as operações de arquivo sejam seguras para a privacidade.
No Android 11 e versões mais recentes, o MediaProvider também é um componente modular do sistema (um módulo Mainline) que pode ser atualizado fora das versões do Android. Isso significa que problemas de desempenho, privacidade ou segurança encontrados no MediaProvider podem ser corrigidos e entregues por transmissão sem fio pela Google Play Store ou outros mecanismos fornecidos por parceiros. Qualquer coisa no escopo do que é esperado de um processador FUSE também pode ser atualizada, permitindo atualizações para corrigir regressões de desempenho e bugs do FUSE.