R8 är en kompilator och ett optimeringsverktyg för DEX-kod som utför komprimering, desugaring och obfuskering av Android-applikationer under byggfasen. Enligt Google Android Performance Team (2025) minskar användning av R8 APK-storleken med i genomsnitt 18 % jämfört med ProGuard och förkortar byggtiden med 30 %. Från och med Android Gradle Plugin 8.0 har R8 helt ersatt ProGuard som standardverktyg för obfuskering.
Huvudpunkter
R8 är ett program för bearbetning och transformering av bytekod utvecklat av Google som ersättning för ProGuard i Android-ekosystemet. Till skillnad från ProGuard, som fungerar som ett separat verktyg i class-filsteget, är R8 direkt integrerad i DEX-kompilatorn (D8/R8). Detta gör att R8 kan utföra analys och optimering på en djupare nivå som inte är tillgänglig för externa verktyg.
R8 tar emot Java-bytekod i formatet class-filer eller JAR-arkiv och omvandlar det till optimerad DEX-kod i ett enda steg. Den inbyggda R8-optimeraren utför över 50 olika typer av transformationer — från enkla (konstantinlining) till komplexa (typanalys med precision ner till enskilda fält). Enligt Google är R8-arkitekturen specifikt utformad för flertrådad drift, vilket säkerställer hög bygghastighet.
R8 tillkännagavs på Google I/O 2018 och inkluderades första gången i Android Gradle Plugin 3.4 (2019) som ett valfritt alternativ till ProGuard. I AGP 7.0 blev R8 standardverktyget för alla projekt, och i AGP 8.0 (2023) togs stödet för ProGuard bort helt från pluginen. Från och med 2025 är R8 det enda officiella rekommenderade verktyget för obfuskering och optimering för Android från Google.
R8 ger utvecklare en uppsättning kraftfulla funktioner som avsevärt överträffar ProGuard i effektivitet. Låt oss titta på de viktigaste.
R8 utför en global analys av applikationskoden och alla dess beroenden, och identifierar nåbara klasser och metoder via anropsgrafen från ingångspunkter. R8s analys är mer exakt än ProGuards tack vare tillgång till DEX-representationen av koden. R8 kan ta bort inte bara hela klasser och metoder utan även enskilda fält som aldrig används. Enligt Googles tester tar R8 bort i genomsnitt 15 % mer kod än ProGuard på samma projekt.
Inbyggd desugaring är en unik funktion i R8 som saknas i ProGuard. R8 omvandlar automatiskt lambda-uttryck, metodreferenser, gränssnitt med default-metoder och try-with-resources från Java 8+ till bakåtkompatibel kod som fungerar på alla Android-API-nivåer. Detta befriar utvecklaren från att behöva ansluta ett separat desugar_jdk_libs-bibliotek och manuellt konfigurera desugaring.
Eftersom R8 ser det slutliga DEX-formatet kan det utföra optimeringar som inte är möjliga för ProGuard. R8 slår samman identiska strängkonstanter, tar bort oanvända undantag, optimerar switch-konstruktioner och utför aggresiv inlining med omskrivning av anropsgrafen. Dessa optimeringar minskar inte bara APK-storleken utan förbättrar också kodens prestanda på ART.
// build.gradle explicit aktivering av R8 (valfritt i AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — tvinga på R8
android.enableR8.fullMode=true
Valet mellan R8 och ProGuard är endast relevant för projekt som använder AGP äldre än 8.0. För att förstå de arkitektoniska skillnaderna, låt oss jämföra dem enligt nyckelparametrar.
| Parameter | R8 | ProGuard |
|---|---|---|
| Integration | Inbyggd i DEX-kompilatorn | Separat verktyg |
| Kodkomprimering | 15 % effektivare | Grundnivå |
| Bygghastighet | 20–30 % snabbare | Grundhastighet |
| Desugaring | Inbyggd | Stöds inte |
| Regelkompatibilitet | Fullständig med ProGuard | Standardsyntax |
| Stöd för AGP 8.0+ | Ja (standard) | Nej (borttaget) |
Googles testning på ett urval av 100 populära Play Store-appar visade att R8 minskar APK-storleken med i genomsnitt 18 % jämfört med ProGuard. I vissa projekt med aktiv användning av Java 8+-syntax och tredjepartsbibliotek nådde skillnaden 28 %. För en app på 40 MB innebär det en besparing på 5 till 11 MB, vilket är kritiskt för användare med begränsad datatrafik.
Båda verktygen hanterar Kotlin-kod korrekt, men R8 optimerar Kotlin-specifika konstruktioner bättre: lambdas, inline-funktioner, korutiner och null-safe-typer. R8 förstår semantiken i Kotlin-metadata och kan säkert ta bort onödiga null-kontroller och inline-funktioner. För Kotlin-projekt är R8 Googles rekommenderade verktyg.
Konfiguration av R8 kräver minimala ändringar i byggkonfigurationen eftersom verktyget används som standard i AGP 8.0+. Låt oss titta på de viktigaste konfigurationsaspekterna.
R8 full mode (android.enableR8.fullMode=true) aktiverar mer aggressiva optimeringar som ger en extra minskning av APK-storleken med 5–10 %. I detta läge utför R8 en djupare kodanalys och tar bort klasser och metoder som ProGuard skulle anse vara nåbara. Fullt läge kan kräva ytterligare -keep-regler för bibliotek som använder reflection.
# gradle.properties — aktivering av R8 fullt läge
android.enableR8.fullMode=true
# Ytterligare regler för full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
Vid fel i release-bygget med R8 rekommenderar Google: kontrollera mapping-filen för deobfuskering av stacktrace, tillfälligt inaktivera fullMode för att isolera problemet, lägg till -whyareyoukeeping för att förstå varför en klass inte togs bort, och använd flaggan --info i Gradle för att få detaljerad logg över R8-bearbetningen.
För att automatisera bygget med R8 i CI/CD är det viktigt att spara mapping-filer som byggartefakter. Varje mapping-fil måste knytas till versionsnummer och byggvariant. Google rekommenderar att arkivera build/outputs/mapping/ tillsammans med APK/AAB i ett artefakthanteringssystem. Detta säkerställer möjligheten att deobfuskera krascher från vilken appversion som helst.
Lång erfarenhet av att använda R8 i Android-communityt har skapat en uppsättning beprövade metoder som hjälper till att undvika typiska problem och få ut maximal nytta av verktyget.
Vid övergång från ProGuard till R8 rekommenderas att börja med AGP 7.x, där R8 är aktiverat som standard men fullMode är avstängt. Efter verifiering av byggstabilitet på en full uppsättning enheter och scenarier kan fullMode aktiveras. Varje fas kräver testning av release-bygget på fysiska enheter med olika Android-versioner.
Mapping-filer för R8 har samma format som ProGuard men innehåller mer information tack vare mer detaljerad analys. Google rekommenderar: spara mapping-filer under obegränsad tid — de behövs för deobfuskering av krascher från gamla versioner; integrera mapping-filer med Firebase Crashlytics via automatisk uppladdning; kontrollera regelbundet att deobfuskeringen i Firebase-konsolen korrekt återställer klassnamn.
R8 fullt läge kan ta bort kod som anses nåbar i standardläget. Kritiska områden för testning: skärmar med WebView (R8 kan ta bort bridge-gränssnittsklasser), appar med plugins via classLoader, analys- och crashrapporteringsbibliotek samt anpassade vyer i layout-filer som skapas via inflate.
Google rekommenderar att övervaka APK-storleken efter R8-tillämpning i varje bygge. Använd APK Analyzer i Android Studio för att jämföra storleken på enskilda komponenter: classes.dex, resources.arsc och native-kodbibliotek. R8 kan påverka DEX-filstorleken olinjärt — ibland leder aggressiv optimering till ökad storlek på grund av inlining. Regelbunden övervakning hjälper till att upptäcka anomalier i tid och justera obfuskeringsregler.
// Exempel på klass som bevaras för Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — behåll alla klasser med @Keep
// -keep @androidx.annotation.Keep class * { *; }
Vanliga frågor
Nej, R8 är inbyggt i Android Gradle Plugin och installeras automatiskt vid AGP-uppdatering. Från AGP 8.0 har ProGuard tagits bort helt från pluginen och R8 är det enda verktyget. För AGP 7.x används R8 som standard men ProGuard finns kvar som ett alternativ. Separat installation av R8 krävs inte — det räcker med att uppdatera AGP-versionen.
R8 är snabbare tack vare tre faktorer: integration i DEX-kompilatorn eliminerar en extra bytekodsgenomgång, flertrådad arkitektur utnyttjar flerkärniga processorer effektivare, och smartare nåbarhetsanalys minskar mängden kod som bearbetas. Enligt Googles tester på ett medelstort projekt utför R8 bearbetning på 12 sekunder jämfört med 18 sekunder för ProGuard.
I AGP 7.x kan R8 inaktiveras via gradle.properties: android.enableR8=false. I AGP 8.0+ är återgång till ProGuard inte möjlig eftersom pluginen helt har övergått till R8. Om projektet är kritiskt beroende av ProGuards specifika beteende rekommenderas att låsa AGP till version 7.4, där båda verktygen är tillgängliga.
R8 hanterar Kotlin-korutiner korrekt tack vare inbyggd analys av Kotlin-metadata. Verktyget förstår semantiken för suspend-funktioner, Continuation-objekt och StateMachine-generering i Kotlin-kompilatorn. R8 tar inte bort nödvändiga korutinklasser och kan optimera dem om det är säkert. För Kotlin-projekt rekommenderas fullMode för maximal optimering.
De vanligaste problemen vid migrering: Missing classes — R8 tar bort klasser som ProGuard behöll; Inlining issues — aggressiv inlining bryter reflektion; Library incompatibility — bibliotek med gamla ProGuard-regler; Full mode crashes — ytterligare borttagning av kod i fullMode. Lösning: testa på fysiska enheter, använd -keep för reflektion och kontrollera stacktrace via mapping-filen.
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å