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 de Instant Apps Android, será necessário 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 mais recentes, o plug-in de app básico inclui compatibilidade com experiências instantâneas. Ou seja, se o módulo de app base atender aos requisitos para ser uma experiência instantânea, você conseguirá 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: esse 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 recursos compatível com 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 criar 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, mas repassa a geração e a assinatura do APK para o Google Play. O novo modelo de exibição de apps do Google Play 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. Você não precisa mais criar, assinar e gerenciar vários APKs para oferecer compatibilidade com dispositivos diferentes, e 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. Ou seja, agora seu projeto se assemelha mais a um projeto de app padrão, com um módulo base ativado para instantâneos 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 de app principal, da seguinte maneira:

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

    Groovy

    dependencies {
        ...
        // delete any lines that look like
        // feature project(":foo")
        // feature project(":bar")
        // application project(":app")
    }
    

    Kotlin

    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 de app base, do módulo com.android.application atual para o com.android.feature. Veja alguns exemplos abaixo. Nesta etapa, dependendo da configuração específica do build.gradle, pode ser mais fácil copiar e colar o bloco android do build.gradle do módulo de app anterior para o arquivo build.gradle do novo módulo de app. No entanto, tenha cuidado ao fazer isso.

    Groovy

    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'
            }
        }
    }
    

    Kotlin

    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 {
            getByName("release") {
                minifyEnabled = true
                proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"),
                    "proguard-rules.pro"
                )
            }
        }
    }
    
  4. Marque o módulo de recursos como ativado para instantâneos 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 de recursos para o módulo base mudando o tipo de plug-in para com.android.application:

    Groovy

    // Replace  "plugins { id 'com.android.feature' }"
    // with the following
    plugins {
      id 'com.android.application'
    }
    

    Kotlin

    // Replace  "plugins { id("com.android.feature") }"
    // with the following
    plugins {
        id("com.android.application")
    }
    

Converter o módulo de app antigo em um módulo de recursos no momento da instalação

Se você não tiver código ou recursos no módulo de app antigo, basta excluí-lo, porque as etapas da seção anterior converteram o módulo de recursos 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 de app em um módulo de recursos.

A criação de um módulo de recursos envolve mudar o tipo de plug-in de com.android.application para com.android.dynamic-feature, assim como algumas outras mudanças de build.gradle, da seguinte maneira:

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

    Groovy

    // Replace "plugins { id 'com.android.feature' }"
    // with the following:
    plugins {
      id 'com.android.dynamic-feature'
    }
    

    Kotlin

    // Replace "plugins { id("com.android.application") }"
    // with the following:
    plugins {
        id("com.android.dynamic-feature")
    }
    
  2. Conforme descrito na seção anterior, verifique se as configurações da compilação exigidas pelo plug-in com.android.application foram movidas 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 recursos 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 recursos, conforme mostrado abaixo.

    Groovy

    dependencies {
        ...
        // In the feature module, add an implementation dependency
        // on the base app module.
        implementation project(":app")
    }
    

    Kotlin

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

    Groovy

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures = [":installed_feature"]
    }
    

    Kotlin

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures.addAll(listOf(":installed_feature"))
    }
    
  7. No manifesto do módulo de recursos, marque o módulo 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 recursos 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 recursos, será necessário seguir as etapas desta seção para convertê-los em módulos de recursos ativados para instantâneos.

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

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

    Groovy

    // Replace 'com.android.feature' with 'com.android.dynamic-feature'
    plugins {
      id 'com.android.dynamic-feature'
    }
    

    Kotlin

    // Replace "com.android.feature" with "com.android.dynamic-feature"
    plugins {
        id("com.android.dynamic-feature")
    }
    
  2. Marque cada módulo de recursos como ativado para instantâneos adicionando o código a seguir 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 módulo de recursos ao arquivo build.gradle do novo módulo de aplicativo em que você adicionou o installed_feature à lista de módulos de recursos.

    Groovy

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

    Kotlin

    android {
       ...
       dynamicFeatures.addAll(listOf(":installed_feature", ":feature_1", ":feature_2"))
       // or whichever name exists for the instant enabled feature module
    }
    

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ê tem a vantagem de disponibilizar APKs otimizados para a configuração do dispositivo de cada usuário. Assim, eles fazem o download apenas do código e dos recursos necessários para executar o app. Ou seja, você não precisa mais criar, assinar e gerenciar vários APKs para oferecer compatibilidade com diferentes dispositivos, e os usuários recebem downloads menores e mais otimizados.

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