Como criar vários APKs para texturas GL diferentes

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 desde o início e evitar ainda mais dores de cabeça desnecessárias no processo de desenvolvimento. Esta lição mostra como criar vários APKs do seu app, cada um com suporte a um subconjunto diferente de formatos de textura OpenGL. Você também vai aprender algumas ferramentas necessárias tornar a manutenção de uma base de código com vários APKs o mais fácil possível.

Confirmar que você precisa de vários APKs

Ao tentar criar um aplicativo que funcione em todos os dispositivos Android é natural, naturalmente você quer que o aplicativo tenha a melhor aparência em cada dispositivo individual, independentemente o fato de nem todos serem compatíveis com o mesmo conjunto de texturas GL. No início, pode parecer que o suporte a vários APKs é a melhor solução, mas muitas vezes não é o caso. A seção Como usar um APK único A seção "Em vez disso" do guia de APKs múltiplos traz algumas informações úteis sobre como fazer isso com um único APK, incluindo como detectar as texturas com suporte formatos no momento da execução. Dependendo da sua situação, pode ser mais fácil agrupar todos os formatos seu aplicativo e basta escolher qual deles usar no ambiente de execução.

Se você puder gerenciá-lo, a limitação de 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 preferências de mercado, comportamento de "upgrades" de um APK para o ou qual APK combina com qual classe de dispositivos

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

Organizar seus requisitos

O Guia do desenvolvedor Android fornece uma referência útil de algumas texturas comuns com suporte em o valor supports-gl-texture . Esta página também contém algumas dicas sobre os telefones (ou famílias de telefones) compatíveis formatos de textura específicos. Geralmente, é recomendável que um dos APKs seja compatível ETC1, já que esse formato de textura tem suporte em todos os dispositivos Android compatíveis com o OpenGL ES Especificação 2.0

Como a maioria dos dispositivos Android oferece suporte a mais de um formato de textura, você precisa estabelecer uma ordem de preferência. Crie um gráfico com todos os formatos que seu aplicativo vai suporte. A célula mais à esquerda terá a menor prioridade (provavelmente será ETC1, uma padrão sólido em termos de desempenho e compatibilidade). Em seguida, coloque cores no gráfico de modo que cada célula representa um APK.

ETC1 ATI PowerVR

Colorir no gráfico faz mais do que apenas tornar este guia menos monocromático: ele também tem uma maneira de facilitando a comunicação dentro da equipe. Agora, basta se referir a cada APK como "azul", "verde" ou "red", em vez de "Aquela que oferece suporte aos formatos de textura ETC1" etc.

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

Seja para modificar um aplicativo Android já existente ou iniciar um do zero, esse é o a primeira coisa que você precisa fazer na base de código e, de longe, a mais importante. Tudo que vai para o projeto da biblioteca só precisa ser atualizada uma vez (por exemplo, strings localizadas em idiomas, temas de cores, bugs corrigidos no código compartilhado), o que melhora o tempo de desenvolvimento e reduz probabilidade de erros que poderiam ter sido facilmente evitados.

Observação: embora a implementação detalha como criar e incluem projetos de biblioteca estão fora do escopo desta aula, você poderá lendo Criar uma biblioteca Android.

Se você estiver convertendo um aplicativo existente para usar o suporte a vários APKs, vasculhe sua base de código para encontrar cada arquivo de string localizado, lista de valores, tema cores, ícones de menu e layout que não serão alterados nos APKs e colocar tudo isso no projeto da biblioteca. Um código que não muda muito deve também vão para o projeto da biblioteca. Você provavelmente acabará estendendo essas para adicionar um ou dois métodos de APK para APK.

Se, por outro lado, você estiver criando o aplicativo do zero, tente escrever código no projeto da biblioteca primeiro, depois só movê-lo para uma APK individual, se necessário. Isso é muito mais fácil de gerenciar a longo prazo do que adicioná-lo. depois outro, depois outro, meses depois tentando descobrir se esse blob pode ser movido para cima à 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 , coloque o projeto da biblioteca e todos os projetos APK relacionados na mesma pasta pai. Cada APK precisa ter o mesmo nome de pacote, mas não necessariamente precisa compartilhar o nome do pacote com a biblioteca. Se você tivesse três APKs seguindo o esquema descrito anteriormente, seu diretório raiz pode ter esta aparência:

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 seu APK projeto. Ter uma atividade inicial definida no projeto da biblioteca dá a você a chance de colocar todas a inicialização do seu aplicativo em um só lugar, para que cada APK não precise reimplementar "universal" tarefas como inicializar o Google Analytics, executar verificações de licenciamento e quaisquer outras 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 no Google Play, a resposta correta O APK a ser usado é escolhido usando algumas regras simples:

  • O manifesto precisa mostrar que determinado APK é qualificado.
  • Dos APKs qualificados, o número de versão mais alto ganha.
  • Se qualquer um dos formatos de textura listados no APK for compatível com o dispositivo no mercado, esse dispositivo é considerado qualificado

Com relação às texturas GL, essa última regra é importante. Significa que você deve, por tenha muito cuidado com o uso de formatos GL diferentes no mesmo aplicativo. Se você usar o PowerVR 99% das vezes, mas usar o ETC1 para, digamos, sua tela de apresentação... Em seguida, o manifesto indicariam suporte para ambos os formatos. Um dispositivo que era compatível apenas com ETC1. seria considerado compatível, o download do app seria feito e o usuário veria uma falha e envio de mensagens. O caso comum é que, se você usar vários APKs especificamente para segmentar diferentes dispositivos com base no suporte a texturas GL, será um formato de textura por APK.

Na verdade, isso torna o suporte a texturas um pouco diferente dos outros dois APKs dimensões, nível de API e tamanho da tela. Todos os dispositivos têm apenas um nível de API e uma tela e cabe ao APK oferecer suporte a vários deles. Com as texturas, o APK geralmente oferece suporte a uma textura e o dispositivo aceita várias. Muitas vezes, haverá sobreposição em termos de dispositivo que oferece suporte a muitos APKs, mas a solução é a mesma: códigos de versão.

Por exemplo, pegue alguns dispositivos e veja quantos dos APKs definidos anteriormente se ajustam a cada dispositivo.

FooPhone Nexus S Evo
ETC1 ETC1 ETC1
PowerVR ATI TC

Supondo que os formatos PowerVR e ATI são preferidos sobre ETC1 quando disponível, do de acordo com o "maior número de versão vence" se definirmos o atributo versionCode em cada APK de modo que vermelho ≥ verde ≥ azul, tanto vermelho quanto verde serão sempre escolhidos em vez de azul em compatíveis com elas, e caso surja um dispositivo compatível com vermelho e verde, vermelho será escolhido.

Para manter todos os APKs em "faixas" separadas, é importante ter um bom código de versão esquema. O recomendado pode ser encontrado na área de códigos de versão do nosso guia do desenvolvedor. Como o conjunto de exemplos de APKs lida apenas com uma das três dimensões possíveis, seria suficiente para separe cada APK por 1.000 e incremente a partir daí. O resultado será algo como o seguinte:

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

Juntando tudo isso, seus manifestos do Android provavelmente se pareceriam com o seguinte:

Azul:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

Verde:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

Vermelho:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

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 essas são são especificamente relevantes para vários APKs e de forma alguma representam uma lista de verificação completa para todos os aplicativos sendo enviados ao Google Play.

  • Todos os APKs precisam ter o mesmo nome de pacote.
  • Todos os APKs precisam ser assinados com o mesmo certificado.
  • Verifique se há informações conflitantes nos filtros do manifesto (um APK que só é compatível com cupcake em telas extragrandes não será vista por ninguém)
  • O manifesto de cada APK precisa ser exclusivo em pelo menos um dos tipos de tela, textura OpenGL ou versão da plataforma
  • Tente testar cada APK em pelo menos um dispositivo. Fazendo isso, você tem um dos recursos e emuladores de dispositivos personalizáveis na sua máquina de desenvolvimento. O céu é o limite!

Também vale a pena inspecionar o APK compilado antes de enviar ao mercado para garantir que não haja surpresas que possam esconder seu aplicativo no Google Play. Na verdade, isso é bem simples "aapt" . O Aapt (Android Asset Packaging Tool) é parte do processo de compilação para criação e para empacotar seus aplicativos Android e também é 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 não há valores conflitantes para com suporte a telas e telas compatíveis, e que você não tenha "uses-feature" não intencionais valores que foram adicionadas como resultado de permissões definidas no manifesto. No exemplo acima, o APK será invisível para a maioria dos dispositivos, se não todos.

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 ao navegar pelo Google Play, mas, quando isso acontecer, faça uma última verificação. Faça o download do aplicativo em qualquer dispositivo de teste para verificar se os APKs estão segmentando os dispositivos pretendidos. Parabéns, você terminou!