O formato Android App Bundle

Um Android App Bundle é um arquivo (com a extensão de arquivo .aab) enviado ao Google Play.

Os pacotes de apps são binários assinados que organizam o código e os recursos do seu app em módulos, conforme ilustrado na Figura 1. O código e os recursos de cada módulo são organizados de forma semelhante ao que você encontraria em um APK. Isso faz sentido, porque cada um desses módulos pode ser gerado como APKs separados. Em seguida, o Google Play usa o pacote de apps para gerar os diversos APKs enviados aos usuários, como o APK de base, os APKs de recursos, os APKs de configuração e, no caso de dispositivos que não são compatíveis com APKs divididos, multi-APKs. Os diretórios coloridos em azul, como drawable/, values/ e lib/, representam o código e os recursos que o Google Play usa para criar APKs de configuração para cada módulo.

Os pacotes de apps organizam seu app em diretórios, cada um representando um
        módulo. Dentro de cada diretório de módulo, o código e os recursos são organizados de
         forma semelhante a um APK típico.

Figura 1. O conteúdo de um Android App Bundle com um módulo base, dois módulos de recursos e dois pacotes de recursos.

A lista a seguir descreve mais detalhadamente alguns dos arquivos e diretórios do pacote de apps:

  • base/, feature1/ e feature2/: cada um desses diretórios de nível superior representa um módulo diferente do seu app. O módulo base está sempre em um diretório base do pacote de apps. No entanto, o diretório de cada módulo de recurso recebe o nome especificado pelo atributo split no manifesto do módulo. Para saber mais, leia sobre o manifesto do módulo de recursos.
  • asset_pack_1/ e asset_pack_2/: para apps ou jogos grandes e exigentes graficamente, você pode modificar recursos em pacotes de recursos. Os pacotes de recursos são ideais para jogos devido aos limites de tamanho maiores. É possível personalizar como e quando cada pacote de recursos é transferido por download para um dispositivo de acordo com três modos de transferência: install-time, fast-follow e on-demand. Todos os pacotes de recursos são hospedados e enviados no Google Play. Para saber mais sobre como adicionar pacotes de recursos ao seu pacote de apps, consulte a Visão geral do Play Asset Delivery.
  • BUNDLE-METADATA/: esse diretório inclui arquivos de metadados que contêm informações úteis para ferramentas ou app stores. Esses arquivos de metadados podem incluir mapeamentos do ProGuard, além da lista completa dos arquivos DEX do app. Os arquivos neste diretório não são empacotados nos APKs do app.
  • Arquivos em buffer de protocolo do módulo (*.pb): esses arquivos fornecem metadados que ajudam a descrever o conteúdo de cada módulo de app para as app stores, como o Google Play. Por exemplo, BundleConfig.pb fornece informações sobre o próprio pacote, como a versão das ferramentas de criação usada para criar o pacote, e native.pb e resources.pb descrevem o código e os recursos em cada módulo, o que é útil quando o Google Play otimiza APKs para diferentes configurações de dispositivos.
  • manifest/: diferentemente dos APKs, os pacotes de apps armazenam o arquivo AndroidManifest.xml de cada módulo nesse diretório separado.
  • dex/: diferentemente dos APKs, os pacotes de apps armazenam os arquivos DEX de cada módulo nesse diretório separado.
  • res/, lib/ e assets/: esses diretórios são idênticos aos de um APK típico. Quando você faz upload do pacote de apps, o Google Play inspeciona esses diretórios e pacotes e seleciona somente os arquivos que satisfazem a configuração do dispositivo de destino, preservando os caminhos de arquivos.
  • root/: esse diretório armazena arquivos que são posteriormente realocados para a raiz de qualquer APK que inclua o módulo em que o diretório está localizado. Por exemplo, o diretório base/root/ de um pacote de apps pode incluir recursos baseados em Java que seu app carrega usando Class.getResource(). Esses arquivos são posteriormente realocados para o diretório raiz do APK base do app e para todos os multi-APKs gerados pelo Google Play. Os caminhos dentro desse diretório também são preservados. Ou seja, os diretórios (e os subdiretórios deles) também são realocados para a raiz do APK.

Visão geral dos APKs divididos

Um componente fundamental para a exibição de apps otimizados é o mecanismo de APK dividido disponível no Android 5.0 (API de nível 21) e versões mais recentes. Os APKs divididos são muito semelhantes aos APKs comuns: eles incluem bytecode DEX compilado, recursos e um manifesto do Android. No entanto, a plataforma Android pode tratar vários APKs divididos instalados como um único app. Ou seja, você pode instalar vários APKs divididos que têm acesso a códigos e recursos comuns e são exibidos como um app instalado no dispositivo.

A vantagem dos APKs divididos é a capacidade de dividir um APK monolítico, ou seja, um APK que inclui código e recursos para todos os elementos e configurações de dispositivos compatíveis com seu app, em pacotes menores e discretos instalados no dispositivo do usuário, conforme necessário.

Por exemplo, um APK dividido pode incluir o código e os recursos de outra funcionalidade de que apenas alguns dos seus usuários precisam, enquanto outro APK dividido inclui recursos apenas para um idioma ou densidade de tela específico. Cada APK dividido é transferido por download e instalado mediante a solicitação do usuário ou quando exigido pelo dispositivo.

O conteúdo a seguir descreve os diferentes tipos de APK que podem ser instalados juntos em um dispositivo para formar sua experiência completa com o app. Você saberá como configurar o projeto do seu app para oferecer compatibilidade com esses APKs nas próximas seções desta página.

  • APK básico: contém o código e os recursos que todos os outros APKs divididos podem acessar e oferece a funcionalidade básica para seu app. Quando um usuário solicita o download do seu app, esse APK é transferido por download e instalado primeiro. Isso ocorre porque somente o manifesto do APK básico contém uma declaração completa dos serviços, provedores de conteúdo, permissões, requisitos de versão da plataforma e dependências do app nos recursos do sistema. O Google Play gera o APK básico para seu app a partir do módulo de app (ou básico) do projeto. Caso sua preocupação esteja relacionada à 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.
  • APKs de configuração: cada um desses APKs inclui bibliotecas nativas e recursos para uma densidade de tela, arquitetura de CPU ou idioma específicos. Quando o usuário faz o download do seu app, o dispositivo transfere e instala apenas os APKs de configuração destinados ao dispositivo. Cada APK de configuração é uma dependência de um APK de base ou de um APK de módulo de recurso. Ou seja, eles são transferidos por download e instalados com o APK a que disponibilizam código e recursos. Diferentemente dos módulos básicos e de recursos, você não cria um módulo separado para os APKs de configuração. Se você usa práticas padrão para organizar recursos alternativos e específicos da configuração para seus módulos básicos e de recursos, o Google Play gera automaticamente APKs de configuração para você.
  • APKs de módulos de recursos: cada um desses APKs contém código e recursos para uma funcionalidade do seu app que você modulariza usando módulos de recursos. Depois, é possível personalizar como e quando esse recurso será transferido por download em um dispositivo. Por exemplo, usando a biblioteca Play Core, os recursos podem ser instalados sob demanda depois que o APK básico for instalado no dispositivo, para oferecer outras funcionalidades para o usuário. Imagine um app de chat que faz o download do recurso de captura e envio de fotos e o instala somente quando o usuário pede para usar essa funcionalidade. Como os módulos de recursos podem não estar disponíveis no momento da instalação, é importante incluir todos os códigos e recursos comuns no APK básico. Ou seja, o módulo de recursos presume que o código e os recursos somente do APK básico estarão disponíveis no momento da instalação. O Google Play gera APKs de módulos de recursos para o app com base nos módulos de recursos do projeto.

Pense em um app com três módulos de recursos e compatibilidade com várias configurações de dispositivo. A Figura 1 abaixo ilustra o que seria a árvore de dependências dos diversos APKs do app. Observe que o APK básico forma o topo da árvore, e todos os outros APKs dependem do APK básico. Se quiser saber como os módulos desses APKs são representados em um Android App Bundle, consulte Formato do Android App Bundle.

O APK básico está no topo da árvore, e os APKs do módulo de recursos têm
uma dependência. APKs de configuração, que incluem
código e recursos específicos da configuração do dispositivo para base e cada
APK de módulo de recursos, formam os nós da árvore de dependência.

Figura 1. Árvore de dependência de um app veiculado por APKs divididos

Não é necessário compilar esses APKs por conta própria. O Google Play faz isso por você usando um único pacote de apps assinado que você cria com o Android Studio. Para saber mais sobre o formato do pacote de apps e como criar um, consulte Criar, implantar e fazer upload de Android App Bundles.

Dispositivos com Android 4.4 (API nível 19) e anteriores

Como os dispositivos com o Android 4.4 (API nível 19) e anteriores não são compatíveis com download e instalação de APKs divididos, o Google Play oferece a esses dispositivos um único APK, denominado multi-APK, otimizado para a configuração do dispositivo. Ou seja, os multi-APKs representam a experiência completa do seu app, mas não incluem código e recursos desnecessários, como aqueles para outras densidades de tela e arquiteturas de CPU.

No entanto, eles incluem recursos para todos os idiomas compatíveis com seu app. Isso permite, por exemplo, que o usuário altere a configuração de idioma preferencial do app sem precisar fazer o download de outro multi-APK.

Em multi-APKs, não é possível fazer o download de módulos de recursos sob demanda posteriormente. Para incluir um módulo de recurso nesse APK, você precisa desativar a opção On-demand ou ativar Fusing durante a criação do módulo de recursos.

Com os pacotes de apps, não é preciso criar, assinar, fazer upload nem gerenciar APKs para cada configuração de dispositivo compatível com seu app. Você ainda cria e faz upload de um único pacote de apps para todo o app, e o Google Play cuida do resto para você. Sendo assim, independentemente de você pretender ou não oferecer compatibilidade com dispositivos com o Android 4.4 ou versões anteriores, o Google Play oferece um mecanismo de veiculação flexível para você e seus usuários.

Mudanças no idioma do usuário

Com os pacotes de apps, os dispositivos fazem o download apenas do código e dos recursos necessários para executar o app. Assim, para recursos de idioma, o dispositivo do usuário faz o download apenas dos recursos de idioma do app que correspondem a um ou mais idiomas selecionados atualmente nas configurações do dispositivo.

Quando um usuário muda o idioma nas configurações do dispositivo, o Google Play pode precisar fazer o download e instalar alguns APKs divididos antes que o app possa ser exibido no novo idioma.

O Google Play tenta fazer o download dos outros idiomas imediatamente após a mudança. Se o dispositivo do usuário estiver off-line, o download falhar ou os recursos forem muito grandes, o Google Play tentará fazer o download novamente em segundo plano quando as condições do dispositivo forem mais favoráveis. Quando executado em um dispositivo com o Android 9.0 (API de nível 28) ou versões anteriores, o app será encerrado se estiver em primeiro plano durante a instalação dos novos APKs divididos com base no idioma.

Caso seu app exija que todos os idiomas estejam disponíveis no dispositivo a qualquer momento, você pode desativar a divisão de idiomas na configuração do build.

Se o app exige o download de outros idiomas, independentemente dos idiomas do usuário selecionados nas configurações do dispositivo (para implementar um seletor de idiomas, por exemplo), você pode usar a biblioteca Play Core para fazer o download sob demanda.