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:
- Exclua a linha
baseFeature true
Remova todas as dependências que usam as configurações
feature
ouapplication
.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")) }
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ódulocom.android.application
atual para ocom.android.feature
. Veja alguns exemplos abaixo. Nesta etapa, dependendo da configuração específica dobuild.gradle
, pode ser mais fácil copiar e colar o blocoandroid
dobuild.gradle
do módulo de app anterior para o arquivobuild.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" ) } } }
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>
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:
Mude o tipo de plug-in de
com.android.application
paracom.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") }
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 regrasapplicationId
ouproguardFiles
.Renomeie o módulo para algo como "installed_feature" da seguinte maneira:
- Abra o painel Project selecionando View > Tool Windows > Project na barra de menus.
- Clique com o botão direito do mouse sobre o módulo de recursos e selecione Refactor > Rename.
- Na caixa de diálogo exibida, selecione Rename module e clique em OK.
- Digite o novo nome do módulo e clique em OK.
Da mesma forma que na etapa 3, renomeie o novo módulo de app criado na seção anterior para algo como "app".
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")) }
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")) }
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:
Mude o tipo de plug-in do arquivo
build.gradle
paracom.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") }
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>
Adicione o módulo de recursos ao arquivo
build.gradle
do novo módulo de aplicativo em que você adicionou oinstalled_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.