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 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.
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.
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.
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.
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.
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 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.
// 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 ä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.
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.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), '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.
# 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 { *; }
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.
| Direktiv | Syfte | Exempel |
|---|---|---|
| -keep | Bevara klassen och dess medlemmar fullständigt | -keep class com.example.MyClass |
| -keepclassmembers | Bevara endast klassmedlemmar | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Ignorera varningar | -dontwarn okhttp3.internal.** |
| -keepparameternames | Bevara parameternamn för metoder | -keepparameternames |
| -keepattributes | Bevara attribut (annoteringar, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Inaktivera optimering | -dontoptimize |
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 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.
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.
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.
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.
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.
Ö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
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.
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.
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.
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.
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
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.
Läs också