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 queadbd
e outros componentes do sistema estão armazenados. /mnt/runtime/read
é mostrado para apps comREAD_EXTERNAL_STORAGE
(definirLEGACY_STORAGE
para o Android 10)- O app
/mnt/runtime/write
é mostrado para apps comWRITE_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.