Storage

Ícone do HAL de armazenamento externo do Android

O Android evoluiu ao longo do tempo para oferecer suporte a uma ampla variedade de tipos e recursos de dispositivos de armazenamento. Todas as versões do Android oferecem suporte a dispositivos com armazenamento tradicional, que inclui armazenamento portátil e emulado. O armazenamento portátil pode ser fornecido por mídias físicas, como um cartão SD ou USB, para transferência de dados temporária/ armazenamento de arquivos. A mídia física pode permanecer com o dispositivo por um período mais longo, mas não está vinculada a ele e pode ser removida. Os cartões SD estão disponíveis como armazenamento portátil desde o Android 1.0. O Android 6.0 adicionou suporte a USB. O armazenamento emulado é fornecido expondo uma parte do armazenamento interno por uma camada de emulação e está disponível desde o Android 3.0.

A partir do Android 6.0, o Android oferece suporte ao armazenamento adotável, que é fornecido por mídia física, como um cartão SD ou USB, que é criptografado e formatado para se comportar como armazenamento interno. O armazenamento adaptável pode armazenar todos os tipos de dados do aplicativo.

Permissões

O acesso ao armazenamento externo é protegido por várias permissões do Android. A partir do Android 1.0, o acesso de gravação é protegido com a permissão WRITE_EXTERNAL_STORAGE. A partir do Android 4.1, o acesso de leitura é protegido com a permissão READ_EXTERNAL_STORAGE.

A partir do Android 4.4, o proprietário, o grupo e os modos de arquivos em dispositivos de armazenamento externo agora são sintetizados com base na estrutura de diretórios. Isso permite que os apps gerenciem os diretórios específicos do pacote no armazenamento externo sem necessidade de manter a permissão WRITE_EXTERNAL_STORAGE ampla. Por exemplo, o app com nome de pacote com.example.foo agora pode acessar livremente Android/data/com.example.foo/ em dispositivos de armazenamento externo sem permissões. Essas permissões sintetizadas são alcançadas envolvendo dispositivos de armazenamento bruto em um daemon FUSE.

A partir do Android 10, os apps que segmentam o Android 9 e versões anteriores usam o armazenamento legado por padrão e podem ativar o armazenamento isolado. Os apps que usam o Android 10 e usam o armazenamento isolado por padrão podem desativar esse recurso temporariamente. Use o atributo de manifesto requestLegacyExternalStorage, que controla o modelo de armazenamento, para mudar o estado padrão.

Como as permissões READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE são restritas, se o instalador não adicionar o app à lista de permissões, a permissão vai controlar o acesso apenas às coleções visuais e auditivas, sem acesso ao cartão SD. Isso se aplica mesmo que o app solicite o armazenamento legado. Para mais informações sobre restrições rígidas e flexíveis, consulte Restrições rígidas e flexíveis no Android 10.

Se o instalador autorizar a permissão, um app executado no modo legado receberá o comportamento da permissão não isolada. A permissão controla o acesso ao cartão SD e as coleções auditivas e visuais. Isso acontece quando o app é direcionado ao Android 9 ou versões anteriores e não ativa o armazenamento isolado ou quando é direcionado ao Android 10 e desativa o armazenamento.

O estado da lista de permissões só pode ser especificado no momento da instalação e não pode ser alterado até que o app seja instalado.

Para mais informações sobre como definir a permissão READ_EXTERNAL_STORAGE, consulte setWhitelistedRestrictedPermissions() na classe PackageInstaller.SessionParams.

O Android 13 introduz permissões de mídia granulares para oferecer suporte a apps que acessam arquivos de mídia criados por outros apps. Os apps precisam solicitar uma ou mais das permissões de mídia granulares listadas em Permissões de mídia granulares em vez da permissão READ_EXTERNAL_STORAGE.

O Android 14 se baseia em permissões de mídia granulares para permitir que os usuários concedam acesso parcial à biblioteca de mídia visual quando apps solicitam permissões de mídia. Consulte Permitir acesso parcial a fotos e vídeos para mais informações.

Permissões de execução

O Android 6.0 apresenta um novo modelo de permissões em tempo de execução em que os apps solicitam recursos quando necessário no momento da execução. Como o novo modelo inclui as permissões READ/WRITE_EXTERNAL_STORAGE, a plataforma precisa conceder acesso ao armazenamento dinamicamente sem encerrar ou reiniciar os apps que já estão em execução. Isso é feito ao manter três visualizações distintas de todos os dispositivos de armazenamento montados:

  • O /mnt/runtime/default é mostrado para apps sem permissões de armazenamento especiais e para o namespace raiz em que adbd e outros componentes do sistema estão armazenados.
  • /mnt/runtime/read é mostrado para apps com READ_EXTERNAL_STORAGE (definir LEGACY_STORAGE para o Android 10)
  • O app /mnt/runtime/write é mostrado para apps com WRITE_EXTERNAL_STORAGE

No momento da bifurcação do Zygote, criamos um namespace de montagem para cada app em execução e vinculamos a montagem da visualização inicial apropriada. Mais tarde, quando as permissões de execução são concedidas, vold pula para o namespace de montagem de apps que já estão em execução e vincula a visualização atualizada. Observe que o downgrade de permissões sempre resulta no encerramento do app.

A funcionalidade setns() usada para implementar esse recurso requer pelo menos o Linux 3.8, mas os patches foram enviados de volta com sucesso para o Linux 3.4. O teste CTS PermissionsHostTest pode ser usado para verificar o comportamento correto do kernel.