Armazenamento com escopo

O armazenamento com escopo limita o acesso dos apps ao armazenamento externo. No Android 11 ou versões mais recentes, os apps destinados à API 30 ou mais recente precisam usar o armazenamento com escopo. Antes, no Android 10, os apps podiam desativar o armazenamento com escopo.

Restrições de acesso do app

O objetivo do armazenamento com escopo é proteger a privacidade dos dados do app e do usuário. Isso inclui proteger informações do usuário (como metadados de fotos), impedir que os apps modifiquem ou excluam arquivos do usuário sem permissão explícita e proteger documentos confidenciais 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 (exceções concedidas à Galeria do sistema e aos apps qualificados para acesso a todos os arquivos)
  • Nenhum 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 Filesystem in Userspace (FUSE), que permite que o módulo MediaProvider examine operações de arquivo no espaço do usuário e controle o acesso a arquivos com base na política para permitir, negar, ou ocultar 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 aplicou regras de armazenamento com escopo em acessos de arquivo pelo MediaProvider, mas não para acesso direto ao caminho do arquivo (por exemplo, usando a API File e APIs NDK) devido ao esforço necessário para interceptar chamadas do kernel. Como resultado, os apps no armazenamento com escopo não conseguiam 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 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:

  • O lançamento com o Android 11 ou versões mais recentes usando o kernel 5.4 ou mais recente não pode usar o SDCardFS.
  • A atualização para o Android 11 ou versões mais recentes pode hospedar o FUSE no 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 bem testada do 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 e Android/obb para melhorar o desempenho de 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 as leituras com bom desempenho e a reprodução de mídia sem problemas.
  • Usar o cache de gravação do FUSE.
  • Permissões de armazenamento em cache para reduzir IPCs no servidor do sistema.
  • Otimizações para apps com acesso a todos os arquivos para acelerar as operações em massa.

Os ajustes acima podem produzir 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 a Media Store encontrou desempenho de leitura sequencial comparável (por exemplo, reprodução de vídeo) entre o acesso ao caminho do arquivo e a 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 as APIs MediaProvider para os apps.

Reduzir o impacto de desempenho do FUSE

O impacto de desempenho do FUSE é limitado a usuários pesados de arquivos armazenados apenas no armazenamento compartilhado externo. O armazenamento privado externo (que inclui 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 no FUSE.

  • Os apps que são usuários leves de armazenamento externo compartilhado geralmente interagem com um conjunto limitado de arquivos (normalmente menos de 100 arquivos). Esses apps se beneficiam das otimizações atuais de operações comuns de leitura e gravação e não devem ter nenhum impacto de desempenho relacionado ao FUSE no Android 11.

  • Os apps que são usuários pesados de armazenamento externo compartilhado normalmente realizam operações de arquivo em massa, como listar ou remover um diretório com 1.000 arquivos ou criar ou excluir um diretório com um milhão de arquivos no sistema de arquivos. As operações de arquivo em massa podem ser afetadas pelo FUSE no Android 11, mas, se esses apps forem qualificados para a permissão MANAGE_EXTERNAL_STORAGE, eles se beneficiarão 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 no armazenamento privado externo ou usar APIs em massa na classe ContentProvider para ignorar o FUSE e receber 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 desempenho

Em dispositivos ajustados para o FUSE, a maioria das jornadas críticas do usuário tem o mesmo desempenho entre o Android 10 e o Android 11. No entanto, ao testar benchmarks em um conjunto de operações de arquivo, 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 tem desempenho 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 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 torna o gerenciador do sistema de arquivos (para FUSE) para armazenamento externo. Dessa forma, o banco de dados do armazenamento externo e do MediaProvider permanecem consistentes. Como o 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 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 pela rede na Google Play Store ou em outros mecanismos fornecidos por parceiros. Qualquer coisa no escopo do que é esperado de um gerenciador de FUSE também pode ser atualizada, permitindo atualizações para corrigir regressões e bugs de desempenho do FUSE.