The Android Developer Challenge is back! Submit your idea before December 2.

Local da instalação do aplicativo

A partir da API de nível 8, 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 do manifesto android:installLocation. 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 sem uma preferência para o local de instalação. 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 instalado 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 é 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 por meio das configurações do sistema.

Aviso: quando o usuário ativa o armazenamento em massa de USB para compartilhar arquivos com um computador ou desconecta o cartão SD por meio das configurações do sistema, o armazenamento externo é desconectado do dispositivo e todos os aplicativos em execução nesse armazenamento 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 na API de nível 8 (Android 2.2) ou versões superiores. Os aplicativos existentes que foram criados antes da API de nível 8 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 inferior a 8, você poderá escolher o suporte a esse recurso para dispositivos com API de nível 8 ou versões superiores e ainda ser compatível com dispositivos que usem uma API de nível inferior a esse.

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

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

Quando o aplicativo é instalado em um dispositivo com API inferior a 8, o atributo android:installLocation é ignorado e o aplicativo é instalado no armazenamento interno.

Atenção: embora marcações XML como essas sejam ignoradas por plataformas mais antigas, tome cuidado para não usar APIs de programação introduzidas na API de nível 8 quando minSdkVersion for inferior a "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 em massa de USB 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 no intent de transmissão ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, que notifica todos os aplicativos não instalados no armazenamento externo quando os aplicativos instalados nesse tipo de armazenamento são disponibilizados 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 novamente todos os alarmes quando o armazenamento externo é reconectado.
Mecanismos do método de entrada
O IME 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 de 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 do aplicativo
O Widget do aplicativo será removido da tela inicial. Quando o armazenamento externo for reconectado, o widget do aplicativo 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 AccountManager desaparecerão até o armazenamento externo ser reconectado.
Adaptadores de sincronização
O AbstractThreadedSyncAdapter e todas as funcionalidades de sincronização não funcionarão até que o armazenamento externo seja reconectado.
Administradores do dispositivo
O DeviceAdminReceiver e todos os recursos de administração serão desativados. Isso pode ter consequências imprevisíveis para a funcionalidade do dispositivo, e elas podem persistir após o armazenamento externo ser reconectado.
Detecção de "inicialização concluída" pelos 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 poderá nunca 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 o aplicativo nunca deverá ser instalado no armazenamento externo, deixe isso claro por meio da declaração android:installLocation com um valor de "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 de lembrete para você e aos outros desenvolvedores sobre essa decisão tomada.

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 mais permitem a instalação em 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 efeito visível no momento em que o armazenamento é novamente disponibilizado 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 podem economizar espaço no armazenamento interno.

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