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 :
- Dans l'index du dépôt, accédez à com.android.tools.build > aapt2.
- Copiez le nom de la dernière version d'AAPT2.
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.
Accédez à l'URL dans un navigateur. Le téléchargement de l'application AAPT2 devrait bientôt commencer.
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 :
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
De plus, tous les fichiers PNG sont écrasés par défaut et adoptent les extensions |
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 :
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 |
-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 |
-source-path path
|
Définit le chemin d'accès au fichier source du fichier de ressources compilé sur |
-h
|
Affiche l'aide des outils. |
-v
|
Active la journalisation détaillée. |
Association
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.
Syntaxe de l'association
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
Options de l'association
Vous pouvez utiliser les options suivantes avec la commande link
:
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 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
|
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 Cette option ne doit être utilisée que pour les packages dotés de la version |
--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 |
--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 |
-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
:
Sous-commande | Description |
---|---|
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
:
Option | Description |
---|---|
--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
:
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. |
-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 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
:
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. |
--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 attr
est 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.