ProGuard — wat is het, mogelijkheden en configuratie van obfuscatie

Auteur: IT Sectr Gepubliceerd: 2026-04-03 Leestijd: 8 min

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 tool voor compressie, optimalisatie en obfuscatie van Java-bytecode in Android-applicaties.
  • Compressie verwijdert ongebruikte klassen, methoden en velden, waardoor de APK-grootte afneemt.
  • Obfuscatie hernoemt identificatoren naar korte betekenisloze namen ter bescherming tegen decompilatie.
  • Optimalisatie voert inlining van methoden en vereenvoudiging van code uit op bytecodeniveau.
  • Mapping-bestand maakt deobfuscatie van crashrapporten mogelijk en is noodzakelijk voor ondersteuning van release-builds.

Wat is ProGuard?

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.

Geschiedenis en positionering

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.

Hoe ProGuard code verwerkt

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.

Belangrijkste mogelijkheden van ProGuard

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.

Codecompressie (Shrinking)

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.

Optimalisatie (Optimization)

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 (Obfuscation)

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.

java
// 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 in een Android-project

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.

Basisconfiguratie in build.gradle

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.

groovy
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'
            ), 'proguard-rules.pro'
        }
    }
}

Het bestand 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.

properties
# 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 { *; }

ProGuard-regels: keep, dontwarn en andere

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.

RichtlijnDoelVoorbeeld
-keepBehoud de klasse en zijn leden volledig-keep class com.example.MyClass
-keepclassmembersBehoud alleen de leden van de klasse-keepclassmembers class * { @Inject *; }
-dontwarnNegeer waarschuwingen-dontwarn okhttp3.internal.**
-keepparameternamesBehoud parameternamen van methoden-keepparameternames
-keepattributesBehoud attributen (annotaties, EnclosingMethod)-keepattributes *Annotation*
-dontoptimizeSchakel optimalisatie uit-dontoptimize

Reflection en dynamisch laden

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 en AAR-afhankelijkheden

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.

Debuggen van ProGuard-problemen

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.

ProGuard en R8: vergelijking en migratie

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.

Architectuurverschillen

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.

Voordelen van R8

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.

Migratieproces

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

Waarom crasht de applicatie op het apparaat na het inschakelen van ProGuard?

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.

Hoe lees ik het ProGuard-mappingbestand correct?

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.

Moet ProGuard worden uitgeschakeld bij het debuggen van debug-builds?

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.

Wat te doen met ProGuard-waarschuwingen en -fouten?

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.

Wat is het verschil tussen ProGuard en DexGuard voor Android?

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

  • ProGuard — de standaard tool voor compressie, optimalisatie en obfuscatie voor Android-applicaties.
  • Compressie verwijdert tot 40% van ongebruikte bytecode, waardoor de uiteindelijke APK aanzienlijk kleiner wordt.
  • Obfuscatie hernoemt klassen en methoden, ter bescherming tegen decompilatie.
  • Keep-regels zijn verplicht voor klassen die via reflection en serialisatie worden gebruikt.
  • Mapping-bestand is noodzakelijk voor deobfuscatie van crashrapporten in releaseversies van de applicatie.
  • R8 heeft ProGuard vervangen in AGP 8.0, met betere codecompressie en hogere buildsnelheid van het project.
  • Testen van de release-build met ProGuard op fysieke apparaten is verplicht voor publicatie in de winkel.

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.

Bespreek het project

Lees ook