O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Configurar o módulo básico

A maioria dos projetos de app não exige muito esforço para oferecer compatibilidade com o Dynamic Delivery. Isso porque o módulo que inclui o código e os recursos para o APK básico do app é o módulo recebido por padrão, que você tem quando cria um novo projeto de app no Android Studio. Ou seja, o módulo que aplica o plug-in de app abaixo ao arquivo build.gradle disponibiliza o código e os recursos para a funcionalidade básica do seu app.

// The standard application plugin creates your app's base module.
    apply plugin: 'com.android.application'
    

Se sua preocupação estiver relacionada com a redução do tamanho inicial de download do app, é importante lembrar que todo o código e os recursos incluídos neste módulo estão presentes no APK básico.

Além de oferecer as principais funcionalidades do app, o módulo básico também disponibiliza muitas das configurações de compilação e entradas de manifesto que afetam todo o projeto do app. Por exemplo, a assinatura do seu pacote de apps é determinada pelas informações incluídas para o módulo básico, e o controle de versão de todos os APKs do app é especificado no atributo versionCode no manifesto do módulo básico. Outros aspectos importantes do módulo básico são descritos abaixo.

Manifesto do módulo básico

O manifesto para o módulo básico do app é semelhante ao de qualquer outro módulo de app. Quando o Google Play gera o APK básico do app, ele mescla os manifestos de todos os módulos no manifesto do APK básico. Portanto, se você pretende adicionar módulos de recursos dinâmicos ao projeto do app, há alguns aspectos do manifesto do APK básico que você precisa levar em conta:

  • Como o APK básico é sempre instalado primeiro, ele deve indicar o ponto de entrada principal para o app. Ou seja, ele deve declarar uma atividade com o seguinte filtro de intent:

    <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        
  • No download de módulos de recursos dinâmicos sob demanda, os dispositivos que executam o Android 6.0 (API nível 23) e anteriores exigem que o app seja reiniciado antes do término da instalação dos novos módulos. No entanto, se você quer acessar o código e os recursos do módulo transferido imediatamente depois do download, inclua compatibilidade com a biblioteca SplitCompat no manifesto. Para saber mais, leia Acessar código e recursos de módulos transferidos por download.

  • Da mesma forma, em dispositivos com o Android 6.0 (API nível 23) e anteriores, os apps precisam ser reiniciados antes de a plataforma aplicar novas entradas do manifesto. Assim, se você precisar de determinadas permissões ou serviços assim que um módulo de recursos dinâmicos for transferido, inclua-os no manifesto do seu módulo básico.

  • Os Android App Bundles incluem compatibilidade com bibliotecas nativas não compactadas. Sendo assim, se você incluir bibliotecas nativas no app e quiser reduzir o uso do disco, inclua o seguinte no manifesto do módulo básico:

    <application
            android:extractNativeLibs="false"
            ... >
        

Configuração da compilação do módulo básico

Para a maioria dos projetos de app existentes, não é necessário alterar nada na configuração de compilação do módulo básico. No entanto, se você pretende adicionar módulos de recursos dinâmicos ao projeto do app, há alguns aspectos da configuração de compilação do módulo básico que devem ser levados em conta:

  • Assinatura de apps: não é preciso incluir informações de assinatura no arquivo de configuração de compilação, a menos que você queira compilar seu pacote de apps a partir da linha de comando. No entanto, se você incluir informações de assinatura, deverá fazer isso somente no arquivo de configuração da compilação do módulo básico. Para saber mais, consulte Configurar o Gradle para assinar seu aplicativo.
  • Redução de código: para ativar a redução de código para todo o projeto do app (inclusive para os módulos de recursos dinâmicos), é necessário fazer isso a partir do arquivo build.gradle do módulo básico. Ou seja, você pode incluir regras personalizadas do ProGuard em um módulo de recursos dinâmicos, mas a propriedade minifyEnabled nas configurações de compilação do módulo de recursos dinâmicos é ignorada.
  • O bloco splits é ignorado: durante a compilação de um pacote de apps, o Gradle ignora as propriedades no bloco android.splits. Para controlar os tipos de APKs de configuração com que o pacote de apps é compatível, use android.bundle para desativar tipos de APKs de configuração.
  • Controle de versão do app: o módulo básico determina o código e o nome da versão para todo o projeto do app. Para saber mais, vá para a seção sobre como Gerenciar atualizações de apps.

Reativar ou desativar tipos de APKs de configuração

Por padrão, quando você compila um pacote de apps, ele é compatível com a geração de APKs de configuração para cada conjunto de recursos de idioma, densidade de tela e bibliotecas de ABI. Usando o bloco android.bundle no arquivo build.gradle do módulo básico, como mostrado abaixo, você pode desativar a compatibilidade com um ou mais tipos de APKs de configuração:

android {
        // When building Android App Bundles, the splits block is ignored.
        splits {...}

        // Instead, use the bundle block to control which types of configuration APKs
        // you want your app bundle to support.
        bundle {
            language {
                // Specifies that the app bundle should not support
                // configuration APKs for language resources. These
                // resources are instead packaged with each base and
                // dynamic feature APK.
                enableSplit = false
            }
            density {
                // This property is set to true by default.
                enableSplit = true
            }
            abi {
                // This property is set to true by default.
                enableSplit = true
            }
        }
    }
    

Gerenciar atualizações de apps

Com os Android App Bundles e o Dynamic Delivery, você não precisa mais gerenciar códigos de versão para vários APKs enviados para o Google Play. Em vez disso, você gerencia apenas um código de versão no módulo básico do app, conforme mostrado abaixo:

// In your base module build.gradle file
    android {
        defaultConfig {
            …
            // You specify your app’s version code only in the base module.
            versionCode 5
            versionName "1.0"
        }
    }
    

Depois de fazer upload do pacote de apps, o Google Play usa o código de versão no seu módulo básico para atribuir o mesmo código de versão a todos os APKs gerados a partir desse pacote. Ou seja, quando um dispositivo faz o download do seu app e o instala, todos os APKs divididos desse app compartilham o mesmo código de versão.

Para atualizar seu app com um novo código ou recursos, é preciso atualizar o código de versão no módulo básico do app e compilar um novo pacote completo de apps. Quando você faz o upload desse pacote de apps no Google Play, ele gera um novo conjunto de APKs com base no código de versão especificado pelo módulo básico. Em seguida, quando os usuários atualizam seu app, o Google Play exibe versões atualizadas de todos os APKs atualmente instalados no dispositivo. Ou seja, todos os APKs instalados são atualizados com o novo código de versão.

Fazer o download de outros APKs de configuração

Uma exceção ao fluxo de atualização descrito acima é quando um app instalado exige outros APKs de configuração. Imagine um usuário que altera o idioma padrão do sistema depois de fazer o download do seu app. Se o app for compatível com esse idioma, o dispositivo solicitará outros APKs de configuração para esses recursos de idioma e fará o download deles a partir do Google Play. No entanto, esse tipo de atualização para o app não altera o código de versão. Por isso, o dispositivo transfere por download e instala somente os APKs de configuração necessários.