Armazenar

Ícone 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ídia física, como um cartão SD ou USB, que é para transferência temporária de dados/armazenamento de arquivos. A mídia física pode permanecer com o dispositivo por um longo período de tempo, mas não está vinculada ao dispositivo 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 pela exposição de uma parte do armazenamento interno por meio de uma camada de emulação e está disponível desde o Android 3.0.

A partir do Android 6.0, o Android suporta 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 adotável pode armazenar todos os tipos de dados de aplicativos.

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 externos agora são sintetizados com base na estrutura de diretórios. Isso permite que os aplicativos gerenciem seus diretórios específicos de pacotes no armazenamento externo sem exigir que eles tenham a ampla permissão WRITE_EXTERNAL_STORAGE . Por exemplo, o aplicativo com o nome de pacote com.example.foo agora pode acessar livremente Android/data/com.example.foo/ em dispositivos de armazenamento externos sem permissões. Essas permissões sintetizadas são obtidas envolvendo os dispositivos de armazenamento bruto em um daemon FUSE.

A partir do Android 10, os aplicativos direcionados ao Android 9 e ao padrão inferior para armazenamento herdado podem optar pelo armazenamento isolado. Aplicativos direcionados ao Android 10 e padrão para armazenamento isolado podem desativá-lo temporariamente . Use o atributo de manifesto requestLegacyExternalStorage , que controla o modelo de armazenamento, para alterar o estado padrão.

Como as permissões READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE têm restrição flexível, se o instalador não colocou o aplicativo na lista de permissões, a permissão controla o acesso apenas às coleções sonoras e visuais, sem acesso ao cartão SD. Isso se aplica mesmo se o aplicativo solicitar armazenamento herdado. Para obter 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 colocou a permissão na lista de permissões, um aplicativo em execução no modo herdado obtém o comportamento de permissão não isolada. A permissão controla o acesso ao cartão SD e as coleções sonoras e visuais. Isso acontece quando o aplicativo é direcionado ao Android 9 ou inferior e não ativa o armazenamento isolado, ou é direcionado ao Android 10 e é desativado.

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

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

O Android 13 apresenta permissões granulares de mídia para dar suporte a aplicativos que acessam arquivos de mídia criados por outros aplicativos. Os aplicativos devem solicitar uma ou mais permissões granulares de mídia listadas em Permissões granulares de mídia , em vez da permissão READ_EXTERNAL_STORAGE .

Permissões de tempo de execução

O Android 6.0 apresenta um novo modelo de permissões de tempo de execução em que os aplicativos solicitam recursos quando necessário em tempo de execução. Como o novo modelo inclui as permissões READ/WRITE_EXTERNAL_STORAGE , a plataforma precisa conceder dinamicamente acesso ao armazenamento sem eliminar ou reiniciar aplicativos já em execução. Ele faz isso mantendo três visualizações distintas de todos os dispositivos de armazenamento montados:

  • /mnt/runtime/default é mostrado para aplicativos sem permissões especiais de armazenamento e para o namespace raiz onde adbd e outros componentes do sistema residem.
  • /mnt/runtime/read é mostrado para aplicativos com READ_EXTERNAL_STORAGE (Definir LEGACY_STORAGE para Android 10)
  • /mnt/runtime/write é mostrado para aplicativos com WRITE_EXTERNAL_STORAGE

No momento da bifurcação do Zygote, criamos um namespace de montagem para cada aplicativo em execução e vinculamos a montagem à exibição inicial apropriada no local. Mais tarde, quando as permissões de tempo de execução são concedidas, vold salta para o namespace mount de aplicativos já em execução e vincula a montagem da exibição atualizada no lugar. Observe que os downgrades de permissão sempre resultam na eliminação do aplicativo.

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