AAPT2

AAPT2 (Android Asset Packaging Tool) est un outil de compilation utilisé par Android Studio et le plug-in Android Gradle pour compiler et empaqueter les ressources de votre application. AAPT2 analyse, indexe et compile les ressources dans un format binaire optimisé pour la plate-forme Android.

Le plug-in Android Gradle 3.0.0 ou version ultérieure active AAPT2 par défaut. Vous n'avez généralement pas besoin d'appeler aapt2 vous-même. Toutefois, si vous préférez utiliser votre terminal et votre propre système de compilation au lieu d'Android Studio, vous pouvez vous servir d'AAPT2 à partir de la ligne de commande. Vous pouvez également déboguer les erreurs de compilation liées à AAPT2 à partir de la ligne de commande. Pour ce faire, AAPT2 est disponible en tant qu'outil autonome dans Android SDK Build Tools 26.0.2 et versions ultérieures.

Pour télécharger Android SDK Build Tools à partir de la ligne de commande, utilisez sdkmanager et exécutez la commande suivante :

sdkmanager "build-tools;build-tools-version"

Après avoir téléchargé SDK Build Tools, vous trouverez AAPT2 dans android_sdk/build-tools/version/.

Étant donné que les révisions d'Android SDK Build Tools ne sont pas fréquentes, il est possible que la version d'AAPT2 comprise dans Android SDK Build Tools ne soit pas la plus récente. Pour obtenir la dernière version d'AAPT2, téléchargez AAPT2 depuis Google Maven.

Pour utiliser AAPT2 à partir de la ligne de commande sous Linux ou Mac, exécutez la commande aapt2. Sous Windows, exécutez la commande aapt2.exe.

AAPT2 assure une compilation plus rapide des ressources en permettant une compilation incrémentielle. Pour effectuer une compilation incrémentielle, le traitement des ressources est divisé en deux étapes :

  • Compilation : compile les fichiers de ressources dans des formats binaires.
  • Association : fusionne tous les fichiers compilés et les regroupe en un seul package.

Cette séparation permet d'améliorer les performances des compilations incrémentielles. Par exemple, en cas de modifications dans un seul fichier, vous ne devez recompiler que ce fichier.

Télécharger AAPT2 depuis Google Maven

Pour obtenir la dernière version d'AAPT2 non incluse dans Android SDK Build Tools, téléchargez AAPT2 à partir du dépôt Maven de Google en procédant comme suit :

  1. Dans l'index du dépôt, accédez à com.android.tools.build > aapt2.
  2. Copiez le nom de la dernière version d'AAPT2.
  3. Insérez le nom de la version que vous avez copié dans l'URL suivante et spécifiez le système d'exploitation cible : https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar.

    Par exemple, pour télécharger la version 3.2.0-alpha18-4804415 pour Windows, vous devez utiliser https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar.

  4. Accédez à l'URL dans un navigateur. Le téléchargement de l'application AAPT2 devrait bientôt commencer.

  5. Décompressez le fichier JAR que vous venez de télécharger.

    Le fichier JAR doit contenir un exécutable aapt2 et certaines bibliothèques dont dépend cet exécutable.

Compilation

AAPT2 permet la compilation de tous les types de ressources Android, comme les drawables et les fichiers XML. Lorsque vous appelez AAPT2 pour la compilation, transmettez un seul fichier de ressources en tant qu'entrée par appel. AAPT2 analyse ensuite le fichier et génère un fichier binaire intermédiaire avec une extension .flat.

Lors de la transmission de répertoires entiers, AAPT2 recompile tous les fichiers du répertoire, même si une seule ressource a été modifiée. Bien que vous puissiez transmettre des répertoires de ressources contenant plusieurs fichiers de ressources à AAPT2 à l'aide de l'indicateur --dir, vous ne bénéficiez pas des avantages de la compilation incrémentielle des ressources.

Les types de fichiers de sortie peuvent varier en fonction des entrées que vous fournissez pour la compilation, comme indiqué dans le tableau suivant :

Tableau 1. Types de fichiers d'entrée et de sortie pour la compilation

Entrée Sortie
Fichiers de ressources XML, tels que Chaîne et Style, situés dans le répertoire res/values/. Table des ressources dont l'extension est *.arsc.flat.
Tous les autres fichiers de ressources.

Tous les fichiers autres que ceux situés dans le répertoire res/values/ sont convertis en fichiers XML binaires avec des extensions *.flat.

De plus, tous les fichiers PNG sont écrasés par défaut et adoptent les extensions *.png.flat . Si vous préférez ne pas compresser les fichiers PNG, vous pouvez utiliser l'option --no-crunch lors de la compilation.

Les fichiers de sortie AAPT2 ne sont pas des exécutables. Vous devrez inclure par la suite ces fichiers binaires en entrée dans la phase d'association pour générer un APK. Toutefois, le fichier APK généré n'est pas un exécutable que vous pouvez déployer immédiatement sur un appareil Android, car il ne contient pas de fichiers DEX et n'est pas signé.

Syntaxe de la compilation

La syntaxe générale pour utiliser compile est la suivante :

aapt2 compile path-to-input-files [options] -o output-directory/

Dans l'exemple suivant, AAPT2 compile les fichiers de ressources nommés values.xml et myImage.png individuellement :

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Comme indiqué dans le tableau 1, le nom du fichier de sortie dépend du nom du fichier d'entrée et du nom du répertoire parent.

Pour l'exemple précédent avec le fichier strings.xml en entrée, aapt2 nomme automatiquement le fichier de sortie values-en_strings.arsc.flat. Toutefois, le fichier drawable compilé qui est stocké dans le répertoire drawable est appelé drawable_img.png.flat.

Options de la compilation

Vous pouvez utiliser plusieurs options avec la commande compile, comme l'indique le tableau 2 :

Tableau 2. Options de la commande de compilation

Option Description
-o path

Spécifie le chemin de sortie pour la ou les ressources compilées.

Cet indicateur est obligatoire, car vous devez spécifier un chemin d'accès à un répertoire où AAPT2 peut générer et stocker les ressources compilées.

--dir directory

Spécifie le répertoire dans lequel rechercher les ressources.

Bien que cet indicateur vous permette de compiler plusieurs fichiers de ressources à l'aide d'une seule commande, il désactive les avantages de la compilation incrémentielle. Il ne doit donc pas être utilisé pour les projets volumineux.

--pseudo-localize Génère des versions pseudolocalisées des chaînes par défaut, telles que en-XA et en-XB.
--no-crunch Désactive le traitement PNG.

Utilisez cette option si vous avez déjà traité les fichiers PNG ou si vous créez des versions de débogage qui ne nécessitent pas de réduction de taille de fichier. L'activation de cette option accélère l'exécution, mais augmente la taille du fichier de sortie.

--legacy Traite les erreurs autorisées lors de l'utilisation de versions antérieures d'AAPT comme des avertissements.

Utilisez cet indicateur pour les erreurs de temps de compilation inattendues. Pour résoudre les changements de comportement connus susceptibles de se produire lorsque vous utilisez AAPT2, consultez Changements de comportement lors de l'utilisation d'AAPT2.

-zip file file est un fichier ZIP contenant le répertoire res dans lequel rechercher des ressources.
-output-text-symbols file Génère un fichier texte contenant les symboles de ressources dans le fichier spécifié.
-preserve-visibility-of-styleables Si cette option est spécifiée, elle applique les mêmes règles de visibilité pour les styles que celles utilisées pour toutes les autres ressources. Dans le cas contraire, tous les styles peuvent être rendus publics.
-visibility [public|private|default|] Définit la visibilité des ressources compilées sur le niveau spécifié.
-trace-folder folder Génère un fragment de trace JSON systrace dans le dossier spécifié.
-source-path path Définit le chemin d'accès au fichier source du fichier de ressources compilé sur path.
-h Affiche l'aide des outils.
-v Active la journalisation détaillée.

Lors de la phase d'association, AAPT2 fusionne tous les fichiers intermédiaires générés pendant la phase de compilation, tels que les tables de ressources, les fichiers XML binaires et les fichiers PNG traités, puis les regroupe dans un seul APK. D'autres fichiers auxiliaires, tels que R.java et des fichiers de règles ProGuard, peuvent également être générés pendant cette phase. Toutefois, l'APK généré ne contient pas de bytecode DEX et n'est pas signé. Autrement dit, vous ne pouvez pas déployer cet APK sur un appareil.

Si vous n'utilisez pas le plug-in Android Gradle pour compiler votre application à partir de la ligne de commande, vous pouvez vous servir d'autres outils de ligne de commande, tels que d8 pour compiler le bytecode Java en bytecode DEX, et apksigner pour signer l'APK.

La syntaxe générale liée à l'utilisation de link pour l'association est la suivante :

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

Dans l'exemple suivant, AAPT2 fusionne les deux fichiers intermédiaires, drawable_Image.flat et values_values.arsc.flat, et le fichier AndroidManifest.xml. AAPT2 associe le résultat au fichier android.jar, qui contient les ressources définies dans le package android :

 aapt2 link -o output.apk
 -I android_sdk/platforms/android_version/android.jar
    compiled/res/values_values.arsc.flat
    compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

Vous pouvez utiliser les options suivantes avec la commande link :

Tableau 3. Options de la commande d'association

Option Description
-o path

Spécifie le chemin de sortie pour l'APK de ressources associées.

Cet indicateur est obligatoire, car vous devez spécifier le chemin d'accès à l'APK de sortie pouvant contenir les ressources associées.

--manifest file

Indique le chemin d'accès au fichier manifeste Android à compiler.

Cet indicateur est obligatoire, car le fichier manifeste contient des informations essentielles sur votre application, telles que le nom du package et l'ID application.

-I

Fournit le chemin d'accès au fichier android.jar de la plate-forme ou à d'autres APK tels que framework-res.apk, qui peuvent être utiles lors de la compilation de fonctionnalités.

Cette option est obligatoire si vous utilisez des attributs avec l'espace de noms android dans vos fichiers de ressources.
-A directory Spécifie un annuaire d'éléments à inclure dans l'APK.

Vous pouvez utiliser cet annuaire pour stocker les fichiers d'origine non traités. Pour en savoir plus, consultez Accéder aux fichiers d'origine.

-R file Transmet un fichier .flat individuel à link en utilisant la sémantique overlay sans utiliser la balise <add-resource>.

Lorsque vous fournissez un fichier de ressources qui se superpose à un fichier existant, la dernière ressource en conflit fournie est utilisée.

--package-id package-id Spécifie l'ID de package à utiliser pour votre application.

L'ID de package que vous spécifiez doit être supérieur ou égal à 0x7f, sauf s'il est utilisé en combinaison avec --allow-reserved-package-id.

--allow-reserved-package-id

Autorise l'utilisation d'un ID de package réservé.

Les ID de package réservés sont généralement attribués aux bibliothèques partagées et sont compris entre 0x02 et 0x7e inclus. En utilisant --allow-reserved-package-id, vous pouvez attribuer des ID compris dans la plage d'ID de packages réservés.

Cette option ne doit être utilisée que pour les packages dotés de la version min-sdk 26 ou d'une version antérieure.

--java directory Spécifie le répertoire dans lequel générer R.java.
--proguard proguard_options Génère le fichier de sortie pour les règles ProGuard.
--proguard-conditional-keep-rules Génère le fichier de sortie pour les règles ProGuard du DEX principal.
--no-auto-version Désactive la gestion automatique des versions du SDK de style et de mise en page.
--no-version-vectors Désactive la gestion automatique des versions des drawables vectoriels. Utilisez cet indicateur uniquement lorsque vous créez votre APK avec la bibliothèque de drawables vectoriels.
--no-version-transitions Désactive la gestion automatique des versions des ressources de transition. N'utilisez cet indicateur que lorsque vous créez votre APK avec la bibliothèque de support de transition.
--no-resource-deduping Désactive automatiquement la déduplication des ressources avec des valeurs identiques dans les configurations compatibles.
--enable-sparse-encoding Active l'encodage des entrées creuses à l'aide d'une arborescence de recherche binaire. Cela est utile pour optimiser la taille de l'APK, mais au détriment des performances de récupération des ressources.
-z Nécessite la localisation des chaînes marquées comme "suggérées".
-c config Fournit une liste de configurations séparées par une virgule.

Par exemple, si vous avez des dépendances sur la bibliothèque de support (qui contient des traductions pour plusieurs langues), vous pouvez filtrer les ressources uniquement pour la configuration de langue donnée, comme l'anglais ou l'espagnol.

La configuration de la langue doit être définie par un code de langue ISO 639-1 à deux lettres, éventuellement suivi du code régional ISO 3166-1-alpha-2 à deux lettres précédé d'un "r" minuscule (par exemple, en-rUS).

--preferred-density density Permet à AAPT2 de sélectionner la densité la plus proche et de supprimer toutes les autres.

Plusieurs qualificatifs de densité de pixels sont disponibles dans votre application, par exemple ldpi, hdpi et xhdpi. Lorsque vous spécifiez la densité de votre choix, AAPT2 sélectionne et stocke la densité la plus proche dans la table des ressources, puis supprime toutes les autres.

--output-to-dir Génère le contenu de l'APK dans un répertoire spécifié par -o.

Si vous rencontrez des erreurs lorsque vous utilisez cet indicateur, vous pouvez les résoudre en passant à Android SDK Build Tools 28.0.0 ou version ultérieure.

--min-sdk-version min-sdk-version Définit la version minimale du SDK par défaut à utiliser pour AndroidManifest.xml.
--target-sdk-version target-sdk-version Définit la version du SDK cible par défaut à utiliser pour AndroidManifest.xml.
--version-code version-code Spécifie le code de version à injecter dans AndroidManifest.xml, le cas échéant.
--version-name version-name Spécifie le nom de la version à injecter dans le champ AndroidManifest.xml, le cas échéant.
--revision-code revision-code Spécifie le code de révision à injecter dans le fichier AndroidManifest.xml, le cas échéant.
--replace-version Si vous spécifiez --version-code, --version-name ou --revision-code, ces valeurs remplacent celles présentes dans le fichier manifeste. Par défaut, rien ne change si le fichier manifeste définit déjà ces attributs.
--compile-sdk-version-nacodeme compile-sdk-version-name Spécifie le code de version à injecter dans le fichier AndroidManifest.xml, le cas échéant.
--compile-sdk-version-name compile-sdk-version-name Spécifie le nom de la version à injecter dans le fichier AndroidManifest.xml, le cas échéant.
--proto-format Génère des ressources compilées au format Protobuf.

Convient comme entrée dans l'outil bundletool pour générer un Android App Bundle.

--non-final-ids Génère R.java avec des ID de ressources non finaux. Les références aux ID du code de l'application ne sont pas intégrées lors de la compilation kotlinc ou javac.
--emit-ids path Émet un fichier au niveau du chemin d'accès indiqué avec la liste de noms des types de ressources et leurs mappages d'ID. Convient à --stable-ids.
--stable-ids outputfilename.ext Utilise le fichier généré avec --emit-ids, contenant la liste de noms des types de ressources et leurs ID attribués.

Cette option permet aux ID attribués de rester stables même lorsque vous supprimez ou ajoutez des ressources lors de l'association.

--custom-package package_name Spécifie le package Java personnalisé sous lequel générer R.java.
--extra-packages package_name Génère le même fichier R.java, mais avec des noms de package différents.
--add-javadoc-annotation annotation Ajoute une annotation JavaDoc à toutes les classes Java générées.
--output-text-symbols path Génère un fichier texte contenant les symboles de ressource de la classe R dans le fichier spécifié.

Vous devez spécifier le chemin d'accès au fichier de sortie.

--auto-add-overlay Autorise l'ajout de nouvelles ressources dans les superpositions sans utiliser la balise <add-resource>.
--rename-manifest-package manifest-package Renomme le package dans le fichier AndroidManifest.xml.
--rename-instrumentation-target-package instrumentation- target-package Modifie le nom du package cible pour l'instrumentation.

Cette option doit être utilisée conjointement avec --rename-manifest-package.

-0 extension

Indique les extensions des fichiers que vous ne souhaitez pas compresser.

--split path:config[,config[..]] Divise les ressources en fonction d'un ensemble de configurations pour générer une version différente de l'APK.

Vous devez spécifier le chemin d'accès à l'APK de sortie et l'ensemble des configurations.

--proguard-main-dex file Fichier de sortie des règles ProGuard générées pour le DEX principal.
--proguard-minimal-keep-rules Génère un ensemble minimal de règles de conservation ProGuard.
--no-resource-removal Désactive la suppression automatique des ressources par défaut. N'utilisez cette option que lorsque vous compilez des packages de superposition de ressources d'exécution (RRO).
-x Ancien indicateur spécifiant l'utilisation de l'identifiant de package 0x01.
--product products-list Spécifie une liste de noms de produits à conserver, séparés par une virgule.
--no-xml-namespaces Supprime le préfixe d'espace de noms XML et les informations d'URI du fichier AndroidManifest.xml et des binaires XML dans res/*.
--shared-lib Génère une bibliothèque d'exécution Android partagée.
--static-lib Génère une bibliothèque Android statique.
--no-static-lib-packages Fusionne toutes les ressources de la bibliothèque dans le package de l'application.
--no-proguard-location-reference Empêche les fichiers de règles ProGuard d'avoir une référence au fichier source.
--private-symbols package-name package-name spécifie le nom de package à utiliser lorsque vous générez R.java pour les symboles privés. S'ils ne sont pas spécifiés, les symboles publics et privés utilisent le nom de package de l'application.
--override-styles-instead-of-overlaying Entraîne le remplacement des définitions précédentes via les styles définis dans les ressources -R, et non leur fusion.
--rename-resources-package package-name Remplace le nom du package par package-name dans la table des ressources.
--no-compress Ne compresse aucune ressource.
--keep-raw-values Conserve les valeurs d'attribut brutes dans des fichiers XML.
--no-compress-regex regular-expression Ne compresse pas les extensions correspondant à regular-expression. Utilisez le symbole $ pour la fin de la ligne. Utilise une grammaire d'expression régulière ECMAScript sensible à la casse.
--warn-manifest-validation Traite les erreurs de validation du fichier manifeste comme des avertissements.
--exclude-configs qualifier[,qualifier[..]] Exclut les valeurs des ressources dont les configurations contiennent les qualificatifs spécifiés.
--debug-mode Insère android:debuggable="true" dans le nœud d'application du fichier manifeste, ce qui permet de déboguer l'application même sur les appareils de production.
--strict-visibility N'autorise pas les superpositions avec différents niveaux de visibilité.
--exclude-sources Ne sérialise pas les informations du fichier source lorsque vous générez des ressources au format Protobuf.
--trace-folder folder Génère un fragment de trace JSON systrace dans le folder spécifié.
--merge-only Fusionne uniquement les ressources sans valider les références. Cet indicateur ne doit être utilisé qu'avec l'indicateur --static-lib.
-h Affiche le menu d'aide.
-v Permet un plus grand niveau de verbosité de la sortie.

Dump

dump permet d'afficher des informations sur l'APK que vous avez généré à l'aide de la commande link.

Syntaxe du vidage

La syntaxe générale liée à l'utilisation de dump pour le vidage est la suivante :

aapt2 dump sub-command filename.apk [options]

L'exemple suivant affiche le contenu de la table de ressources du fichier APK spécifié :

aapt2 dump resources output.apk

Sous-commandes du vidage

Spécifiez l'une des sous-commandes suivantes avec la commande dump :

Tableau 4. Sous-commandes du vidage

Sous-commandeDescription
apc Affiche le contenu du conteneur AAPT2 (APC) généré lors de la compilation.
badging Affiche les informations extraites du fichier manifeste de l'APK.
configurations Affiche toutes les configurations utilisées par une ressource dans l'APK.
overlayable Affiche les ressources superposables de l'APK.
packagename Affiche le nom de package de l'APK.
permissions Affiche les autorisations extraites du fichier manifeste de l'APK.
strings Affiche le contenu du groupe de chaînes de la table des ressources de l'APK.
styleparents Affiche les parents des styles utilisés dans l'APK.
resources Affiche le contenu de la table des ressources de l'APK.
xmlstrings Affiche les chaînes à partir du fichier XML compilé de l'APK.
xmltree Affiche une arborescence du fichier XML compilé de l'APK.

Options du vidage

Utilisez les options suivantes avec dump :

Tableau 5. Options du vidage

OptionDescription
--no-values Supprime la sortie des valeurs lors de l'affichage de la ressource.
--file file Spécifie un fichier comme argument à supprimer de l'APK.
-v Augmente le niveau de verbosité de la sortie.

Diff

Utilisez diff pour comparer deux APK et identifier leurs différences.

Syntaxe de diff

La syntaxe générale de diff est la suivante :

aapt2 diff first.apk second.apk

Il n'existe aucune option pour la commande diff.

Optimisation

optimize permet d'exécuter des optimisations sur les ressources fusionnées et resources.arsc avant qu'elles ne soient empaquetées dans l'APK. Cette optimisation peut réduire la taille des APK d'environ 1 à 3 %, en fonction de la taille et du nombre de ressources utilisées.

Syntaxe de l'optimisation

La syntaxe générale liée à l'utilisation d'optimize pour l'optimisation est la suivante :

aapt2 optimize options file[,file[..]]

L'exemple suivant optimise les ressources dans input.apk et crée un APK optimisé dans output.apk. Il remplace la représentation de table statique habituelle par une arborescence de recherche binaire plus compacte, ce qui réduit le nombre de fichiers APK au détriment des performances de récupération :

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

Options de l'optimisation

Vous pouvez utiliser les options suivantes avec optimize :

Tableau 6. Options de l'optimisation

OptionDescription
-o path Spécifie le chemin de sortie pour l'APK de ressources associées.

Cet indicateur est obligatoire, car vous devez spécifier le chemin d'accès à l'APK de sortie pouvant contenir les ressources associées.

-d directory Spécifie le chemin d'accès au répertoire de sortie pour les divisions.
-x path Indique le chemin d'accès au fichier de configuration XML.
-p Affiche les artefacts de plusieurs APK et la sortie.
--target-densities density[,density[..]] Spécifie une liste des densités d'écran pour lesquelles l'APK est optimisé, séparées par une virgule. Toutes les ressources inutilisées sur les appareils répondant à ces densités sont supprimées de l'APK.
--resources-config-path path

Spécifie le chemin d'accès au fichier resources.cfg contenant la liste des ressources et des directives pour chaque ressource.

Format : type/resource_name#[directive][,directive]

-c config[,config[..]] Spécifie une liste de configurations à inclure, séparées par une virgule. Par défaut, toutes les configurations sont comprises.
--split path:config[,config[..]] Divise les ressources en fonction d'un ensemble de configurations pour générer une version différente de l'APK.

Vous devez spécifier le chemin d'accès à l'APK de sortie et l'ensemble des configurations.

--keep-artifacts artifact[,artifact[..]] Spécifie une liste d'artefacts à conserver, séparés par une virgule. Si aucune valeur n'est spécifiée, tous les artefacts sont conservés.
--enable-sparse-encoding Active l'encodage des entrées creuses à l'aide d'une arborescence de recherche binaire. Cette option est utile pour optimiser la taille de l'APK, mais au détriment des performances de récupération des ressources.
--collapse-resource-names Convertit les noms de ressources en une seule valeur dans le groupe de chaînes de clés. Les ressources sont exemptées à l'aide de la directive no_collapse dans un fichier spécifié par --resources-config-path.
--shorten-resource-paths Raccourcit les chemins d'accès aux ressources dans l'APK.
--resource-path-shortening-map path Spécifie le chemin d'accès vers la sortie de mise en correspondance des anciens chemins de ressources avec les chemins raccourcis.
-v Augmente le niveau de verbosité de la sortie.
-h Affiche l'aide de l'outil.

Conversion

Par défaut, la commande AAPT compile compile les ressources dans un format binaire adapté aux APK. Vous pouvez également définir un format protobuf adapté aux AAB en spécifiant --proto-format. La commande convert convertit les APK dans les deux formats.

Syntaxe de la conversion

La syntaxe générale liée à l'utilisation de convert pour la conversion est la suivante :

aapt2 convert -o output-file options file[,file[..]]

L'exemple suivant convertit les ressources dans input.apk et crée un APK dans output.apk contenant des ressources au format protobuf. Il remplace la représentation de table statique habituelle par une arborescence de recherche binaire plus compacte, ce qui réduit le nombre d'APK au détriment des performances de récupération :

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

Options de la conversion

Utilisez les options suivantes avec convert :

Tableau 7. Options de la conversion

OptionDescription
-o path

Spécifie le chemin de sortie pour l'APK de ressources associées.

Cet indicateur est obligatoire, car vous devez spécifier le chemin d'accès à l'APK de sortie pouvant contenir les ressources associées.

--output-format [proto|binary] Format de la sortie. Les valeurs acceptées sont proto et binary. Si le format n'est pas spécifié, la valeur par défaut est binary.
--enable-sparse-encoding Active l'encodage des entrées creuses à l'aide d'une arborescence de recherche binaire. Cette option est utile pour optimiser la taille de l'APK, mais au détriment des performances de récupération des ressources.
--keep-raw-values Conserve les valeurs d'attribut brutes dans des fichiers XML.
-v Augmente le niveau de verbosité de la sortie.
-h Affiche l'aide de l'outil.

Mode daemon

AAPT version 2.19 intègre le mode daemon pour l'envoi de commandes. Ce mode permet de saisir plusieurs commandes dans une seule session AAPT.

Syntaxe du mode daemon

Démarrez le mode daemon à l'aide de la commande suivante :

aapt2 daemon

Une fois le mode daemon en cours d'exécution, vous pouvez saisir des commandes. Chaque argument de la commande doit se trouver sur une ligne distincte. Vous devez ajouter une ligne vide à la fin de la commande. Pour quitter le mode daemon, appuyez sur Ctrl+D.

Examinez les commandes compile individuelles suivantes :

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Ces commandes peuvent être saisies en mode daemon comme suit :

aapt2 daemon
Ready
compile
project_root/module_root/src/main/res/values-en/strings.xml
-o
compiled/

Done
compile
project_root/module_root/src/main/res/drawable/myImage.png
-o
compiled/

Done
^D
Exiting daemon

Options du mode daemon

L'option unique pour le mode daemon est --trace-folder folder, qui génère un fragment de trace JSON systrace dans le fichier folder spécifié.

Version

Déterminez la version d'AAPT2 que vous utilisez avec la commande version :

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

Changements de comportement lors de l'utilisation d'AAPT2

Avant AAPT2, AAPT était la version par défaut d'Android Asset Packaging Tool, qui est désormais obsolète. Même si AAPT2 devrait fonctionner immédiatement avec les projets plus anciens, cette section décrit certains changements de comportement que vous devez connaître.

Hiérarchies des éléments dans le fichier manifeste Android

Dans les versions précédentes d'AAPT, les éléments imbriqués dans des nœuds incorrects du fichier AndroidManifest.xml étaient ignorés ou entraînaient un avertissement. Par exemple :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>

Les versions précédentes d'AAPT ignorent simplement la balise <action> mal placée.

Avec AAPT2, vous recevez l'erreur suivante :

AndroidManifest.xml:15: error: unknown element <action> found.

Pour résoudre le problème, assurez-vous que les éléments de votre fichier manifeste sont correctement imbriqués. Pour en savoir plus, consultez la présentation du fichier manifeste d'application.

Déclaration de ressources

Vous ne pouvez plus indiquer le type d'une ressource dans l'attribut name. Dans l'exemple suivant, un élément de ressource attrest déclaré de façon incorrecte :

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

La déclaration d'un type de ressource de cette manière génère l'erreur de compilation suivante :

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

Pour résoudre cette erreur, déclarez explicitement le type à l'aide de type="attr" :

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

En outre, lorsque vous déclarez un élément <style>, son parent doit également être un type de ressource de style. Sinon, vous obtiendrez un message d'erreur semblable à celui-ci :

Error: (...) invalid resource type 'attr' for parent of style

Utilisation incorrecte des symboles de référence de ressource @

AAPT2 génère des erreurs de compilation lorsque vous omettez ou que vous placez de manière incorrecte des symboles de référence de ressource (@). Voici un exemple dans lequel le symbole a été omis au moment de spécifier un attribut de style :

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

Lors de la compilation du module, AAPT2 génère l'erreur de compilation suivante :

ERROR: expected color but got (raw string) color/colorPrimary

De plus, si vous incluez le symbole de manière incorrecte lorsque vous accédez à une ressource depuis l'espace de noms android :

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

Lors de la compilation du module, AAPT2 génère l'erreur de compilation suivante :

Error: style attribute '@android:attr/windowEnterAnimation' not found

Configuration incorrecte des bibliothèques

Si votre application dépend d'une bibliothèque tierce compilée à l'aide d'anciennes versions d'Android SDK Build Tools, elle risque de planter au moment de l'exécution sans afficher d'erreurs ni d'avertissements. Ce plantage peut se produire, car lors de la création de la bibliothèque, les champs R.java sont déclarés comme étant final. Par conséquent, tous les ID de ressources sont intégrés dans les classes de la bibliothèque.

AAPT2 repose sur la possibilité de réattribuer des ID aux ressources de la bibliothèque lorsque vous créez votre application. Si la bibliothèque suppose que les ID sont final et les intègre dans le DEX de la bibliothèque, il y aura une incompatibilité d'exécution.

Pour résoudre cette erreur, contactez l'auteur de la bibliothèque afin qu'il la recompile à l'aide de la dernière version d'Android SDK Build Tools, puis qu'il la republie.