Armazenamento com escopo

O armazenamento com escopo limita o acesso do app ao armazenamento externo. No Android 11 ou versões mais recentes, os apps direcionados à API 30 ou versões mais recentes precisam usar o armazenamento com escopo. 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 do app e do usuário. Isso inclui a proteção de informações do usuário (como metadados de fotos), a prevenção de apps que modifiquem ou excluam arquivos do usuário sem permissão explícita e a proteção de documentos sensíveis do usuário transferidos por download para a pasta "Downloads" 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
  • Permissão de leitura para acessar arquivos de mídia de outros apps com a permissão READ_EXTERNAL_STORAGE
  • O acesso de gravação a arquivos de mídia de outros apps é permitido apenas com o consentimento direto do usuário (exceto a Galeria do sistema e apps qualificados para acesso a todos os arquivos).
  • Não há acesso de leitura ou gravação aos diretórios de dados externos de outros apps

Usar o armazenamento com escopo com o FUSE

O Android 11 e versões mais recentes oferecem suporte ao sistema de arquivos no espaço do usuário (FUSE), o que permite ao módulo MediaProvider examinar operações de arquivos no espaço do usuário e limitar o acesso a arquivos com base na política para permitir, negar ou encobrir o acesso. 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 de arquivo direto, mantendo as APIs de arquivo funcionando nos apps.

O Android 10 aplica regras de armazenamento com escopo em acessos de arquivo pelo MediaProvider, mas não para acesso direto ao caminho de arquivo (por exemplo, usando a API File e as APIs do 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 de adaptação dos desenvolvedores de apps, já que exigia mudanças significativas no código para reescrever o acesso da API File à 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:

  • Não é possível usar o SDCardFS no lançamento com o Android 11 ou mais recente usando o kernel 5.4 ou mais recente.
  • Fazer upgrade para o Android 11 ou mais recente 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 já 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 melhorada 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 os seguintes ajustes:

  • O FUSE foi desativado para os diretórios Android/data e Android/obb para melhorar o desempenho dos apps de jogos que dependem desses diretórios.
  • Otimizações, como ajustar as proporções de leitura antecipada e suja do sistema de arquivos FUSE para manter o desempenho das leituras e a reprodução de mídia suave.
  • Usar o cache de gravação de retorno do FUSE.
  • Armazenamento em cache de permissões para reduzir as IPCs no servidor do sistema.
  • Otimizações para apps com acesso a todos os arquivos para agilizar as operações em massa.

Os ajustes de ajuste acima podem produzir um desempenho comparável entre dispositivos FUSE e não FUSE. Por exemplo, o teste de um Pixel 2 ajustado usando o FUSE e um Pixel 2 usando o 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 a performance mais consistente, os desenvolvedores que se preocupam com o desempenho precisam usar as APIs MediaProvider nos apps.

Diminua o impacto no desempenho do FUSE

O impacto na performance do FUSE é limitado a usuários que usam muito arquivos armazenados em armazenamento compartilhado externo. O armazenamento privado externo (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 são usuários leves de armazenamento externo compartilhado geralmente interagem com um conjunto limitado de arquivos (geralmente menos de 100 arquivos). Esses apps se beneficiam das otimizações existentes de operações de leitura e gravação comuns e não têm nenhum impacto de desempenho relacionado ao FUSE no Android 11.

  • Apps que usam muito o armazenamento externo compartilhado geralmente executam operações de arquivos em massa, 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 de arquivos em massa 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 particular externo ou usar APIs em massa na classe ContentProvider para ignorar o FUSE e conseguir 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 em vez de performance

Em dispositivos ajustados para o FUSE, a maioria das jornadas de usuário críticas têm o mesmo desempenho no Android 10 e no Android 11. No entanto, ao testar comparativos em um conjunto de operações de arquivos, o Android 11 pode ter um desempenho pior do que o Android 10. Para padrões de acesso a arquivos que têm um desempenho pior no Android 11 (por exemplo, leituras ou gravações aleatórias), recomendamos o uso de APIs MediaProvider para oferecer aos apps um modo de acesso não FUSE, que é a melhor opção e performance consistente.

Atualizações do MediaProvider e do FUSE

O comportamento do componente do sistema MediaProvider difere entre as versões do Android.

  • No Android 10 e 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 que verificasse o arquivo e o registrasse 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. Dessa forma, o sistema de arquivos no armazenamento externo e o banco de dados do MediaProvider permanecem consistentes. Como gerenciador 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 estejam protegidas pela privacidade.

No Android 11 e versões mais recentes, o MediaProvider também é um componente do sistema modular (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 enviados pela Google Play Store ou por outros mecanismos fornecidos pelo parceiro. Qualquer coisa no escopo do que é esperado de um gerenciador FUSE também pode ser atualizado, permitindo que as atualizações corrijam regressões de desempenho e bugs do FUSE.