O Android oferece suporte a dispositivos com armazenamento tradicional, que é definido como um sistema de arquivos que não diferencia maiúsculas de minúsculas com classes e modos de permissão POSIX imutáveis. A noção de armazenamento tradicional abrange armazenamento emulado e portátil. O armazenamento portátil é definido como qualquer armazenamento externo que não seja adotado pelo sistema e, portanto, não formatado e criptografado ou vinculado a um dispositivo específico. Como o armazenamento externo tradicional oferece proteção mínima para dados armazenados, o código do sistema não deve armazenar dados confidenciais no armazenamento externo. Especificamente, os arquivos de configuração e log devem ser armazenados apenas no armazenamento interno, onde podem ser protegidos de forma eficaz.
Armazenamento externo multiusuário
A partir do Android 4.2, os dispositivos podem ser compatíveis com vários usuários, e o armazenamento externo deve atender às seguintes restrições:
- Cada usuário deve ter seu próprio armazenamento externo primário isolado e não deve ter acesso ao armazenamento externo primário de outros usuários.
- O caminho
/sdcard
deve ser resolvido para o armazenamento externo primário específico do usuário correto com base no usuário com o qual um processo está sendo executado. - O armazenamento de arquivos OBB grandes no diretório
Android/obb
pode ser compartilhado entre vários usuários como uma otimização. - O armazenamento externo secundário não deve ser gravável por aplicativos, exceto em diretórios específicos do pacote, conforme permitido pelas permissões sintetizadas.
A implementação da plataforma padrão desse recurso aproveita os namespaces do kernel Linux para criar tabelas de montagem isoladas para cada processo bifurcado do Zygote e, em seguida, usa montagens de ligação para oferecer o armazenamento externo primário específico do usuário correto nesse namespace privado.
Na inicialização, o sistema monta um único daemon FUSE de armazenamento externo emulado em EMULATED_STORAGE_SOURCE
, que está oculto dos aplicativos. Após as bifurcações do Zygote, ele monta o subdiretório específico do usuário apropriado do daemon FUSE para EMULATED_STORAGE_TARGET
para que os caminhos de armazenamento externo sejam resolvidos corretamente para o aplicativo. Como um aplicativo não possui pontos de montagem acessíveis para o armazenamento de outros usuários, eles só podem acessar o armazenamento do usuário com o qual foi iniciado.
Essa implementação também usa o recurso de kernel de subárvore compartilhada para propagar eventos de montagem do namespace raiz padrão para namespaces de aplicativos, o que garante que recursos como contêineres ASEC e montagem OBB continuem funcionando corretamente. Ele faz isso montando o rootfs como compartilhado e, em seguida, remontando-o como escravo após a criação de cada namespace Zygote.
Vários dispositivos de armazenamento externo
A partir do Android 4.4, vários dispositivos de armazenamento externo são exibidos aos desenvolvedores por meio de Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
e Context.getObbDirs()
.
A permissão WRITE_EXTERNAL_STORAGE
só deve conceder acesso de gravação ao armazenamento externo primário em um dispositivo. Os aplicativos não devem ter permissão para gravar em dispositivos de armazenamento externo secundários, exceto em seus diretórios específicos do pacote, conforme permitido pelas permissões sintetizadas. Restringir gravações dessa maneira garante que o sistema possa limpar os arquivos quando os aplicativos forem desinstalados.
Suporte de mídia USB
O Android 6.0 oferece suporte a dispositivos de armazenamento portáteis que são conectados ao dispositivo apenas por um curto período de tempo, como unidades flash USB. Quando um usuário insere um novo dispositivo portátil, a plataforma mostra uma notificação para permitir que ele copie ou gerencie o conteúdo desse dispositivo.
No Android 6.0, qualquer dispositivo que não seja adotado é considerado portátil. Como o armazenamento portátil é conectado apenas por um curto período de tempo, a plataforma evita operações pesadas, como varredura de mídia. Aplicativos de terceiros devem passar pelo Storage Access Framework para interagir com arquivos no armazenamento portátil; o acesso direto é explicitamente bloqueado por motivos de privacidade e segurança.