A Visualização do desenvolvedor para Android 11 já está disponível. Teste e compartilhe seu feedback.

Migrar seu app instantâneo para torná-lo compatível com Android App Bundles

Se você ainda usa o plug-in obsoleto Feature Android Gradle (com.android.feature) nos módulos do Instant Apps Android, precisa migrar para o plug-in de app básico (com.android.application) e para o plug-in Dynamic Feature (com.android.dynamic-feature).

No Plug-in do Android para Gradle 3.3.0 e em versões posteriores, o plug-in de app básico inclui compatibilidade com experiências instantâneas. Ou seja, se o módulo do app básico satisfaz os requisitos para ser uma experiência instantânea, você consegue o benefício automaticamente. Depois disso, é possível incluir mais recursos que podem ser transferidos por download sob demanda como experiências instantâneas usando o plug-in Dynamic Feature. Essa configuração facilita a compatibilidade com uma experiência de app instalado e instantâneo em um único projeto e permite que você se beneficie da publicação com os Android App Bundles.

A tabela a seguir descreve melhor para quais plug-ins você migrará:

Descrição do módulo Plug-in antigo Plug-in atual
O módulo que inclui código, recursos e funcionalidade básicos para sua experiência de app instalado ou instantâneo. com.android.feature (com baseFeature = true) com.android.application

Observação: este módulo inclui todas as informações de manifesto e assinatura necessárias para criar e empacotar seu app como um Android App Bundle ou APK.

Recursos adicionais e modulares que podem ser transferidos por download sob demanda. com.android.feature com.android.dynamic-feature (com dist:instant="true" e dist:onDemand="false" no manifesto do módulo)
Código e recurso de uma funcionalidade disponível apenas para a versão instalada do app. com.android.application com.android.dynamic-feature (com dist:instant="false" e dist:onDemand="false" no manifesto do módulo)

Esta página mostra como migrar seu projeto de app instantâneo existente para criar um Android App Bundle ativado para uso instantâneo. Ela também descreve como criar, testar e publicar um Android App Bundle de uso instantâneo.

Se você estiver criando novas experiências instantâneas para seu app, leia Criar um módulo de recurso dinâmico ativado para instantâneos.

Entender as mudanças

Quando você migra seu projeto para usar o plug-in Dynamic Feature, os Android App Bundles oferecem uma nova maneira de compilar e publicar seu app que simplifica significativamente o processo de distribuição de APKs otimizados para seus usuários.

Os pacotes de apps simplificam a distribuição ao empacotar todos os recursos e o código compilado do seu app para upload, ao mesmo tempo que permitem a geração e a assinatura do APK para o Google Play. O novo modelo de veiculação de apps do Google Play, chamado de Dynamic Delivery, usa seu pacote de apps para gerar e disponibilizar 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 à execução do app. Não é mais necessário criar, assinar e gerenciar vários APKs para ter compatibilidade com diferentes dispositivos. Além disso, os usuários recebem downloads menores e mais otimizados.

Ao usar o plug-in do recurso agora obsoleto, a criação de um app instantâneo exigia a criação de um módulo de recursos base que continha o código compartilhado e os recursos para todos os módulos, incluindo o módulo de app instantâneo. O restante do seu código era incluído em vários módulos de recursos não base, que continham pontos de entrada para suas experiências instantâneas. Para a versão instalada do app, seu projeto podia incluir um módulo de app separado, que continha o código e as atividades necessárias apenas para o app instalado.

Quando você migra seu app para torná-lo compatível com Android App Bundles, o módulo recupera a função do módulo base e você organiza outras experiências instaladas ou instantâneas como módulos de recursos dinâmicos. Ou seja, agora, seu projeto se assemelha mais a um projeto de app padrão, com um módulo base ativado para instantâneo e a capacidade de incluir mais experiências instantâneas modulares.

Para migrar seu projeto de app instantâneo existente e adotar o modelo de distribuição mais otimizado do Android App Bundle, siga as etapas descritas nas próximas seções.

Converter o módulo de recursos base em um módulo de app

Primeiro, você precisa editar o arquivo build.gradle do módulo de recursos base antes de convertê-lo para o módulo principal do app, da seguinte maneira:

  1. Exclua a linha baseFeature true.
  2. Remova todas as dependências que usem as configurações de dependência feature ou application.

    dependencies {
          ...
          // delete any lines that look like
          // feature project(":foo")
          // feature project(":bar")
          // application project(":app")
        }
        
  3. Mova o applicationId, junto com outras configurações de script de compilação que você quer que estejam no módulo base do seu app, do módulo com.android.application atual para o módulo com.android.feature. Veja alguns exemplos abaixo. Nesta etapa, dependendo da sua configuração específica do build.gradle, pode ser mais fácil copiar e colar o bloco android do build.gradle do módulo do app anterior para o arquivo build.gradle do módulo do novo app. No entanto, tenha cuidado ao fazer isso.

    android {
            ...
            defaultConfig {
                // You need to move the application ID from the app module
                // to your feature module.
                applicationId "com.example.myapp"
                …
            }
            // Some additional build configurations you might want to
            // copy from your current ‘app’ module may include ProGuard
            // rules and code shrinking settings.
            buildTypes {
                release {
                    minifyEnabled true
                    proguardFiles getDefaultProguardFile(
                      'proguard-android-optimize.txt'),
                      'proguard-rules.pro'
                }
            }
        }
        
  4. Marque o módulo de recurso como ativado para instantâneo adicionando as tags de distribuição de pacote adequadas ao manifesto, conforme mostrado abaixo.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
            <dist:module dist:instant="true" />
            ...
        </manifest>
        
  5. Converta o módulo do recurso para o módulo do app base mudando o tipo de plug-in para com.android.application:

    // Replace  "apply plugin: 'com.android.feature'"
        // with the following
        apply plugin: 'com.android.application'
        

Converter o módulo de app antigo em um módulo de recurso dinâmico no momento da instalação

Se você não tiver código ou recursos no módulo do app antigo, basta excluí-lo, porque as etapas da seção anterior converteram o módulo de recurso no módulo base do seu app.

No entanto, se você tiver código e recursos no módulo de app antigo que representem a funcionalidade que você quer disponibilizar para os usuários quando instalarem seu app, siga as etapas desta seção para converter o módulo do app em um recurso dinâmico.

A criação de um módulo de recurso dinâmico envolve mudar o tipo de plug-in de com.android.application para com.android.dynamic-feature, assim como algumas outras alterações de build.gradle, da seguinte maneira:

  1. Mude o tipo de plug-in de com.android.application para com.android.dynamic-feature.

    // Replace "apply plugin: 'com.android.application'"
        // with the following:
        apply plugin: 'com.android.dynamic-feature'
        
  2. Conforme descrito na seção anterior, certifique-se de ter movido as configurações de compilação exigidas pelo plug-in com.android.application para o módulo de app base, como as regras applicationId ou proguardFiles.

  3. Renomeie o módulo para algo como "installed_feature" da seguinte maneira:

    1. Abra o painel Project selecionando View > Tool Windows > Project na barra de menus.
    2. Clique com o botão direito do mouse sobre o módulo de recurso dinâmico e selecione Refactor > Rename.
    3. Na caixa de diálogo exibida, selecione Rename module e clique em OK.
    4. Digite o novo nome do módulo e clique em OK.
  4. Da mesma forma que na etapa 3, renomeie o novo módulo de app criado na seção anterior para algo como "app".

  5. Adicione uma dependência de implementação no módulo "app" do arquivo build.gradle do módulo de recurso dinâmico, conforme mostrado abaixo.

    dependencies {
          ...
          // In the dynamic feature module, add an implementation dependency
          // on the base app module.
          implementation project(":app")
        }
        
  6. Adicione o recurso dinâmico ao arquivo build.gradle do novo módulo de app.

    android {
          ...
          // In the base app module, specify each dynamic feature module.
          dynamicFeatures = [":installed_feature"]
        }
        
  7. No manifesto do módulo de recurso dinâmico, marque o módulo de recurso dinâmico como instalável adicionando as tags de distribuição de pacote adequadas ao manifesto.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
            <dist:module dist:instant="false" dist:onDemand="false"
                    dist:title="@string/title_dynamic_feature">
                <dist:fusing dist:include="true" />
            </dist:module>
            ...
        </manifest>
        

Converter outros módulos de recurso em módulos de recursos dinâmicos ativados para instantâneos

Se você tiver modularizado outras funcionalidades do seu app em vários módulos de recurso, será necessário seguir as etapas desta seção para converter esses módulos em módulos de recursos dinâmicos ativados para instantâneos.

Para cada módulo de recurso restante em seu projeto, proceda da seguinte maneira para convertê-los em recursos dinâmicos ativados para instantâneos:

  1. Mude o tipo de plug-in do arquivo build.gradle para com.android.dynamic-feature, conforme mostrado abaixo:

    // Replace'com.android.feature' with 'com.android.dynamic-feature'.
        apply plugin: 'com.android.dynamic-feature'
        
  2. Marque cada módulo de recurso dinâmico como ativado para instantâneo adicionando o seguinte código ao manifesto.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
            <dist:module dist:instant="true" dist:onDemand="false"
                    dist:title="@string/title_dynamic_feature">
                <dist:fusing dist:include="true" />
            </dist:module>
            ...
        </manifest>
        
  3. Adicione o recurso dinâmico ao arquivo build.gradle do novo módulo de app em que você adicionou o installed_feature à lista de recursos dinâmicos.

    android {
          ...
          dynamicFeatures = [":installed_feature", ":feature_1", ":feature_2"]
          // or whichever name exists for the instant enabled dynamic features
        }
        

Criar, testar e publicar novos pacotes de apps instantâneos

Depois de concluir as etapas desta página, seu projeto pode produzir um único artefato, um Android App Bundle, que você pode usar para publicar a versão instalada e a versão instantânea do app no Google Play Console e distribuir separadamente para as faixas instantâneas e instaladas. Além disso, com os pacotes de apps, você pode aproveitar a Dynamic Delivery, que veicula APKs otimizados para cada configuração de dispositivo. Assim, os usuários fazem o download apenas do código e dos recursos necessários à execução do app. Não é mais necessário compilar, assinar e gerenciar vários APKs para oferecer compatibilidade com diferentes dispositivos. Além disso, os usuários contam com downloads menores e mais otimizados.

Para começar a criar e testar seu pacote de apps instantâneos, acesse Criar o pacote de apps.