Réduction de la taille des APK à l'aide de R8 et ProGuard

  • Mise en œuvre de R8 et ProGuard pour la suppression du code mort et l'obfuscation des classes.
  • Utilisation des Android App Bundles pour optimiser la distribution des ressources en fonction de l'appareil de l'utilisateur.
  • Remplacer les ressources volumineuses par des formats efficaces tels que WebP et les images vectorielles.
  • Configuration des modules dynamiques pour télécharger les fonctionnalités à la demande.

Réduction de la taille des APK à l'aide de R8 et ProGuard

À mesure que nos applications s'enrichissent de nouvelles fonctionnalités et gagnent en complexité, il est fréquent que leur taille finale augmente considérablement. C'est un problème majeur, car une application trop volumineuse dissuade de nombreux utilisateurs de cliquer sur le bouton d'installation, voire les amène à interrompre le téléchargement en cours de route. De plus, une application volumineuse occupe davantage d'espace de stockage sur le téléphone et peut, à terme, impacter la réactivité du système.

Pour éviter que votre projet ne devienne une application trop volumineuse, plusieurs stratégies existent, du nettoyage du code à l'optimisation des images. Dans cet article, nous verrons comment utiliser des outils comme R8 et ProGuard , ainsi que la puissance des App Bundles, pour rendre votre application aussi légère et rapide que possible, et garantir son bon fonctionnement même sur les appareils bas de gamme.

Comprendre ce qui compte vraiment dans votre application

Avant de commencer, il est essentiel de savoir où se trouve la majeure partie des données. La taille d'une application se divise généralement en quatre blocs principaux. Premièrement, le bytecode Java ou Kotlin et ses bibliothèques, qui représentent généralement 30 à 40 %. Viennent ensuite les ressources telles que les mises en page et les animations , d'une taille similaire. On trouve également les bibliothèques natives (C/C++) compilées pour différentes architectures (15 à 25 %), et enfin, les fichiers bruts (5 à 15 %).

Pour éviter les approximations, il est préférable d'utiliser l'analyseur APK d'Android Studio (accessible via le menu Générer > Analyser l'APK). Cet outil permet de visualiser précisément la taille des classes DEX, du dossier de ressources et des bibliothèques natives, et ainsi de comparer les versions actuelles avec les précédentes afin d'identifier les modifications ayant entraîné une augmentation de la taille du fichier. Pour approfondir ce sujet, il est utile de comprendre l' arborescence des fichiers sous Android et leur organisation.

Nettoyage du code : Le passage de ProGuard à R8

La réduction de code est sans conteste la méthode la plus efficace pour gagner du temps. C'est là qu'interviennent ProGuard et son successeur moderne, R8. ProGuard a longtemps été la référence, se chargeant de supprimer les classes, champs et méthodes inutilisés , d'optimiser le bytecode et d'obfusquer les noms pour les raccourcir (et les rendre plus difficiles à lire pour quiconque tenterait de pirater votre code).

APK, AAB et APKM
Article connexe :
Guide avancé sur les différences entre les formats APK, AAB et APKM sur Android : tout ce que vous devez savoir pour installer des applications comme un pro

Aujourd'hui, R8 est le compilateur par défaut et offre les mêmes fonctionnalités que ProGuard, mais en bien mieux et plus rapidement. R8 implémente une élimination du code mort (tree shaking) plus performante , fusionne les classes aux fonctions similaires et optimise les énumérations en les convertissant en entiers. De plus, il permet la désucrage pour utiliser les fonctions modernes de Java 8 sur les anciennes versions d'Android.

Configuration technique dans build.gradle

Pour activer ces optimisations dans la version finale, vous devez configurer le fichier de compilation en définissant minifyEnabled est vrai et en liant les fichiers de règles. Il est essentiel d'utiliser proguard-android-optimize.txt pour tirer pleinement parti des optimisations. Un exemple de configuration de base comprendrait maintenir les classes d'application ou ceux notés avec @Keep pour éviter que R8 ne les supprime accidentellement.

Gestion des règles pour les bibliothèques externes

Parfois, R8 est trop efficace et supprime le code utilisé par réflexion, ce qui provoque des erreurs telles que : ClassNotFoundExceptionC'est pourquoi les librairies comme Retrofit, OkHttp ou Gson requièrent des règles spécifiques.Par exemple, avec Gson, il est essentiel de préserver les noms de champs dans les modèles de données afin que la désérialisation JSON ne rencontre pas d'erreur. Si vous rencontrez des erreurs après l'obfuscation, le fichier mapping.txt C'est votre meilleur allié pour traduire les traces de pile et savoir où la panne s'est produite.

Est-il possible de créer un APK sans être programmeur ?
Article connexe :
Différences entre APKM, APKS et XAPK : Guide complet des formats d'installation Android

Optimisation intelligente des ressources

Les ressources sont souvent l'endroit où l'espace est le plus gaspillé. Une technique simple mais puissante consiste à activer réduire les ressources dans le fichier build.gradle. Cela supprime les fichiers qui ne sont pas référencés dans le code, mais il est important de savoir que si vous appelez une ressource dynamiquement à l'aide de getIdentifierVous devrez le déclarer dans un fichier conserver.xml pour qu'il ne disparaisse pas.

Images et graphismes : Moins, c'est plus

Le format PNG est responsable d'un poids inutilement important. Il est désormais recommandé de tout migrer vers le format WebP , qui offre une compression bien supérieure tout en préservant la qualité. Vous pouvez effectuer cette conversion directement dans Android Studio en cliquant avec le bouton droit sur l'image. Pour les icônes et les formes simples, les Vector Drawables sont idéaux ; un seul fichier XML remplace cinq versions de densités différentes, simplifiant la maintenance et réduisant la taille des fichiers.

Réduction des langues et des densités

De nombreuses bibliothèques externes sont fournies avec des traductions dans 50 langues que votre application ne prend probablement pas en charge. Pour résoudre ce problème, utilisez la propriété resConfigs dans defaultConfigen ne spécifiant que les langues que vous utilisez réellement (par exemple, "es", "en"De même, vous pouvez limiter les densités d'écran incluses si vous savez que votre public cible utilise des appareils modernes, en supprimant les ressources ldpi ou mdpi que plus personne n'utilise.

Extraire l'APK des applications
Article connexe :
Guide complet pour extraire un fichier APK d'une application Android : options, sécurité et tutoriels

Stratégies de distribution avancées

Pour réduire durablement la taille des fichiers APK, il est conseillé d'abandonner les APK universels et de privilégier les Android App Bundles (.aab) . Au lieu d'envoyer un fichier volumineux contenant toutes les fonctionnalités, Google Play génère un APK optimisé pour chaque appareil. Ainsi, un utilisateur disposant d'un téléphone ARM64 et d'un écran xxhdpi ne téléchargera que les éléments nécessaires à son matériel , réduisant ainsi la taille du téléchargement jusqu'à 40 %.

Modules de fonctions dynamiques et applications instantanées

Il n'est pas nécessaire que tout le code soit disponible dès le départ. Grâce aux modules de fonctionnalités dynamiques , vous pouvez séparer certaines parties de l'application (comme un éditeur photo avancé ou un mode hors ligne) afin qu'elles ne soient téléchargées que lorsque l'utilisateur accède à la fonctionnalité correspondante. Par ailleurs, les applications instantanées permettent aux utilisateurs de tester votre application sans l'installer, en chargeant un module de base extrêmement léger via une URL ou le bouton Google Play.

Audit des dépendances et détails finaux

Parfois, le problème ne vient pas de votre code, mais des éléments externes que vous importez. Des bibliothèques comme Guava ou Jackson peuvent être très volumineuses ; envisagez de les remplacer par des alternatives plus légères comme kotlinx.serialization ou Gson . Il est également conseillé d'utiliser des polices téléchargeables depuis Google Fonts plutôt que d'inclure de gros fichiers TTF dans vos ressources, ce qui peut vous faire économiser plusieurs mégaoctets si vous utilisez plusieurs variantes d'une même police.

Pour finaliser l'optimisation, n'oubliez pas qu'Android Go est un marché en pleine expansion. Si vous souhaitez que votre application fonctionne de manière optimale sur les appareils dotés de moins de 1 Go de RAM, essayez de limiter sa taille à moins de 40 Mo. L'utilisation d' Android Lint pour détecter les ressources orphelines et la mise en place d'une routine de nettoyage régulière permettront à votre application d'être performante, de s'installer rapidement et d'offrir une expérience utilisateur fluide, quelle que soit la puissance de l'appareil.

Mises à jour de sécurité Android
Article connexe :
Comment accélérer et optimiser Android au maximum : guide complet, conseils et recommandations essentielles

Ajouter comme source préférée dans Google