Android : activer Proguard sur un projet Xamarin

Vous connaissez sûrement déjà le linker de Xamarin qui permet d'enlever les bouts de code non utilisé de votre .Net et ainsi réduire la taille de votre package final. Proguard est son équivalent pour la partie Java qui se trouve dans votre application Android. Découvrons comment l'activer sur un projet.

 

Pourquoi activer Proguard ?

Cela présente de nombreaux avantages :

  • Taille du package réduit : téléchargement plus rapide et votre application restera plus longtemps sur le téléphone de l'utilisateur.
  • Consommation mémoire réduite : moins d'éléments sont chargés en mémoire. 
  • Démarrage plus rapide : moins d'éléments sont à charger en mémoire au démarrage.
  • Optimisations diverses : Proguard en profite notamment pour inliner des méthodes si possibles.

Un autre avantage probant est la réduction du nombre de méthodes et potentiellement cela vous permet de ne pas avoir à faire de multi-dexing. Vu les problèmes que j'ai pu rencontrer par le passé, je trouve que c'est un GROS avantage.

 

En soi, Proguard permet aussi de faire de l'obfuscation de code mais Xamarin empêche (techniquement) cela et vous devrez passer par Dotfuscator si cela est votre besoin.

Activation de Proguard

Pour les personnes ciblant Android 7.0 ou plus, il faudra penser à mettre à jour la version installée avec le SDK pour celle supportant le JDK 1.8.Pour cela, téléchargez Proguard (sur SourceForge) et remplacer le dossier lib du dossier "tools/Proguard" de votre SDK par le dossier lib de la dernière version téléchargée.

 

Il suffit ensuite de se rendre dans les propriétés du projet de cocher la case correspondante : enable Proguard. Il est aussi nécessaire d'activer le linker (au moins sur la valeur "Sdk Assemblies").

enableProguard.PNG

 

Configuration

Par défaut Xamarin va générer la configuration nécessaire en indiquant que les classes de votre projets ou celles utilisées sont à garder pour que Proguard ne les supprime pas. Vous pouvez trouver la configuration générée dans le dossier "obj/Proguard" après une compilation.

 Il reste cependant nécessaire de personnaliser le comportement dans le cas d'utilisation de librairies tierces. Cela est par exemple le cas lorsque vous utilisez le SDK Google AdMob. Il faudra alors ajouter un fichier "proguard.cfg" (le nom importe peu en réalité) et le définir comme fichier de configuration Proguard dans le panneau de propriétés de Visual Studio :

config.PNG

Ce fichier permet alors d'ajouter des régles à celles par défaut (qui ne sont donc pas écrasées). La liste compléte des règles est disponible sur le site de l'éditeur et nous verrons des exemples plus loin dans cet article.

 Attention, par défaut les fichiers créés par Visual Studio ne sont pas dans un format compréhensible par Proguard et il faudra alors sauvegarder le fichier via un autre outil en spécifiant de ne pas mettre le BOM UTF8. Cela peut être fait avec Notepad++ dans le menu Encodage.

 

Vous pouvez ensuite compiler votre projet et découvrir le résultat. Voici quelques problèmes rencontrés dans mon cas :

 

Démarche pour résoudre les problèmes liés à Proguard 

La première des choses consiste à activer un mode de log plus détaillé pour MsBuild. La démarche compléte était déjà décrite dans un article précédent que je vous laisse relire : http://blogs.infinitesquare.com/posts/mobile/android-la-limite-des-65536-references-multi-dex-et-le-mettre-en-place-avec-xamarin-et-visualstudio 

 

L’erreur « aaa.BBB.ccc unexpectedly contains class aaa.bbb.ccc»

Celle-ci m'a fait perdre pas mal de temps alors qu'il s'agit au final d'un problème de case. Il faut en effet faire bien attention d'utiliser la même case partout lorsque vous déclarez vos éléments. Dans mon cas je déclarais un service avec des majuscules dans le nom complet et cela me cassait la compilation. Au lieu de cela :

[Service(Enabled = true, Exported = true, Name = "aaa.bbb.CCC.ddd")]

Il faut donc préférer ceci:

[Service(Enabled = true, Exported = true, Name = "aaa.bbb.ccc.ddd")]

 

La règle pour s'assurer d'avoir juste est de vérifier que cela correspond bien au namespace par défaut défini dans les propriétés de notre application. 

Erreur lors de l’ajout du framework Google Ads

Celle-ci est plus simple à corriger, il suffit d'ajouter une régle stipulant à Proguard d'ignorer les problèmes correspondant à cette librairie. On ajoute donc cette ligne dans un fichier de configuration ajouté au préalable :

# Google Play Services
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**

 

Happy coding :)

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus