Criar vários APKs para diferentes tamanhos de tela

Se você publicar seu app no Google Play, será necessário criar e fazer upload de um Android App Bundle. Quando você faz isso, o Google Play gera e exibe automaticamente APKs otimizados para a configuração do dispositivo de cada usuário para que eles façam o download apenas do código e dos recursos necessários para executar o app. A publicação de vários APKs é útil se você não está publicando no Google Play, mas precisa criar, assinar e gerenciar cada APK.

Ao desenvolver seu aplicativo Android para aproveitar vários APKs no Google Play, é importante adotar algumas práticas recomendadas desde o início e evitar dores de cabeça desnecessárias no processo de desenvolvimento. Esta lição mostra como criar vários APKs do seu app, cada um cobrindo uma classe diferente de tamanho de tela. Você também ganhará algumas ferramentas necessárias para facilitar ao máximo a manutenção de várias bases de código de APK.

Confirmar que você precisa de vários APKs

Ao tentar criar um app que funcione em vários tamanhos de dispositivos Android, é claro que você quer que seu app aproveite todo o espaço disponível em dispositivos maiores, sem sacrificar a compatibilidade ou a usabilidade em telas menores. No início, pode parecer que o suporte a vários APKs é a melhor solução, mas esse geralmente não é o caso. A seção Como usar um único APK em vez do guia para desenvolvedores com vários APKs inclui algumas informações úteis sobre como fazer isso com um único APK, incluindo o uso da nossa Biblioteca de Suporte. Leia também o guia sobre Suporte a várias telas e há até mesmo uma Biblioteca de Suporte que pode ser transferida por download usando o SDK do Android, que permite usar fragmentos em dispositivos anteriores ao Hooneycomb (facilitando a compatibilidade com várias telas em um único APK).

Se possível, a limitação do seu aplicativo a um único APK tem várias vantagens, incluindo:

  • É mais fácil fazer publicações e testes.
  • Há apenas um codebase para manter.
  • Seu aplicativo pode se adaptar às mudanças de configuração do dispositivo.
  • A restauração de apps é funcional em vários dispositivos.
  • Você não precisa se preocupar com a preferência de mercado, o comportamento de "upgrades" de um APK para o outro ou qual APK combina com qual classe de dispositivos

O restante desta lição pressupõe que você pesquisou o assunto, absorveu cuidadosamente o material nos recursos vinculados e determinou que vários APKs são o caminho certo para seu aplicativo.

Organizar seus requisitos

Comece criando um gráfico simples para determinar rapidamente de quantos APKs você precisa e os tamanhos de tela de cada APK. Felizmente, é fácil mapear seus requisitos de maneira rápida e fácil e ter uma referência para uso posterior. Comece com uma linha de células que representa os diversos tamanhos de tela disponíveis na plataforma Android.

pequeno normal grande extra grande

Agora, basta colorir o gráfico de forma que cada cor represente um APK. Veja um exemplo de como aplicar cada APK a um determinado intervalo de tamanhos de tela.

pequeno normal grande extra grande

Dependendo das suas necessidades, você também pode ter dois APKs: "pequeno e todo o restante" ou "extra grande e todo o mais". Colorir o gráfico também facilita a comunicação dentro da equipe. Agora, você pode simplesmente se referir a cada APK como "azul", "verde" ou "vermelho", independentemente de quantos tipos de tela diferentes ele abrange.

Colocar todos os códigos e recursos comuns em um projeto de biblioteca

Não importa se você está modificando um app Android já existente ou iniciando um do zero, essa é a primeira coisa que você precisa fazer na base de código e, de longe, a mais importante. Tudo que entra no projeto da biblioteca só precisa ser atualizado uma vez (pense em strings localizadas por idioma, temas de cores, bugs corrigidos no código compartilhado), o que melhora o tempo de desenvolvimento e reduz a probabilidade de erros que poderiam ser facilmente evitados.

Observação:embora os detalhes de implementação de como criar e incluir projetos de biblioteca estejam além do escopo desta lição, leia Criar uma biblioteca Android para começar.

Se você estiver convertendo um aplicativo existente para usar a compatibilidade com vários APKs, limpe a base de código para cada arquivo de string localizado, lista de valores, cores de tema, ícones de menu e layout que não vão mudar nos APKs e coloque tudo no projeto da biblioteca. O código que não vai mudar muito também precisa ser incluído no projeto da biblioteca. Você provavelmente vai ampliar essas classes para adicionar um ou dois métodos de APK para APK.

Se, por outro lado, você estiver criando o aplicativo do zero, tente escrever o código o máximo possível no projeto de biblioteca primeiro e, em seguida, mova-o apenas para um APK individual, se necessário. É muito mais fácil gerenciar isso a longo prazo do que adicioná-lo a um, depois outro, depois outro e meses depois tentar descobrir se esse blob pode ser movido para a seção da biblioteca sem estragar nada.

Criar novos projetos de APK

Haverá um projeto Android diferente para cada APK que você gerará. Para facilitar a organização, coloque o projeto de biblioteca e todos os projetos de APK relacionados na mesma pasta mãe. Além disso, cada APK precisa ter o mesmo nome de pacote, embora não precise compartilhar o nome do pacote com a biblioteca. Se você tivesse três APKs seguindo o esquema descrito anteriormente, seu diretório raiz seria parecido com este:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Depois que os projetos forem criados, adicione o projeto da biblioteca como referência para cada projeto de APK. Se possível, defina a atividade inicial no projeto da biblioteca e estenda essa atividade no projeto do APK. Ter uma atividade inicial definida no projeto de biblioteca oferece a chance de colocar toda a inicialização do app em um só lugar, para que cada APK não precise reimplementar tarefas "universais" como inicializar o Analytics, executar verificações de licenciamento e quaisquer outros procedimentos de inicialização que não mudam muito de APK para APK.

Ajustar os manifestos

Quando um usuário faz o download de um aplicativo que usa vários APKs pelo Google Play, o APK correto a ser usado é escolhido usando duas regras simples:

  • O manifesto precisa mostrar que determinado APK é qualificado.
  • Dos APKs qualificados, o número de versão mais alto ganha.

Como exemplo, vamos usar o conjunto de vários APKs descritos anteriormente e presumir que cada APK foi configurado para oferecer suporte a todos os tamanhos de tela maiores que o tamanho "de destino". Tomados individualmente, o possível intervalo de cada APK seria assim:

pequeno normal grande extra grande
pequeno normal grande extra grande
pequeno normal grande extra grande

No entanto, ao usar a regra "o maior número de versão vence", se definirmos o atributo versionCode em cada APK de modo que vermelho ≥ verde ≥ azul, o gráfico será recolhido assim:

pequeno normal grande extra grande

Agora, vamos supor que o APK vermelho tem alguns requisitos que os outros dois não têm. A página Filtros no Google Play do Guia para desenvolvedores Android tem uma lista de possíveis culpados. Por exemplo, vamos supor que o vermelho exija uma câmera frontal. Na verdade, o objetivo do APK vermelho é usar o espaço extra na tela disponível para entretenimento com a câmera frontal. No entanto, nem todos os dispositivos muito grandes TEM câmeras frontais. Ah, não!

Felizmente, se um usuário estiver navegando no Google Play em um desses dispositivos, o Google Play analisará o manifesto, verá que o vermelho lista a câmera frontal como requisito e o ignorará silenciosamente, após determinar que o vermelho e esse dispositivo não são um par perfeito. Ele verá que o verde não é compatível apenas com dispositivos extra grandes, mas também não se importa se há ou não uma câmera frontal. O usuário ainda pode fazer o download do app no Google Play porque, apesar de todo o contratempo com a câmera frontal, havia um APK compatível com esse tamanho específico de tela.

Para manter todos os seus APKs em "faixas" separadas, é importante ter um bom esquema de código de versão. O recomendado pode ser encontrado na área de Códigos de versão do nosso guia para desenvolvedores. Como o conjunto de exemplos de APKs só lida com uma das três dimensões possíveis, seria suficiente separar cada APK por 1.000 e incrementar a partir desse ponto. Ela pode ter esta aparência:

Azul: 1001, 1002, 1003, 1004…
Verde: 2001, 2002, 2003, 2004...
Vermelho:3001, 3002, 3003, 3004...

Juntando tudo isso, os manifestos do Android provavelmente teriam esta aparência:

Azul:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Verde:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Vermelho:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Tecnicamente, vários APKs funcionam com a tag "supports-screens" ou com a tag "compatible-screens". Geralmente, é preferível oferecer suporte a telas, e geralmente é uma péssima ideia usar as duas tags no mesmo manifesto. Isso torna as coisas desnecessariamente complicadas e aumenta a oportunidade de erros. Observe também que, em vez de aproveitar os valores padrão (pequeno e normal são sempre verdadeiros por padrão), os manifestos definem explicitamente o valor para cada tamanho de tela. Isso evitará dores de cabeça futuras. Por exemplo, um manifesto com um SDK de destino anterior a 9 vai ter o extra grande automaticamente definido como falso, já que esse tamanho ainda não existia. Por isso, seja explícito.

Analisar a lista de verificação de pré-lançamento

Antes de fazer upload para o Google Play, verifique os itens a seguir. Lembre-se de que eles são especificamente relevantes para vários APKs e não representam uma lista de verificação completa para todos os aplicativos enviados ao Google Play.

  • Todos os APKs precisam ter o mesmo nome de pacote.
  • Todos os APKs precisam ser assinados com o mesmo certificado.
  • No manifesto, defina como verdadeiro cada tamanho de tela que você quer que seja compatível com o APK. Defina como "false" cada tamanho de tela que você quiser evitar
  • Verifique se há informações conflitantes nos filtros de manifesto. Um APK que só oferece suporte ao cupcake em telas extragrandes não é visto por ninguém.
  • Cada manifesto do APK precisa ser exclusivo em pelo menos um dos tipos de tela, textura OpenGL ou versão da plataforma compatível.
  • Tente testar cada APK em pelo menos um dispositivo. Fazendo isso, você terá um dos emuladores de dispositivos mais personalizáveis do mercado na sua máquina de desenvolvimento. O céu é o limite!

Também vale a pena inspecionar o APK compilado antes de enviá-lo ao mercado para garantir que não haja surpresas que possam ocultar seu aplicativo no Google Play. Na verdade, é bem simples usar a ferramenta "aapt". O Aapt (Android Asset Packaging Tool) faz parte do processo de build para criação e empacotamento de apps Android, além de ser uma ferramenta muito útil para inspecioná-los.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Ao examinar a saída aapt, verifique se você não tem valores conflitantes para supports-screens e compatíveis-telas e se não tem valores "uses-feature" não intencionais adicionados como resultado de permissões definidas no manifesto. No exemplo acima, o APK será invisível para a maioria, se não todos os dispositivos.

Por quê? Ao adicionar a permissão SEND_SMS necessária, o requisito de recurso de android.hardware.telephony é adicionado implicitamente. Como a maioria dos dispositivos extra grandes (se não todos) são tablets sem hardware de telefonia, o Google Play filtrará esse APK nesses casos até que apareçam novos dispositivos grandes o suficiente para informar um tamanho de tela extra grande e que tenham hardware de telefonia.

Felizmente, isso é facilmente corrigido adicionando o seguinte ao seu manifesto:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

O requisito android.hardware.touchscreen também é adicionado implicitamente. Se você quiser que seu APK fique visível em TVs que não tenham tela touchscreen, adicione o seguinte ao manifesto:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Depois de concluir a lista de verificação de pré-lançamento, faça upload dos seus APKs para o Google Play. Pode demorar um pouco para o aplicativo aparecer durante a navegação no Google Play, mas, quando isso acontecer, faça uma última verificação. Faça o download do aplicativo em qualquer dispositivo de teste para garantir que os APKs sejam direcionados aos dispositivos pretendidos.

Para saber mais sobre a publicação de vários APKs no Google Play, leia Suporte a vários APKs.