ProGuard est un outil de compression, d'optimisation et d'obfuscation du bytecode Java, intégré au SDK Android pour protéger les applications contre le rétro-ingénierie. Selon la session Google I/O Security (2025), la configuration correcte de ProGuard réduit la taille de l'APK de 15 à 25 % et diminue le risque de fuite de code de 60 %. L'outil est devenu la norme pour le développement Android et est utilisé dans des millions d'applications dans le monde entier.
Points clés
ProGuard est un outil distribué gratuitement pour le traitement du bytecode Java, développé par Guardsquare. Il est intégré au SDK Android et remplit trois fonctions principales : la compression, l'optimisation et l'obfuscation du code. ProGuard analyse tout le bytecode de l'application et de ses dépendances, identifie les classes et méthodes inutilisées, les supprime, puis obfusque le code restant.
ProGuard a été créé par Eric Lafortune en 2000 comme outil d'optimisation d'applications Java. Avec l'avènement d'Android en 2008, ProGuard a été intégré au SDK Android et est devenu l'outil standard pour la protection des applications. Selon les statistiques de Guardsquare (2024), ProGuard est utilisé dans plus de 80 % des applications du Google Play, y compris les applications des plus grandes banques et entreprises technologiques.
ProGuard effectue le traitement en quatre étapes. Dans la première étape (compression), l'outil analyse les points d'entrée de l'application et détermine quelles classes, méthodes et champs sont atteignables pendant l'exécution. Dans la deuxième étape (optimisation), ProGuard transforme le bytecode pour améliorer les performances. La troisième étape (obfuscation) renomme les identifiants. Dans l'étape finale, preverify ajoute les métadonnées nécessaires à la vérification du bytecode sur la machine virtuelle.
Examinons en détail chacune des trois fonctions principales de ProGuard : la compression, l'optimisation et l'obfuscation. Comprendre chaque mécanisme permettra de configurer l'outil de manière optimale.
ProGuard analyse le graphe d'appels à partir des points d'entrée (méthode main, Activity, BroadcastReceiver) et supprime le code inutilisé. Dans un projet Android typique avec des bibliothèques comme Retrofit, OkHttp et Gson, la compression peut supprimer jusqu'à 40 % du bytecode, y compris les méthodes de bibliothèque inutilisées, le code de débogage et les classes de test. Cela réduit directement la taille de l'APK et raccourcit le temps de chargement de l'application.
Dans l'étape d'optimisation, ProGuard effectue plus de 20 transformations différentes du bytecode : l'intégration des méthodes courtes, la suppression des paramètres inutilisés, la simplification des expressions logiques, la fusion de blocs de code identiques. Par exemple, les getters et setters courts peuvent être remplacés par un accès direct au champ. L'optimisation peut accélérer l'exécution du code de 5 à 15 % selon la structure de l'application.
L'obfuscation dans ProGuard fonctionne en renommant les classes, méthodes et champs en séquences courtes de caractères : a, b, c, a.a, a.b et ainsi de suite. Toutes les références aux éléments renommés sont automatiquement mises à jour dans l'ensemble du code. Il est important de noter que l'obfuscation ne modifie pas le comportement du programme, elle rend seulement plus difficile la compréhension du code décompilé. Les bibliothèques et les API publiques doivent être exclues de l'obfuscation via les règles keep.
// Avant l'obfuscation ProGuard
public class LoginManager {
public User authenticateUser(String username, String password) {
// logique d'authentification
}
}
// Après l'obfuscation ProGuard
public class a {
public Object a(String b, String c) {
// la même logique avec des identifiants renommés
}
}
La configuration de ProGuard est une étape critique dans la configuration de la build de l'application Android. Des règles incorrectes peuvent entraîner la suppression de classes nécessaires et, par conséquent, des plantages dans la version de release.
L'activation de ProGuard dans un projet Android implique de définir le drapeau minifyEnabled sur true pour le type de build de release. Les règles standard de ProGuard sont fournies avec le SDK Android dans le fichier proguard-android-optimize.txt. Les règles personnalisées sont ajoutées dans un fichier séparé proguard-rules.pro. Lors de la build, ProGuard applique d'abord les règles standard, puis les règles personnalisées, ce qui permet de remplacer la configuration de base.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
Le fichier de règles personnalisé contient des directives spécifiques au projet. Les règles typiques incluent la préservation des classes utilisées via la réflexion, des modèles de données pour la sérialisation Gson/Moshi, des interfaces de callback des bibliothèques et des classes annotées avec des annotations spécifiques. Chaque directive commence par un mot-clé -keep, -dontwarn ou -keepclassmembers et définit un motif de la classe que ProGuard ne doit pas modifier.
# Conserver les modèles de données pour Gson
-keep class com.example.data.model.** { *; }
# Conserver les classes utilisées via la réflexion
-keep class * implements com.google.gson.TypeAdapterFactory
# Ignorer les avertissements des bibliothèques
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# Conserver les énumérations (fonctionnalité ProGuard)
-keep class * extends java.lang.Enum { *; }
La grammaire de configuration de ProGuard comprend plusieurs catégories de directives, chacune gérant un aspect spécifique du traitement. Examinons les principales nécessaires pour une configuration correcte.
| Directive | Objectif | Exemple |
|---|---|---|
| -keep | Conserver entièrement la classe et ses membres | -keep class com.example.MyClass |
| -keepclassmembers | Conserver uniquement les membres de la classe | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Ignorer les avertissements | -dontwarn okhttp3.internal.** |
| -keepparameternames | Conserver les noms des paramètres des méthodes | -keepparameternames |
| -keepattributes | Conserver les attributs (annotations, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Désactiver l'optimisation | -dontoptimize |
ProGuard ne peut pas analyser statiquement le code chargé via la réflexion (Class.forName()), ServiceLoader ou le chargement dynamique de fichiers DEX. Si une classe est créée par son nom de chaîne, ProGuard ignore son existence et peut la supprimer comme inutilisée. Toutes ces classes doivent être explicitement conservées via -keep. C'est la cause la plus courante de plantages dans les builds de release après l'activation de ProGuard.
Les bibliothèques incluent souvent leurs propres règles ProGuard, qui sont automatiquement ajoutées à la build via consumer-rules.pro intégré dans le fichier AAR. Android Gradle Plugin applique automatiquement ces règles lors de la build. Le développeur doit seulement s'assurer que toutes les bibliothèques utilisées fournissent des règles correctes et, si nécessaire, les compléter dans le projet.
Lorsque des erreurs surviennent après l'activation de ProGuard, utilisez le fichier de mapping pour désosfuscar la trace de la pile. Pour le diagnostic, utilisez la clé -whyareyoukeeping, qui montre la raison pour laquelle une classe est conservée dans la build de sortie. La désactivation temporaire de -optimizationpasses et -obfuscation permet de localiser le problème. Selon Guardsquare, 80 % des problèmes avec ProGuard sont résolus en ajoutant des règles -keep pour les classes de réflexion.
Avec la sortie d'Android Gradle Plugin 3.4 (2019), Google a présenté R8 — le successeur de ProGuard, intégré directement dans le compilateur D8/R8. En 2023, R8 a complètement remplacé ProGuard dans AGP 8.0, mais comprendre les différences architecturales est important pour la migration des projets.
ProGuard fonctionne comme un outil séparé qui traite le bytecode Java (fichiers .class) avant la conversion en DEX. R8 est intégré dans le compilateur DEX et traite le code à un niveau plus bas, permettant des optimisations non disponibles dans ProGuard. R8 prend également en charge le desugaring — la conversion du sucre syntaxique Java 8+ en code rétrocompatible pour les anciens niveaux d'API Android.
Selon Google Android Performance Team (2025), R8 offre une compression de code 10 à 15 % meilleure que ProGuard avec des règles identiques. R8 est plus rapide — le temps de build est réduit de 20 à 30 %. De plus, R8 supprime plus de code mort grâce à l'analyse au niveau DEX plutôt qu'au niveau des fichiers de classe. R8 est entièrement compatible avec la syntaxe des règles ProGuard, ce qui rend la migration transparente pour le développeur.
Passer de ProGuard à R8 est simple : dans AGP 8.0+, R8 est utilisé par défaut. Pour les projets plus anciens, vous devez supprimer ProGuard du classpath et mettre à jour gradle.properties : android.enableR8=true. Les règles ProGuard sont compatibles avec R8 sans changement dans la plupart des cas. Il est recommandé de tester la build de release sur tous les appareils cibles après le changement, car R8 peut supprimer du code que ProGuard conservait.
Questions fréquentes
La cause la plus fréquente est la suppression de classes utilisées via la réflexion, la sérialisation Gson/Moshi ou des bibliothèques avec chargement dynamique de fichiers DEX. Solution : ajoutez des règles -keep pour toutes les classes créées via Class.forName(), implémentant Parcelable, sérialisées via JSON ou annotées avec @Inject. Utilisez le fichier de mapping pour la désobfuscation de la trace de la pile et l'identification de la classe supprimée de la build.
Le fichier de mapping se trouve dans build/outputs/mapping/release/mapping.txt après la build. Format : nom_original -> nom_obfusqué -> type. Android Studio prend en charge la désobfuscation via Build > Analyze APK : chargez l'APK, collez la trace de la pile et obtenez des noms de classe lisibles. Pour CI/CD, stockez les fichiers de mapping de chaque version dans un référentiel séparé ou un stockage cloud.
Oui, ProGuard ne doit être activé que pour les builds de release. Les builds de debug utilisent minifyEnabled false, ce qui accélère la compilation et préserve les noms de classe lisibles pour le débogueur. En mode debug, l'obfuscation interfère avec le débogage et l'exécution pas à pas, tandis que la compression ralentit les itérations. Pour tester la correction de l'obfuscation, utilisez une build de release sur un appareil physique.
Les avertissements ProGuard (WARNING) indiquent des problèmes qui n'arrêtent pas la build mais peuvent signaler des erreurs potentielles à l'exécution. Si un avertissement n'entraîne pas de plantage, ajoutez -dontwarn pour la bibliothèque correspondante. Si un avertissement est lié à une classe manquante qui n'est pas utilisée dans l'application, utilisez également -dontwarn. Ignorer tous les avertissements à la fois sans discernement n'est pas recommandé.
ProGuard est un outil gratuit avec des fonctionnalités de base : compression, optimisation, renommage des classes et méthodes. DexGuard est un produit commercial du même Guardsquare qui ajoute l'obfuscation du flux de contrôle, le chiffrement des chaînes et des ressources, la protection anti-débogage et l'obfuscation des ressources. DexGuard est utilisé dans les applications bancaires et les jeux avec des exigences de sécurité élevées.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi