ProGuard — een tool voor compressie, optimalisatie en obfuscatie van Java-bytecode, geïntegreerd in Android SDK om applicaties te beschermen tegen reverse-engineering. Volgens Google I/O Security Session (2025), correcte configuratie van ProGuard verkleint de APK-grootte met 15-25% en vermindert het risico op codelekkage met 60%. De tool is een standaard geworden voor Android-ontwikkeling en wordt gebruikt in miljoenen applicaties wereldwijd.
Belangrijkste punten
ProGuard — een vrij verspreid hulpmiddel voor het verwerken van Java-bytecode, ontwikkeld door het bedrijf Guardsquare. Het is ingebouwd in Android SDK en vervult drie belangrijke functies: compressie (shrinking), optimalisatie (optimization) en obfuscatie (obfuscation) van code. ProGuard analyseert alle bytecode van de applicatie en zijn afhankelijkheden, identificeert ongebruikte klassen en methoden, verwijdert deze en verdoezelt vervolgens de resterende code.
ProGuard is in 2000 door Éric Lafourge gemaakt als een optimalisatietool voor Java-applicaties. Met de komst van Android in 2008 werd ProGuard geïntegreerd in Android SDK en werd het de standaard tool voor applicatiebeveiliging. Volgens Guardsquare-statistieken (2024) wordt ProGuard gebruikt in meer dan 80% van de apps in Google Play, waaronder apps van de grootste banken en technologiebedrijven.
ProGuard voert de verwerking in vier fasen uit. In de eerste fase (shrink) analyseert de tool de ingangspunten van de applicatie en bepaalt welke klassen, methoden en velden bereikbaar zijn tijdens de uitvoering. In de tweede fase (optimize) transformeert ProGuard de bytecode om de prestaties te verbeteren. De derde fase (obfuscate) hernoemt identificatoren. In de laatste fase voegt preverify metadata toe die nodig is voor verificatie van de bytecode op de virtuele machine.
Laten we elk van de drie belangrijkste functies van ProGuard in detail bekijken: compressie, optimalisatie en obfuscatie. Inzicht in elk mechanisme helpt om de tool optimaal te configureren.
ProGuard analyseert de aanroepgraaf vanaf ingangspunten (main-methode, Activity, BroadcastReceiver) en verwijdert ongebruikte code. In een typisch Android-project met bibliotheken zoals Retrofit, OkHttp en Gson kan compressie tot 40% van de bytecode verwijderen, inclusief ongebruikte methoden van bibliotheken, debug-code en testklassen. Dit verkleint direct de APK-grootte en verkort de laadtijd van de applicatie.
In de optimalisatiefase voert ProGuard meer dan 20 verschillende bytcodetransformaties uit: inlining van korte methoden, verwijderen van ongebruikte parameters, vereenvoudigen van logische expressies, samenvoegen van identieke codeblokken. Korte getters en setters kunnen bijvoorbeeld worden vervangen door directe veldtoegang. Optimalisatie kan de code-uitvoering met 5-15% versnellen, afhankelijk van de applicatiestructuur.
Obfuscatie in ProGuard werkt door klassen, methoden en velden te hernoemen naar korte tekenreeksen: a, b, c, a.a, a.b enzovoort. Alle verwijzingen naar hernoemde elementen worden automatisch bijgewerkt in de hele code. Het is belangrijk op te merken dat obfuscatie het gedrag van het programma niet verandert, maar alleen het begrijpen van gedecompileerde code bemoeilijkt. Bibliotheken en openbare API's moeten worden uitgesloten van obfuscatie via keep-regels.
// Vóór ProGuard-obfuscatie
public class LoginManager {
public User authenticateUser(String username, String password) {
// authenticatielogica
}
}
// Na ProGuard-obfuscatie
public class a {
public Object a(String b, String c) {
// dezelfde logica met hernoemde identificatoren
}
}
Configuratie van ProGuard is een kritieke fase in het bouwen van een Android-applicatie. Onjuiste regels kunnen leiden tot het verwijderen van noodzakelijke klassen en bijgevolg tot crashes in de releaseversie.
Het activeren van ProGuard in een Android-project omvat het instellen van de vlag minifyEnabled op true voor het releasetype. Standaard ProGuard-regels worden meegeleverd met Android SDK in het bestand proguard-android-optimize.txt. Aangepaste regels worden toegevoegd in een apart bestand proguard-rules.pro. Tijdens het bouwen past ProGuard eerst de standaardregels toe, daarna de aangepaste regels, wat het overschrijven van de basisconfiguratie mogelijk maakt.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
Het aangepaste regelsbestand bevat richtlijnen die specifiek zijn voor een bepaald project. Typische regels omvatten het behouden van klassen die via reflection worden gebruikt, datamodellen voor Gson/Moshi-serialisatie, callback-interfaces van bibliotheken en klassen met specifieke annotaties. Elke richtlijn begint met het trefwoord -keep, -dontwarn of -keepclassmembers en definieert een patroon van de klasse die ProGuard niet mag wijzigen.
# Bewaar gegevensmodellen voor Gson
-keep class com.example.data.model.** { *; }
# Bewaar klassen die via reflection worden gebruikt
-keep class * implements com.google.gson.TypeAdapterFactory
# Negeer bibliotheekwaarschuwingen
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# Bewaar enum's (ProGuard-kenmerk)
-keep class * extends java.lang.Enum { *; }
De grammatica van de ProGuard-configuratie omvat verschillende categorieën richtlijnen, die elk een specifiek aspect van de verwerking beheren. Laten we de belangrijkste bekijken die nodig zijn voor een correcte configuratie.
| Richtlijn | Doel | Voorbeeld |
|---|---|---|
| -keep | Behoud de klasse en zijn leden volledig | -keep class com.example.MyClass |
| -keepclassmembers | Behoud alleen de leden van de klasse | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Negeer waarschuwingen | -dontwarn okhttp3.internal.** |
| -keepparameternames | Behoud parameternamen van methoden | -keepparameternames |
| -keepattributes | Behoud attributen (annotaties, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Schakel optimalisatie uit | -dontoptimize |
ProGuard kan code die via reflection (Class.forName()), ServiceLoader of dynamisch laden van DEX-bestanden wordt geladen, niet statisch analyseren. Als een klasse wordt gemaakt op basis van een tekenreeksnaam, weet ProGuard niet van het bestaan ervan en kan het deze als ongebruikt verwijderen. Al dergelijke klassen moeten expliciet worden behouden via -keep. Dit is de meest voorkomende oorzaak van crashes in releaseversies na het inschakelen van ProGuard.
Bibliotheken bevatten vaak hun eigen ProGuard-regels, die automatisch aan de build worden toegevoegd via consumer-rules.pro, ingebouwd in het AAR-bestand. Android Gradle Plugin past deze regels automatisch toe tijdens het bouwen. De ontwikkelaar hoeft alleen te controleren of alle gebruikte bibliotheken correcte regels bieden en deze indien nodig in het project aan te vullen.
Bij fouten na het inschakelen van ProGuard gebruikt u het mapping-bestand voor deobfuscatie van de stacktrace. Voor diagnose wordt de sleutel -whyareyoukeeping gebruikt, die de reden toont waarom een klasse in de uiteindelijke build wordt behouden. Tijdelijke uitschakeling van -optimizationpasses en -obfuscation maakt lokalisatie van het probleem mogelijk. Volgens Guardsquare wordt 80% van de ProGuard-problemen opgelost door het toevoegen van -keep-regels voor reflection-klassen.
Met de release van Android Gradle Plugin 3.4 (2019) introduceerde Google R8 — de opvolger van ProGuard, direct geïntegreerd in de D8/R8-compiler. In 2023 verving R8 ProGuard volledig in AGP 8.0, maar inzicht in de architectuurverschillen is belangrijk voor migratie van projecten.
ProGuard werkt als een aparte tool die Java-bytecode (.class-bestanden) verwerkt vóór conversie naar DEX. R8 is geïntegreerd in de DEX-compiler en verwerkt code op een lager niveau, wat optimalisaties mogelijk maakt die niet beschikbaar zijn in ProGuard. R8 ondersteunt ook desugaring — conversie van Java 8+ syntaxissuiker naar achterwaarts compatibele code voor oude Android API-niveaus.
Volgens Google Android Performance Team (2025) biedt R8 10-15% betere codecompressie in vergelijking met ProGuard bij dezelfde regels. R8 is sneller — de bouwtijd wordt met 20-30% verminderd. Bovendien verwijdert R8 meer dode code dankzij analyse op DEX-niveau in plaats van class-bestanden. R8 is volledig compatibel met de syntax van ProGuard-regels, wat migratie transparant maakt voor de ontwikkelaar.
De overstap van ProGuard naar R8 is eenvoudig: in AGP 8.0+ wordt R8 standaard gebruikt. Voor oude projecten moet ProGuard uit de classpath worden verwijderd en gradle.properties worden bijgewerkt: android.enableR8=true. ProGuard-regels zijn in de meeste gevallen zonder wijzigingen compatibel met R8. Het wordt aanbevolen de release-build te testen op alle doelapparaten na de overstap, omdat R8 code kan verwijderen die ProGuard behield.
Veelgestelde vragen
De meest voorkomende oorzaak — verwijdering van klassen die worden gebruikt via reflection, Gson/Moshi-serialisatie of bibliotheken met dynamisch laden van DEX-bestanden. Oplossing: voeg -keep-regels toe voor alle klassen die worden gemaakt via Class.forName(), Parcelable implementeren, via JSON worden geserialiseerd of zijn geannoteerd met @Inject. Gebruik het mapping-bestand voor deobfuscatie van de stacktrace en het identificeren van de verwijderde klasse uit de build.
Het mapping-bestand bevindt zich in build/outputs/mapping/release/mapping.txt na de build. Formaat: oorspronkelijke_naam -> geobfusceerde_naam -> type. Android Studio ondersteunt deobfuscatie via Build > Analyze APK: laad de APK, plak de stacktrace en ontvang leesbare klassennamen. Voor CI/CD bewaar mapping-bestanden voor elke versie in een aparte repository of cloudopslag.
Ja, ProGuard mag alleen worden ingeschakeld voor release-builds. Debug-builds gebruiken minifyEnabled false, wat de compilatie versnelt en leesbare klassennamen behoudt voor de debugger. In debug-modus hindert obfuscatie het debuggen en stapsgewijs uitvoeren, en compressie vertraagt iteraties. Gebruik voor het testen van de correctheid van obfuscatie een release-build op een fysiek apparaat.
Waarschuwingen van ProGuard (WARNING) wijzen op problemen die de build niet stoppen, maar kunnen duiden op potentiële uitvoeringsfouten. Als de waarschuwing niet tot een crash leidt, voeg dan -dontwarn toe voor de betreffende bibliotheek. Als de waarschuwing betrekking heeft op een ontbrekende klasse die niet in de applicatie wordt gebruikt, gebruik dan ook -dontwarn. Het negeren van alle waarschuwingen tegelijk zonder analyse wordt niet aanbevolen.
ProGuard — een gratis tool met basisfuncties: compressie, optimalisatie, hernoemen van klassen en methoden. DexGuard — een commercieel product van dezelfde Guardsquare, dat controleflowverdoezeling, versleuteling van strings en resources, bescherming tegen debuggen en obfuscatie van resources toevoegt. DexGuard wordt gebruikt in bankapplicaties en games met hoge beveiligingseisen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook