Reduzir o tamanho do app instantâneo

Basta tocar em um link da Web para que o Google Play Instant ofereça experiências ricas e nativas. As pessoas podem usar seu app sem fazer a instalação de imediato, o que aumenta o nível e a qualidade do engajamento. No entanto, para fazer com que um app instantâneo seja carregado com a mesma velocidade de uma página da Web comum para dispositivos móveis, é necessário criar um app instantâneo eficiente e bem estruturado. Quanto menor o binário do app instantâneo, mais rapidamente ele será carregado e mais positiva será a experiência do usuário.

Este documento apresenta as práticas recomendadas para gerenciar o tamanho do binário e a estrutura do app, a fim de proporcionar uma excelente experiência de app instantâneo. Você também pode usar essas mesmas práticas para melhorar seu app instalável.

Refatorar em vários módulos de recursos

A maior melhoria do tamanho do binário do app ocorre ao refatorar o app em vários módulos de recursos. Comece com um módulo de recursos base e depois extraia fluxos de trabalho de temas relacionados para os próprios módulos de recursos deles. Atribua uma atividade inicial e um URL exclusivo a cada módulo de recurso para que os usuários possam concluir o fluxo de trabalho do módulo.

Ao criar módulos de recursos, mantenha o módulo de recursos base o menor possível. Em especial, preste muita atenção às partes do app que exigem acesso às suas bibliotecas dependentes. Se só um módulo de recurso usar determinada biblioteca, importe-a para o módulo de recurso, não para o módulo de recursos base. Lembre-se de que, para lançar um app instantâneo para um módulo de recurso específico, o tamanho total desse módulo e do módulo de recursos base precisa ser inferior a 15 MB.

Práticas recomendadas

Ao refatorar seu app, lembre-se das práticas recomendadas a seguir:

Usar o mesmo codebase para os dois tipos de app
É possível simplificar o processo de gerenciamento de projeto do app usando a mesma base de código modular para criar ambos os apps instalados e instantâneos.
Projetar para vários módulos de recursos
Mesmo que seu app tenha apenas um fluxo de trabalho e exija apenas um módulo de recurso por enquanto, ainda é recomendável projetá-lo para vários módulos de recursos. Dessa forma, você pode adicionar módulos existentes ao app sem afetar o tamanho original do módulo de recurso.
Não se atenha ao limite do tamanho do módulo de recurso no início
Os limites de tamanho do módulo de recurso não são válidos para binários criados localmente. Você também pode lançar um app instantâneo por meio da faixa de teste interno, que impõe um limite de 15 MB para os tamanhos dos módulos de recursos. Somente as faixas Alfa e de produção impõem o limite de 15 MB.

Atualizar recursos do app

Alguns apps, especialmente aqueles que têm históricos de codebase mais longos, contêm recursos que os binários do app não usam mais. Ao procurar maneiras de tornar os módulos do app menores, considere as fontes comuns de código desnecessário apresentadas a seguir.

Reduzir o tamanho do arquivo de imagens

Você pode reduzir significativamente o tamanho total dos drawables do app usando o formato de arquivo WebP em vez de PNG. O Google Play Instant oferece suporte completo para WebP, incluindo transparência e compactação sem perdas, para que a qualidade da imagem permaneça a mesma.

Se possível, remova todos os requisitos de compatibilidade com versões anteriores que exijam o uso de outras imagens PNG. Se você precisa usar imagens PNG, coloque-as no módulo usado para criar e instalar o app.

Remover idiomas não utilizados

Se o app é compatível com vários idiomas, reduza o máximo possível de recursos localizados. Esta etapa é particularmente útil se você usa uma biblioteca "app compat", como android.support.v7.appcompat. Essa biblioteca inclui mensagens em vários idiomas e alguns deles podem não ser compatíveis com seu app.

Para saber mais, consulte Remover recursos alternativos não utilizados, principalmente idiomas.

Remover arquivos extras

É possível que seu app não use mais alguns dos recursos que foram importados para o projeto. Para ajudar a remover esses recursos, o Android Studio usa uma verificação Lint para essa situação específica. Para usar a ferramenta, siga estas etapas:

  1. Pressione Control+Alt+Shift+I (Command+Alt+Shift+I no Mac OS).
  2. Na caixa de diálogo exibida, digite "unused resources".
  3. Selecione a opção Unused resources para iniciar o processo de inspeção de uso de recursos.

Se algum recurso grande permanecer, verifique se é possível desagrupá-lo do app e fazer o download dele na forma de arquivo autônomo depois que o usuário começar a interagir com o app. Em geral, esse tipo de adiamento de carregamento de imagem exige uma mudança no código, mas pode reduzir significativamente o tamanho do arquivo do app instantâneo, fazendo o download somente dos recursos explicitamente solicitados pelo usuário.

Remover bibliotecas não utilizadas

À medida que o escopo do app aumenta, ele pode assumir um número surpreendente de dependências, principalmente de um dos tipos a seguir:

  • Bibliotecas nativas: bibliotecas que contêm código nativo que seu app instantâneo nunca executa.
  • Dependências transitivas: bibliotecas de que as bibliotecas importadas do seu app dependem.

O Android Studio tem várias ferramentas úteis para identificar dependências irrelevantes no projeto do app:

Bibliotecas externas

A visualização Project do Android Studio inclui a seção External Libraries.

Essa seção contém todas as bibliotecas que seu app usa, incluindo código nativo e todas as dependências transitivas. Nessa visualização, procure bibliotecas duplicadas ou não utilizadas de que o app não precisa.

APK Analyzer

Use a ferramenta APK Analyzer para comparar builds diferentes, inclusive builds de app instantâneo.

Depois de determinar quais bibliotecas não são necessárias, exclua-as adicionando linhas semelhantes à seguinte ao arquivo de compilação do Gradle:

<feature_module>/build.gradle

Groovy

dependencies {
    implementation('some-important-but-large-library') {
        exclude group: 'com.example.imgtools', module: 'native'
    }
}

Kotlin

dependencies {
    implementation('some-important-but-large-library') {
        exclude(group = "com.example.imgtools", module = "native")
    }
}

Para ver mais informações sobre como reduzir o tamanho total de importação das dependências do app, consulte o guia do Gradle sobre Gerenciamento de dependências (em inglês).

Implementar entrega de recursos na nuvem

Se for preciso reduzir ainda mais o tamanho, talvez seja necessário confiar na entrega de recursos na nuvem.