bundletool

bundletool est l'outil sous-jacent utilisé par Android Studio, le plug-in Android Gradle et Google Play. bundletool peut compiler un Android App Bundle (AAB) et convertir un app bundle en plusieurs APK déployés sur des appareils.

Les fichiers Android SDK Bundle (ASB) et leurs APK sont compilés avec bundletool, qui est également disponible sous la forme d'un outil de ligne de commande. Vous pouvez ainsi compiler vous-même des app bundles et des SDK bundles, et recréer la build Google Play côté serveur des APK de votre application ou de votre SDK compatible avec l'environnement d'exécution.

Télécharger bundletool

Si vous ne l'avez pas déjà fait, téléchargez bundletool à partir du dépôt GitHub.

Compiler et tester un app bundle

Vous pouvez utiliser Android Studio ou l'outil de ligne de commande bundletool pour compiler votre Android App Bundle, puis tester la génération d'APK à partir de cet app bundle.

Compiler un app bundle

Utilisez Android Studio et le plug-in Android Gradle pour créer et signer un Android App Bundle. Cependant, si vous ne pouvez pas utiliser l'IDE (par exemple, parce que vous utilisez un serveur de compilation continue), vous pouvez également compiler votre app bundle à partir de la ligne de commande et le signer avec jarsigner.

Pour en savoir plus sur la compilation d'app bundles avec bundletool, consultez Compiler un app bundle à l'aide de bundletool.

Générer un ensemble d'APK à partir de votre app bundle

Après avoir créé votre Android App Bundle, testez la génération des APK sur Google Play à partir de ce package et leur comportement une fois qu'ils sont déployés sur un appareil.

Deux options sont disponibles pour tester votre app bundle :

Cette section explique comment tester votre app bundle en local à l'aide de bundletool.

Lorsque bundletool génère des APK à partir de votre app bundle, il les inclut dans un conteneur appelé archive d'ensembles d'APK, qui utilise l'extension de fichier .apks. Pour générer un ensemble d'APK pour toutes les configurations d'appareil compatibles avec votre application à partir de votre app bundle, exécutez la commande bundletool build-apks, comme indiqué ci-dessous :

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

Si vous souhaitez déployer les APK sur un appareil, vous devez inclure les informations de signature de votre application, comme indiqué dans la commande suivante. Si vous ne spécifiez pas d'informations de signature, bundletool tente de signer vos APK pour vous à l'aide d'une clé de débogage.

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

Le tableau suivant décrit de manière détaillée les différents indicateurs et options que vous pouvez définir lorsque vous utilisez la commande bundletool build-apks :

Tableau 1. Options pour la commande bundletool build-apks

Indicateur Description
--bundle=path (Obligatoire) Spécifie le chemin d'accès à l'app bundle que vous avez compilé à l'aide d'Android Studio. Pour en savoir plus, consultez Compiler votre projet.
--output=path (Obligatoire) Spécifie le nom du fichier .apks de sortie qui contient tous les artefacts d'APK de votre application. Pour tester les artefacts de ce fichier sur un appareil, suivez la procédure décrite dans la section Déployer des APK sur un appareil connecté.
--overwrite Remplace tous les fichiers de sortie existants par le chemin d'accès que vous spécifiez à l'aide de l'option --output. Si vous n'incluez pas cet indicateur et que le fichier de sortie existe déjà, une erreur de compilation est émise.
--aapt2=path Spécifie un chemin d'accès personnalisé à AAPT2. Par défaut, bundletool inclut sa propre version d'AAPT2.
--ks=path (Facultatif) Spécifie le chemin d'accès au keystore de déploiement utilisé pour signer les APK. Si vous n'incluez pas cet indicateur, bundletool tente de signer vos APK à l'aide d'une clé de débogage.
--ks-pass=pass:password
ou
--ks-pass=file:/path/to/file
Spécifie le mot de passe de votre keystore. Si vous spécifiez un mot de passe en texte brut, qualifiez-le avec pass:. Si vous transmettez le chemin d'accès à un fichier contenant le mot de passe, qualifiez-le avec file:. Si vous spécifiez un keystore à l'aide de l'indicateur --ks sans spécifier --ks-pass, bundletool vous invite à saisir un mot de passe à partir de la ligne de commande.
--ks-key-alias=alias Spécifie l'alias de la clé de signature que vous souhaitez utiliser.
--key-pass=pass:password
ou
--key-pass=file:/path/to/file
Spécifie le mot de passe de la clé de signature. Si vous spécifiez un mot de passe en texte brut, qualifiez-le avec pass:. Si vous transmettez le chemin d'accès à un fichier contenant le mot de passe, qualifiez-le avec file:.

Si ce mot de passe est identique à celui du keystore, vous pouvez omettre cet indicateur.

--connected-device Indique à bundletool de créer des APK qui ciblent la configuration d'un appareil connecté. Si vous n'incluez pas cet indicateur, bundletool génère des APK pour toutes les configurations d'appareil prises en charge par votre application.
--device-id=serial-number Si vous disposez de plusieurs appareils connectés, utilisez cet indicateur pour spécifier l'ID de série de l'appareil sur lequel vous souhaitez déployer votre application.
--device-spec=spec_json Fournit un chemin d'accès à un fichier .json spécifiant la configuration d'appareil que vous souhaitez cibler. Pour en savoir plus, consultez la section Générer et utiliser des fichiers JSON de spécification d'appareil.
--mode=universal Définit le mode sur universal. Utilisez cette option si vous souhaitez que bundletool ne compile qu'un seul APK comprenant l'ensemble du code et des ressources de votre application, de sorte que l'APK soit compatible avec toutes les configurations d'appareil prises en charge par votre application.

Remarque : bundletool n'inclut que les modules de fonctionnalités qui spécifient <dist:fusing dist:include="true"/> dans leur fichier manifeste dans un APK universel. Pour en savoir plus, consultez la documentation de référence du fichier manifeste des modules de fonctionnalités.

N'oubliez pas que ces APK sont plus volumineux que ceux qui sont optimisés pour une configuration d'appareil spécifique. Toutefois, ils sont plus faciles à partager avec les testeurs internes qui souhaitent, par exemple, tester votre application sur plusieurs configurations d'appareil.

--local-testing Active votre app bundle pour les tests en local. Les tests en local permettent d'effectuer des cycles de test rapides et itératifs sans avoir à les importer sur les serveurs Google Play.

Pour savoir comment tester une installation de modules à l'aide de l'indicateur --local-testing, consultez Tester localement les installations de modules.

Déployer des APK sur un appareil connecté

Une fois que vous avez généré un ensemble d'APK, bundletool peut déployer la bonne combinaison d'APK sur un appareil connecté à partir de cet ensemble.

Par exemple, si votre appareil connecté est équipé d'Android 5.0 (niveau d'API 21) ou version ultérieure, bundletool transmet l'APK de base, les APK du module de fonctionnalité et les APK de configuration requis pour exécuter votre application sur cet appareil. Si votre appareil connecté est équipé d'Android 4.4 (niveau d'API 20) ou version antérieure, bundletool recherche un APK multiple compatible à déployer sur votre appareil.

Pour déployer votre application à partir d'un ensemble d'APK, exécutez la commande install-apks et spécifiez le chemin d'accès de l'ensemble à l'aide de l'indicateur --apks=/path/to/apks, comme dans la commande suivante. Si plusieurs appareils sont connectés, spécifiez un appareil cible en ajoutant l'indicateur --device-id=serial-id.

bundletool install-apks --apks=/MyApp/my_app.apks

Générer un ensemble d'APK spécifique à un appareil

Si vous souhaitez ne pas créer un ensemble d'APK pour toutes les configurations d'appareil prises en charge par votre application, vous pouvez compiler des APK qui ne ciblent que la configuration d'un appareil connecté à l'aide de l'option --connected-device, comme indiqué dans la commande suivante. Si plusieurs appareils sont connectés, spécifiez un appareil cible en ajoutant l'indicateur --device-id=serial-id.

bundletool build-apks --connected-device
--bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

Générer et utiliser des fichiers JSON de spécification d'appareil

bundletool peut générer un ensemble d'APK ciblant une configuration d'appareil spécifiée par un fichier JSON. Si vous voulez d'abord générer un fichier JSON pour un appareil connecté, exécutez la commande suivante :

bundletool get-device-spec --output=/tmp/device-spec.json

bundletool crée un fichier JSON pour votre appareil dans le répertoire de l'outil. Vous pouvez ensuite transmettre le fichier à bundletool afin de générer un ensemble d'APK ciblant uniquement la configuration décrite dans ce fichier JSON, comme ceci :

bundletool build-apks --device-spec=/MyApp/pixel2.json
--bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

Créer manuellement un fichier JSON de spécification d'appareil

Si vous n'avez pas accès à l'appareil pour lequel vous souhaitez compiler un ensemble d'APK ciblé (par exemple, si vous voulez essayer votre application sur un appareil que vous ne possédez pas), vous pouvez créer manuellement un fichier JSON au format suivant :

{
  "supportedAbis": ["arm64-v8a", "armeabi-v7a"],
  "supportedLocales": ["en", "fr"],
  "screenDensity": 640,
  "sdkVersion": 27
}

Vous pouvez ensuite transmettre ce fichier JSON à la commande bundle extract-apks, comme indiqué dans la section précédente.

Extraire des APK spécifiques à l'appareil d'un ensemble d'APK existant

Supposons que vous ayez un ensemble d'APK et que vous souhaitiez en extraire un sous-ensemble d'APK ciblant une configuration d'appareil spécifique. Dans ce cas, vous pouvez utiliser la commande extract-apks et indiquer un fichier JSON de spécification d'appareil, comme suit :

bundletool extract-apks
--apks=/MyApp/my_existing_APK_set.apks
--output-dir=/MyApp/my_pixel2_APK_set.apks
--device-spec=/MyApp/bundletool/pixel2.json

Mesurer la taille de téléchargement estimée des APK d'un ensemble d'APK

Pour mesurer la taille de téléchargement estimée des APK d'un ensemble d'APK tels qu'ils seraient diffusés sous forme compressée sur le réseau, exécutez la commande get-size total :

bundletool get-size total --apks=/MyApp/my_app.apks

Vous pouvez modifier le comportement de la commande get-size total à l'aide des indicateurs suivants :

Tableau 2. Options pour la commande get-size total

Indicateur Description
--apks=path (Obligatoire) Spécifie le chemin d'accès au fichier d'ensemble d'APK dont la taille de téléchargement est mesurée.
--device-spec=path Indique le chemin d'accès au fichier de spécification de l'appareil (à partir de get-device-spec ou construit manuellement) à utiliser pour la mise en correspondance. Vous pouvez spécifier un chemin d'accès partiel pour évaluer un ensemble de configurations.
--dimensions=dimensions Spécifie les dimensions utilisées lors du calcul des estimations de taille. Accepte une liste d'éléments SDK, ABI, SCREEN_DENSITY et LANGUAGE séparés par une virgule. Pour effectuer des mesures dans toutes les dimensions, spécifiez ALL.
--instant Mesure la taille de téléchargement des APK permettant une utilisation instantanée au lieu des APK installables. Par défaut, bundletool mesure la taille de téléchargement des APK installables.
--modules=modules Spécifie une liste de modules séparés par une virgule dans l'ensemble d'APK à prendre en compte dans la mesure. La commande bundletool inclut automatiquement tous les modules dépendants de l'ensemble spécifié. Par défaut, la commande mesure la taille de téléchargement de tous les modules installés lors du premier téléchargement.

Ressources supplémentaires

Pour en savoir plus sur l'utilisation de bundletool, regardez la vidéo App Bundles: Testing bundles with bundletool and the Play Console (App bundles : tests avec Bundletool et la Play Console).