Local da instalação do aplicativo

A partir do nível 8 da API, você pode permitir que seu aplicativo seja instalado no armazenamento externo (por exemplo, no cartão SD do dispositivo). Esse é um recurso opcional que pode ser declarado ao aplicativo com o atributo android:installLocation do manifesto. Se você não declarar esse atributo, o aplicativo será instalado somente no armazenamento interno e não poderá ser movido para o armazenamento externo.

Para permitir que o sistema instale o aplicativo no armazenamento externo, modifique o arquivo de manifesto para incluir o atributo android:installLocation no elemento <manifest> com um valor "preferExternal" ou "auto". Por exemplo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

Ao declarar "preferExternal", você solicita que o aplicativo seja instalado no armazenamento externo, mas o sistema não garante que isso ocorrerá. Se o armazenamento externo estiver cheio, o sistema instalará o aplicativo no armazenamento interno. O usuário também poderá mover o aplicativo entre os dois locais.

Ao declarar "auto", você indica que o aplicativo pode ser instalado no armazenamento externo, mas não há um local de instalação preferido. O sistema decidirá onde instalar o aplicativo com base em vários fatores. O usuário também poderá mover o aplicativo entre os dois locais.

Quando o aplicativo está instalado no armazenamento externo:

  • O desempenho do aplicativo não é afetado, desde que o armazenamento externo esteja montado no dispositivo.
  • O arquivo .apk é salvo no armazenamento externo, mas todos os dados particulares do usuário, bancos de dados, arquivos .dex otimizados e códigos nativos extraídos serão salvos na memória interna do dispositivo.
  • O contêiner exclusivo onde o aplicativo está armazenado é criptografado com uma chave gerada de forma aleatória, que pode ser descriptografada somente pelo dispositivo que a instalou originalmente. Assim o aplicativo instalado em um cartão SD funciona somente em um dispositivo.
  • O usuário pode mover o aplicativo para o armazenamento interno nas configurações do sistema.

Aviso: quando o usuário ativa o armazenamento USB em massa para compartilhar arquivos com um computador ou desconectar o cartão SD usando as configurações do sistema, o armazenamento externo será desconectado do dispositivo e de todos os aplicativos em execução no armazenamento externo são eliminados imediatamente.

Compatibilidade com versões anteriores

A capacidade de instalação do aplicativo no armazenamento externo é um recurso disponível somente em dispositivos que operam no nível 8 da API (Android 2.2) ou versões mais recentes. Os aplicativos existentes que foram criados antes do nível 8 da API serão sempre instalados no armazenamento interno e não podem ser movidos para o armazenamento externo (mesmo em dispositivos com API de nível 8). No entanto, caso seu aplicativo seja projetado para ser compatível com uma API de nível anterior a 8, você poderá escolher o suporte a esse recurso para dispositivos com API de nível 8 ou versões mais recentes e ainda ser compatível com dispositivos que usem uma API de nível anterior a esse.

Para permitir a instalação no armazenamento externo e manter a compatibilidade com versões anteriores ao nível 8 da API, realize os procedimentos a seguir:

  1. Inclua o atributo android:installLocation com um valor "auto" ou "preferExternal" no elemento <manifest>.
  2. Deixe seu atributo android:minSdkVersion como está (algo menor que "8") e verifique se o código do aplicativo usa apenas APIs compatíveis com esse nível.
  3. Para compilar o aplicativo, altere o destino da versão para a API de nível 8. Isso é necessário porque bibliotecas mais antigas do Android não entendem o atributo android:installLocation e não vão compilar o aplicativo quando ele estiver presente.

Quando o aplicativo for instalado em um dispositivo com o nível da API menor que 8, o atributo android:installLocation será ignorado e o aplicativo será instalado no armazenamento interno.

Cuidado: embora marcações XML como essas sejam ignoradas por plataformas mais antigas, tome cuidado para não usar APIs de programação introduzidas no nível 8 da API quando minSdkVersion for menor que "8", a menos que você faça o trabalho necessário para fornecer compatibilidade com versões anteriores no seu código.

Aplicativos que NÃO podem ser instalados no armazenamento externo

Quando o usuário ativa o armazenamento USB em massa para compartilhar arquivos com o computador (ou ao desconectar ou remover o armazenamento externo), qualquer aplicativo instalado no armazenamento externo em execução no momento será eliminado. O sistema efetivamente desconhecerá o aplicativo até que o armazenamento em massa seja desativado e o armazenamento externo seja reconectado ao dispositivo. Além de eliminar o aplicativo e torná-lo indisponível ao usuário, isso pode causar falhas mais graves a alguns tipos de aplicativos. Para que o aplicativo se comporte consistentemente da maneira esperada, não permita que ele seja instalado no armazenamento externo caso ele use algum dos recursos a seguir, devido às consequências citadas quando o armazenamento externo é desconectado:

Serviços
Seu Service em execução é eliminado e não é reiniciado quando o armazenamento externo é reconectado. Os aplicativos vinculados a esse serviço podem ser registrados na intent de transmissão ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, que notifica todos os aplicativos não instalados no armazenamento externo quando os aplicativos instalados no armazenamento externo ficam disponíveis novamente no sistema. Após receber essa transmissão, os aplicativos podem tentar se vincular ao serviço.
Serviços de alarme
Os alarmes registrados com AlarmManager serão cancelados. Você precisa registrar manualmente todos os alarmes novamente quando o armazenamento externo é reconectado.
Mecanismos do método de entrada
O IME (editor de método de entrada, na sigla em inglês) será substituído pelo IME padrão. Quando o armazenamento externo é reconectado, o usuário pode abrir as configurações do sistema para ativar novamente o IME.
Planos fundo interativos
O Plano de fundo interativo em execução será substituído pelo plano de fundo interativo padrão. Quando o armazenamento externo é reconectado, o usuário pode selecionar novamente o plano de fundo interativo.
Widgets de apps
O widget do app será removido da tela inicial. Quando o armazenamento externo for reconectado, o widget do app não será disponibilizado para o usuário selecionar até que o sistema redefina o aplicativo inicial (normalmente somente após a reinicialização).
Gerentes de contas
As contas criadas com o AccountManager desaparecerão até o armazenamento externo ser reconectado.
Adaptadores de sincronização
O AbstractThreadedSyncAdapter e todas as funcionalidades de sincronização dele não vão funcionar até que o armazenamento externo seja reconectado.
Administradores do dispositivo
O DeviceAdminReceiver e todos os recursos de administração dele vão ser desativados, o que pode ter consequências imprevisíveis para a funcionalidade do dispositivo e que podem persistir após o armazenamento externo ser reconectado.
Detecção de "inicialização concluída" por broadcast receivers
O sistema entrega a transmissão ACTION_BOOT_COMPLETED antes que o armazenamento externo seja conectado ao dispositivo. Se o aplicativo estiver instalado no armazenamento externo, ele nunca poderá receber essa transmissão.

Caso o aplicativo use algum dos recursos listados abaixo, não permita que ele seja instalado no armazenamento externo. Por padrão, o sistema não permitirá que o aplicativo seja instalado no armazenamento externo. Assim não é necessário se preocupar com os aplicativos existentes. No entanto, se você tiver certeza de que seu aplicativo nunca deverá ser instalado no armazenamento externo, deixe isso claro na declaração android:installLocation com o valor "internalOnly". Embora isso não mude o comportamento padrão, fica explicitamente declarado que o aplicativo deverá ser instalado somente no armazenamento interno, além de servir como lembrete para você e outros desenvolvedores sobre essa decisão.

Aplicativos que podem ser instalados no armazenamento externo

Em termos simples, qualquer aplicativo que não use os recursos listados na seção anterior pode ser instalado de forma segura no armazenamento externo. Jogos grandes normalmente são os tipos de aplicativos que permitem a instalação no armazenamento externo, uma vez que não costumam fornecer serviços adicionais quando estão inativos. Quando o armazenamento externo fica indisponível e um processo do jogo é eliminado, não costuma haver um efeito visível no momento que o armazenamento fica disponível novamente e o usuário reinicia o jogo (supondo que o jogo tenha salvado o estado corretamente durante o ciclo de vida da atividade normal).

Caso seu aplicativo exija vários megabytes para o arquivo APK, considere cuidadosamente ativar a instalação do aplicativo no armazenamento externo. Assim, os usuários poderão economizar espaço no armazenamento interno.

Para ver mais informações relacionadas, consulte: <manifest>