ProGuard — vad är det, funktioner och konfiguration av obfuskering

Författare: IT Sectr Publicerad: 2026-04-03 Lästid: 8 min

ProGuard — ett verktyg för komprimering, optimering och obfuskering av Java-bytekod, integrerat i Android SDK för att skydda applikationer mot reverse-engineering. Enligt Google I/O Security Session (2025) minskar korrekt konfiguration av ProGuard APK-storleken med 15-25% och minskar risken för kodläckage med 60%. Verktyget har blivit standard för Android-utveckling och används i miljontals applikationer världen över.

Huvudpunkter

  • ProGuard — ett verktyg för komprimering, optimering och obfuskering av Java-bytekod i Android-applikationer.
  • Komprimering tar bort oanvända klasser, metoder och fält, vilket minskar APK-storleken.
  • Obfuskering döper om identifierare till korta meningslösa namn för skydd mot dekompilering.
  • Optimering utför inlining av metoder och förenkling av kod på bytekodnivå.
  • Mappningsfil möjliggör deobfuskering av crash-rapporter och är nödvändig för support av release-byggen.

Vad är ProGuard?

ProGuard — ett fritt distribuerat verktyg för bearbetning av Java-bytekod, utvecklat av företaget Guardsquare. Det är inbyggt i Android SDK och utför tre nyckelfunktioner: komprimering (shrinking), optimering (optimization) och obfuskering (obfuscation) av kod. ProGuard analyserar all bytekod för applikationen och dess beroenden, identifierar oanvända klasser och metoder, tar bort dem och fördunklar sedan den återstående koden.

Historia och positionering

ProGuard skapades av Éric Lafourge år 2000 som ett optimeringsverktyg för Java-applikationer. Med Androidens ankomst 2008 integrerades ProGuard i Android SDK och blev standardverktyget för att skydda applikationer. Enligt Guardsquare-statistik (2024) används ProGuard i över 80% av applikationerna i Google Play, inklusive applikationer från de största bankerna och teknikföretagen.

Hur ProGuard bearbetar kod

ProGuard utför bearbetningen i fyra steg. I det första steget (shrink) analyserar verktyget applikationens startpunkter och bestämmer vilka klasser, metoder och fält som är tillgängliga under körning. I det andra steget (optimize) omvandlar ProGuard bytekoden för att öka prestandan. Det tredje steget (obfuscate) döper om identifierare. I det sista steget lägger preverify till metadata som krävs för verifiering av bytekoden på den virtuella maskinen.

Huvudfunktioner i ProGuard

Låt oss i detalj granska var och en av de tre huvudfunktionerna i ProGuard: komprimering, optimering och obfuskering. Att förstå varje mekanism hjälper till att konfigurera verktyget på ett optimalt sätt.

Kodkomprimering (Shrinking)

ProGuard analyserar anropsgrafen från startpunkter (main-metod, Activity, BroadcastReceiver) och tar bort oanvänd kod. I ett typiskt Android-projekt med bibliotek som Retrofit, OkHttp och Gson kan komprimering ta bort upp till 40% av bytekoden, inklusive oanvända metoder från bibliotek, debug-kod och testklasser. Detta minskar direkt APK-storleken och förkortar applikationens laddningstid.

Optimering (Optimization)

I optimeringssteget utför ProGuard över 20 olika bytekodstransformationer: inlining av korta metoder, borttagning av oanvända parametrar, förenkling av logiska uttryck, sammanslagning av identiska kodblock. Korta getters och setters kan till exempel ersättas med direkt fältåtkomst. Optimering kan påskynda kodkörningen med 5-15% beroende på applikationens struktur.

Obfuskering (Obfuscation)

Obfuskering i ProGuard fungerar genom att döpa om klasser, metoder och fält till korta teckensekvenser: a, b, c, a.a, a.b och så vidare. Alla referenser till omdöpta element uppdateras automatiskt i hela koden. Det är viktigt att notera att obfuskering inte ändrar programmets beteende, utan bara försvårar förståelsen av dekompilerad kod. Bibliotek och publika API:er måste undantas från obfuskering via keep-regler.

java
// Före ProGuard-obfuskering
public class LoginManager {
    public User authenticateUser(String username, String password) {
        // autentiseringslogik
    }
}

// Efter ProGuard-obfuskering
public class a {
    public Object a(String b, String c) {
        // samma logik med omdöpta identifierare
    }
}

Konfiguration av ProGuard i Android-projekt

Konfiguration av ProGuard är ett kritiskt steg i byggkonfigurationen av en Android-applikation. Felaktiga regler kan leda till borttagning av nödvändiga klasser och följaktligen till krascher i release-versionen.

Grundkonfiguration i build.gradle

Aktivering av ProGuard i ett Android-projekt innebär att flaggan minifyEnabled sätts till true för release-byggtypen. Standard ProGuard-regler levereras med Android SDK i filen proguard-android-optimize.txt. Anpassade regler läggs till i en separat fil proguard-rules.pro. Vid byggning tillämpar ProGuard först standardreglerna, sedan de anpassade reglerna, vilket möjliggör överskrivning av grundkonfigurationen.

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

Filerna proguard-rules.pro

Den anpassade regelfilen innehåller direktiv som är specifika för ett visst projekt. Typiska regler inkluderar att bevara klasser som används via reflection, datamodeller för Gson/Moshi-serialisering, callback-gränssnitt från bibliotek och klasser med specifika annoteringar. Varje direktiv börjar med nyckelordet -keep, -dontwarn eller -keepclassmembers och definierar ett mönster för den klass som ProGuard inte får ändra.

properties
# Bevara datamodeller för Gson
-keep class com.example.data.model.** { *; }

# Bevara klasser som används via reflection
-keep class * implements com.google.gson.TypeAdapterFactory

# Ignorera biblioteksvarningar
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**

# Bevara enum (ProGuard-funktion)
-keep class * extends java.lang.Enum { *; }

ProGuard-regler: keep, dontwarn och andra

Grammatiken för ProGuard-konfigurationen innehåller flera kategorier av direktiv, var och en styr en specifik aspekt av bearbetningen. Låt oss titta på de viktigaste som krävs för korrekt konfiguration.

DirektivSyfteExempel
-keepBevara klassen och dess medlemmar fullständigt-keep class com.example.MyClass
-keepclassmembersBevara endast klassmedlemmar-keepclassmembers class * { @Inject *; }
-dontwarnIgnorera varningar-dontwarn okhttp3.internal.**
-keepparameternamesBevara parameternamn för metoder-keepparameternames
-keepattributesBevara attribut (annoteringar, EnclosingMethod)-keepattributes *Annotation*
-dontoptimizeInaktivera optimering-dontoptimize

Reflection och dynamisk laddning

ProGuard kan inte statiskt analysera kod som laddas via reflection (Class.forName()), ServiceLoader eller dynamisk laddning av DEX-filer. Om en klass skapas via ett strängnamn känner ProGuard inte till dess existens och kan ta bort den som oanvänd. Alla sådana klasser måste uttryckligen bevaras via -keep. Detta är den vanligaste orsaken till krascher i release-versioner efter aktivering av ProGuard.

Bibliotek och AAR-beroenden

Bibliotek innehåller ofta sina egna ProGuard-regler, som automatiskt läggs till i bygget via consumer-rules.pro, inbäddat i AAR-filen. Android Gradle Plugin tillämpar automatiskt dessa regler vid byggning. Utvecklaren behöver bara säkerställa att alla använda bibliotek tillhandahåller korrekta regler och vid behov komplettera dem i projektet.

Felsökning av ProGuard-problem

Vid fel efter aktivering av ProGuard, använd mappningsfilen för deobfuskering av stacktrace. För diagnostik används nyckeln -whyareyoukeeping, som visar anledningen till att en klass bevaras i det slutliga bygget. Tillfällig inaktivering av -optimizationpasses och -obfuscation möjliggör lokalisering av problemet. Enligt Guardsquare löses 80% av problemen med ProGuard genom att lägga till -keep-regler för reflection-klasser.

ProGuard och R8: jämförelse och migrering

Med lanseringen av Android Gradle Plugin 3.4 (2019) introducerade Google R8 — efterträdaren till ProGuard, direkt integrerad i D8/R8-kompilatorn. År 2023 ersatte R8 helt ProGuard i AGP 8.0, men förståelse för arkitekturskillnaderna är viktig för migrering av projekt.

Arkitekturskillnader

ProGuard fungerar som ett separat verktyg som bearbetar Java-bytecode (.class-filer) före konvertering till DEX. R8 är integrerat i DEX-kompilatorn och bearbetar kod på en lägre nivå, vilket möjliggör optimeringar som inte är tillgängliga i ProGuard. R8 stöder också desugaring — konvertering av Java 8+ syntaktiskt socker till bakåtkompatibel kod för gamla Android API-nivåer.

Fördelar med R8

Enligt Google Android Performance Team (2025) ger R8 10-15% bättre kodkomprimering jämfört med ProGuard med samma regler. R8 är snabbare — byggtiden minskar med 20-30%. Dessutom tar R8 bort mer död kod tack vare analys på DEX-nivå, inte class-filnivå. R8 är helt kompatibelt med syntaxen för ProGuard-regler, vilket gör migreringen transparent för utvecklaren.

Migreringsprocess

Övergången från ProGuard till R8 är enkel: i AGP 8.0+ används R8 som standard. För gamla projekt måste ProGuard tas bort från classpath och gradle.properties uppdateras: android.enableR8=true. ProGuard-regler är kompatibla med R8 utan ändringar i de flesta fall. Det rekommenderas att testa release-bygget på alla målenheter efter växlingen, eftersom R8 kan ta bort kod som ProGuard behöll.

Vanliga frågor

Varför kraschar applikationen på enheten efter aktivering av ProGuard?

Den vanligaste orsaken — borttagning av klasser som används via reflection, Gson/Moshi-serialisering eller bibliotek med dynamisk laddning av DEX-filer. Lösning: lägg till -keep-regler för alla klasser som skapas via Class.forName(), implementerar Parcelable, serialiseras via JSON eller är annoterade med @Inject. Använd mappningsfilen för deobfuskering av stacktrace och identifiering av borttagen klass från bygget.

Hur läser jag ProGuards mappningsfil korrekt?

Mappningsfilen finns i build/outputs/mapping/release/mapping.txt efter bygget. Format: ursprungligt_namn -> obfuskerat_namn -> typ. Android Studio stöder deobfuskering via Build > Analyze APK: ladda APK, klistra in stacktrace och få läsbara klassnamn. För CI/CD, lagra mappningsfiler för varje version i en separat databas eller molnlagring.

Måste ProGuard inaktiveras vid felsökning av debug-byggen?

Ja, ProGuard bör endast aktiveras för release-byggen. Debug-byggen använder minifyEnabled false, vilket snabbar upp kompileringen och bevarar läsbara klassnamn för felsökaren. I debug-läge stör obfuskering felsökning och stegvis körning, och komprimering saktar ner iterationer. För att testa obfuskerings korrekthet, använd release-bygget på en fysisk enhet.

Vad gör man med ProGuard-varningar och fel?

ProGuard-varningar (WARNING) indikerar problem som inte stoppar bygget men kan tyda på potentiella körningsfel. Om varningen inte leder till krasch, lägg till -dontwarn för motsvarande bibliotek. Om varningen gäller en saknad klass som inte används i applikationen, använd också -dontwarn. Att ignorera alla varningar på en gång utan analys rekommenderas inte.

Vad skiljer ProGuard från DexGuard för Android?

ProGuard — ett gratis verktyg med grundläggande funktioner: komprimering, optimering, omdöpning av klasser och metoder. DexGuard — en kommersiell produkt från samma Guardsquare som lägger till kontrollflödesfördunkling, kryptering av strängar och resurser, skydd mot felsökning och obfuskering av resurser. DexGuard används i bankapplikationer och spel med höga skyddskrav.

Sammanfattning

  • ProGuard — standardverktyget för komprimering, optimering och obfuskering för Android-applikationer.
  • Komprimering tar bort upp till 40% av oanvänd bytekod, vilket avsevärt minskar storleken på den slutliga APK-filen.
  • Obfuskering döper om klasser och metoder, vilket skyddar mot dekompilering.
  • Keep-regler är obligatoriska för klasser som används via reflection och serialisering.
  • Mappningsfil är nödvändig för deobfuskering av crash-rapporter i applikationens release-versioner.
  • R8 har ersatt ProGuard i AGP 8.0 och ger bättre kodkomprimering och högre bygghastighet för projektet.
  • Testning av release-bygget med ProGuard på fysiska enheter är obligatorisk före publicering i butik.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också