Analyser votre build avec l'analyseur d'APK

Android Studio inclut un analyseur d'APK qui fournit un aperçu immédiat de la composition de votre APK ou de votre Android App Bundle une fois le processus de compilation terminé. L'analyseur d'APK peut vous aider à réduire le temps passé à déboguer les problèmes liés aux fichiers et aux ressources DEX dans votre application, et à réduire la taille de votre APK. L'analyseur d'APK est également disponible à partir de la ligne de commande avec apkanalyzer.


Avec l'analyseur d'APK, vous pouvez :

  • afficher la taille absolue et relative des fichiers de l'application, tels que les fichiers de ressources DEX et Android ;
  • comprendre la composition des fichiers DEX ;
  • afficher rapidement les versions finales des fichiers dans l'application, par exemple le fichier AndroidManifest.xml ;
  • comparer deux APK ou app bundles en parallèle.

Vous pouvez accéder à l'analyseur d'APK de trois manières différentes lorsqu'un projet est ouvert :

  • Faites glisser un APK ou un app bundle dans la fenêtre Editor (Éditeur) d'Android Studio.
  • Accédez à la vue Project (Projet) dans la fenêtre Project (Projet), puis double-cliquez sur le fichier APK dans le répertoire build/output/apks/ par défaut.
  • Sélectionnez Build > Analyze APK (Build > Analyser l'APK) dans la barre de menu, puis sélectionnez votre APK ou app bundle.

Afficher les informations sur les fichiers et les tailles

Les APK sont des fichiers au format ZIP. L'analyseur d'APK affiche chaque fichier ou dossier en tant qu'entité que vous pouvez développer pour accéder aux dossiers. La hiérarchie des entités reflète la structure des fichiers et des dossiers contenus dans le fichier APK.

L'analyseur d'APK affiche la taille du fichier compressé (ou "taille du fichier brut") et la taille du fichier téléchargé pour chaque entité, comme illustré dans la figure 1. Raw File Size (Taille du fichier brut) représente la contribution de l'entité à la taille totale de l'APK. La taille de téléchargement correspond à la taille compressée estimée de l'entité telle qu'elle serait fournie par Google Play. Le % de la taille de téléchargement totale indique le pourcentage de la taille de téléchargement totale de l'APK représentée par l'entité.

Figure 1 : Tailles de fichier dans l'analyseur d'APK

Afficher le fichier AndroidManifest.xml

Si votre projet comprend plusieurs fichiers AndroidManifest.xml (pour différents types de produit, par exemple) ou des bibliothèques qui fournissent également un fichier manifeste, ils sont fusionnés en un seul fichier dans votre application. Ce fichier manifeste est normalement un fichier binaire dans l'APK ou l'app bundle, mais sa forme XML est reconstruite et présentée lorsqu'il est sélectionné dans l'analyseur d'APK.

Cette visionneuse vous permet de comprendre toutes les modifications qui ont pu être apportées à votre application pendant la compilation. Par exemple, vous pouvez voir comment le fichier AndroidManifest.xml d'une bibliothèque dont dépend votre application est fusionné dans le fichier AndroidManifest.xml final.

En outre, cette visionneuse offre des fonctionnalités lint. Les avertissements ou les erreurs potentiels s'affichent en haut à droite. La figure 2 illustre une erreur signalée pour le fichier manifeste sélectionné.

Figure 2. Une icône d'erreur s'affiche en haut à droite du fichier manifeste sélectionné

Afficher les fichiers DEX

La visionneuse de fichiers DEX de l'analyseur d'APK vous permet d'accéder immédiatement aux informations sous-jacentes du ou des fichiers DEX de votre application. Le nombre de classes, de packages, de références totales et de déclarations est indiqué dans la visionneuse, ce qui permet de déterminer s'il faut utiliser multidex ou supprimer les dépendances pour respecter le plafond de 64 000 DEX.

La figure 3 illustre une application de taille moyenne qui respecte le plafond de 64 000 DEX. Chaque package, classe et méthode du fichier DEX est répertorié dans les colonnes Defined Method (Méthodes définies) et Referenced Methods (Méthodes référencées).

La colonne Referenced Methods (Méthodes référencées) comprend toutes les méthodes référencées par le fichier DEX. Sont généralement incluses les méthodes définies dans votre code, les bibliothèques de dépendances et les méthodes définies dans les packages Java et Android standard utilisés par le code. Ces méthodes sont comptabilisées dans la limite de 64 000 méthodes par fichier DEX.

La colonne Referenced Methods (Méthodes définies) ne compte que les méthodes définies dans l'un de vos fichiers DEX. Ce nombre constitue donc un sous-ensemble de Referenced Methods (Méthodes référencées).

Figure 3. Application de taille moyenne

Filtrer l'arborescence de fichiers DEX

Juste au-dessus de la liste Class (Classe), l'analyseur d'APK propose des filtres pour afficher le contenu du fichier DEX sélectionné, comme l'illustre la figure 4.

Figure 4. Filtres DEX définis pour afficher les champs et les méthodes pour BuildConfig

Pour afficher toutes les méthodes et tous les champs d'une classe à l'aide des filtres, procédez comme suit :

  1. Dans la liste File (Fichier), sélectionnez le fichier classes.dex.
  2. Dans la liste Class (Classe), sélectionnez une classe.
  3. Développez la classe que vous avez sélectionnée.
  4. Cliquez sur Show fields (Afficher les champs) pour afficher ou masquer les champs de la classe.
  5. Cliquez sur Show methods (Afficher les méthodes) pour afficher ou masquer les méthodes de la classe.
  6. Activez ou désactivez Show all referenced methods or fields (Afficher tous les champs ou méthodes référencés) pour afficher ou masquer les packages, classes, méthodes et champs référencés.

    Dans l'arborescence, les nœuds en italique sont des références qui ne sont pas définis dans le fichier DEX sélectionné. Un fichier DEX peut faire référence à des méthodes et à des champs définis dans un autre fichier. Par exemple, System.out.println() est une référence à la méthode println() dans le framework Android.

Charger les mappages ProGuard

Les icônes de mappage ProGuard s'affichent à côté des icônes de filtrage. Elles sont grisées jusqu'à ce que vous chargiez un ensemble de fichiers de mappage ProGuard qui ajoutent des fonctionnalités à la visionneuse DEX, telles que le désobscurcissement des noms (mapping.txt), l'affichage des nœuds supprimés (usage.txt) et l'identification des nœuds qui ne peuvent pas être supprimés (seeds.txt).

Le fichier de mappage ProGuard que vous importez doit provenir du même build que celui qui a généré les fichiers DEX, avec activation de la minification du code.

Figure 5. Chargement des mappages ProGuard

Pour charger les fichiers de mappage ProGuard, procédez comme suit :

  1. Cliquez sur Load Proguard Mappings (Charger des mappages ProGuard).
  2. Accédez au dossier du projet qui contient les fichiers de mappage, puis chargez tous les fichiers, toute combinaison de ces fichiers ou le dossier contenant les fichiers.

    Les fichiers de mappage se trouvent en principe dans project/app/build/outputs/mappings/release/. Le sélecteur de fichier utilise par défaut le dossier Release (Version) s'il détecte la structure de ce projet.

    Tout d'abord, le sélecteur de fichier recherche les noms de fichiers correspondant exactement à mapping.txt, seeds.txt et usage.txt. Ensuite, il recherche les noms de fichiers contenant le texte mapping, usage ou seeds et se terminant par .txt (par exemple, release-seeds-1.10.15.txt).

La liste suivante décrit les fichiers de mappage :

  • seeds.txt : les nœuds que la configuration ProGuard empêche de supprimer lors du rétrécissement sont affichés en gras.
  • mapping.txt : active le désobscurcissement des noms , ce qui vous permet de restaurer les noms d'origine des nœuds obscurcis par R8. Par exemple, vous pouvez restaurer des noms de nœuds obscurcis tels que a, b, c vers MyClass, MainActivity et myMethod().
  • usage.txt : active l'option Afficher les nœuds supprimés pour que vous puissiez afficher les classes, les méthodes et les champs supprimés par R8 lors du rétrécissement. Les nœuds restaurés sont barrés.

    Pour en savoir plus sur l'utilisation de R8 pour obscurcir et minimiser votre code, consultez la section Réduire, obscurcir et optimiser votre application.

Afficher le bytecode, rechercher des utilisations et générer une règle Keep

Les nœuds de la liste Class (Classe) disposent d'un menu contextuel proposant les options suivantes, qui vous permettent d'afficher le bytecode, de connaître les utilisations et d'afficher une boîte de dialogue avec les règles ProGuard que vous pouvez copier et coller pour le nœud sélectionné. Faites un clic droit sur un nœud de la liste Class (Classe) pour afficher son menu contextuel.

Show bytecode (Afficher le bytecode) : décompile la classe, la méthode ou le champ sélectionné, et affiche la représentation du bytecode Smali (plutôt qu'en code Java) dans une boîte de dialogue comme ceci :

Figure 6. Bytecode DEX pour la méthode init

Find usages (Trouver des utilisations) : indique les autres parties du code DEX qui font référence à la classe ou à la méthode sélectionnée (figure 7). Si vous avez chargé seeds.txt, les nœuds en gras indiquent que la configuration ProGuard empêche leur suppression lors de la minification :

Figure 7. Références à MyClass

Generate Proguard Keep rule (Générer la règle ProGuard Keep) : affiche les règles ProGuard que vous pouvez copier et coller dans le fichier de configuration ProGuard de votre projet. Cela empêche la suppression d'un package, d'une classe, d'une méthode ou d'un champ spécifique pendant la phase de minification de code. Pour en savoir plus, consultez Personnaliser le code à conserver.

Figure 8. Règles ProGuard que vous pouvez copier depuis la boîte de dialogue dans votre fichier de configuration ProGuard

Afficher les entités de code et de ressources

Plusieurs tâches de compilation modifient les entités finales dans une application. Par exemple, les règles de réduction de ProGuard peuvent modifier votre code final et les ressources images peuvent être remplacées par des ressources dans un type de produit.

Pour afficher la version finale de vos fichiers avec l'analyseur d'APK, cliquez sur l'entité afin de générer un aperçu de l'entité de texte ou d'image, comme illustré à la figure 9.

Figure 9. Aperçu de la ressource d'image finale

L'analyseur d'APK peut également afficher différents fichiers texte et binaires. Par exemple, le lecteur d'entité resources.arsc vous permet d'afficher les valeurs spécifiques à la configuration, telles que les traductions pour une ressource de chaîne. La figure 10 expose les traductions pour chaque ressource de chaîne.

Figure 10. Aperçu des ressources de chaîne traduites

Comparer des fichiers

L'analyseur d'APK peut comparer la taille des entités dans deux fichiers APK ou app bundles différents. C'est utile lorsque vous devez comprendre pourquoi la taille de votre application a augmenté par rapport à une version précédente.

Avant de publier une application mise à jour, procédez comme suit :

  1. Chargez la version de l'application que vous allez publier dans l'analyseur d'APK.
  2. Dans l'angle supérieur droit de l'analyseur d'APK, cliquez sur Compare with previous APK (Comparer à un fichier APK précédent).
  3. Dans la boîte de dialogue de sélection, recherchez l'artefact publié en dernier, puis cliquez sur OK.

    Une boîte de dialogue semblable à celle de l'image 11 s'affiche pour vous aider à évaluer l'effet que la mise à jour peut avoir sur les utilisateurs.

L'image 11 montre la différence entre le build de débogage et le build final d'une application spécifique. Différentes options de build sont utilisées entre ces types de compilation, avec des répercussions différentes sur les entités sous-jacentes.

Figure 11. Différence entre un APK de débogage et un APK final