R8 este un compilator și instrument de optimizare a codului DEX care efectuează compresie, desugaring și ofuscare a aplicațiilor Android în etapa de compilare. Conform datelor Google Android Performance Team (2025), utilizarea R8 reduce dimensiunea APK cu o medie de 18% comparativ cu ProGuard și scurtează timpul de compilare cu 30%. Începând cu Android Gradle Plugin 8.0, R8 a înlocuit complet ProGuard ca instrument standard de ofuscare.
Principalele puncte
R8 este un program de procesare și transformare a bytecodului, dezvoltat de Google ca înlocuitor pentru ProGuard în ecosistemul Android. Spre deosebire de ProGuard, care funcționează ca un instrument separat în etapa fișierelor class, R8 este integrat direct în compilatorul DEX (D8/R8). Acest lucru permite R8 să efectueze analiza și optimizarea la un nivel mai profund, inaccesibil instrumentelor externe.
R8 primește la intrare bytecod Java în format fișiere class sau arhive JAR și îl transformă în cod DEX optimizat într-o singură trecere. Optimizatorul încorporat R8 execută peste 50 de tipuri diferite de transformări — de la simple (inline constante) la complexe (analiza accesibilității tipurilor cu precizie până la un câmp individual). Conform Google, arhitectura R8 a fost special concepută pentru a funcționa în mod multi-threading, ceea ce asigură o viteză ridicată de compilare.
R8 a fost anunțat la Google I/O 2018 și inclus pentru prima dată în Android Gradle Plugin 3.4 (2019) ca înlocuitor opțional al ProGuard. În AGP 7.0, R8 a devenit instrumentul implicit pentru toate proiectele, iar în AGP 8.0 (2023) suportul pentru ProGuard a fost complet eliminat din plugin. În 2025, R8 este singurul instrument oficial de ofuscare și optimizare pentru Android, recomandat de Google.
R8 oferă dezvoltatorilor un set de capabilități puternice care depășesc semnificativ ProGuard în ceea ce privește eficiența. Să analizăm principalele.
R8 efectuează o analiză globală a codului aplicației și a tuturor dependențelor sale, determinând clasele și metodele accesibile prin graficul de apeluri de la punctele de intrare. Analiza R8 este mai precisă decât cea a ProGuard datorită accesului la reprezentarea codului în DEX. R8 poate elimina nu doar clase și metode întregi, ci și câmpuri individuale care nu sunt niciodată utilizate. Conform testelor Google, R8 elimină în medie cu 15% mai mult cod decât ProGuard pe aceleași proiecte.
Desugaringul încorporat — o capacitate unică a R8 care lipsește în ProGuard. R8 transformă automat expresiile lambda, referințele la metode, interfețele cu metode default și try-with-resources Java 8+ în cod compatibil retroactiv care funcționează pe toate nivelurile API Android. Acest lucru eliberează dezvoltatorul de necesitatea de a conecta o bibliotecă separată desugar_jdk_libs și de a configura manual desugaringul.
Deoarece R8 vede formatul final DEX, poate efectua optimizări imposibile pentru ProGuard. R8 combină constantele șir identice, elimină excepțiile neutilizate, optimizează construcțiile switch și efectuează inline agresiv cu rescrierea graficului de apeluri. Aceste optimizări nu doar reduc dimensiunea APK, dar îmbunătățesc și performanța execuției codului pe ART.
// build.gradle activarea explicită a R8 (opțional în AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — forțarea activării R8
android.enableR8.fullMode=true
Alegerea între R8 și ProGuard este relevantă doar pentru proiectele care folosesc AGP mai vechi de 8.0. Pentru înțelegerea diferențelor arhitecturale, să analizăm comparația după parametrii cheie.
| Parametru | R8 | ProGuard |
|---|---|---|
| Integrare | Integrat în compilatorul DEX | Instrument separat |
| Compresia codului | Cu 15% mai eficientă | Nivel de bază |
| Viteza de compilare | Cu 20-30% mai rapidă | Viteză de bază |
| Desugaring | Încorporat | Nu este suportat |
| Compatibilitate reguli | Completă cu ProGuard | Sintaxă standard |
| Suport AGP 8.0+ | Da (standard) | Nu (eliminat) |
Testele Google pe un eșantion de 100 de aplicații populare din Play Store au arătat că R8 reduce dimensiunea APK cu o medie de 18% comparativ cu ProGuard. În unele proiecte cu utilizare activă a sintaxei Java 8+ și a bibliotecilor terțe, diferența ajungea la 28%. Pentru o aplicație de 40 MB, aceasta înseamnă o economie de 5 până la 11 MB, ceea ce este critic pentru utilizatorii cu trafic limitat.
Ambele instrumente procesează corect codul Kotlin, dar R8 optimizează mai bine construcțiile specifice Kotlin: lambda, funcții inline, corutine și tipuri null-safe. R8 înțelege semantica metadatelor Kotlin și poate elimina în siguranță verificările null suplimentare și poate încorpora funcții inline. Pentru proiectele în Kotlin, R8 este instrumentul recomandat de Google.
Configurarea R8 necesită modificări minime în configurația de compilare, deoarece în AGP 8.0+ instrumentul este folosit implicit. Să analizăm aspectele cheie ale configurației.
Modul complet R8 (android.enableR8.fullMode=true) activează optimizări mai agresive care oferă o reducere suplimentară a dimensiunii APK cu 5-10%. În acest mod, R8 efectuează o analiză mai profundă a codului, eliminând clase și metode pe care ProGuard le-ar considera accesibile. Modul complet poate necesita reguli -keep suplimentare pentru bibliotecile care folosesc reflection.
# gradle.properties — activarea modului complet R8
android.enableR8.fullMode=true
# Reguli suplimentare pentru full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
În cazul erorilor la compilarea release cu R8, Google recomandă: verificarea fișierului mapping pentru deofuscarea stacktrace-ului, dezactivarea temporară a fullMode pentru izolarea problemei, adăugarea -whyareyoukeeping pentru înțelegerea motivului pentru care clasa nu a fost eliminată și utilizarea flagului --info Gradle pentru obținerea unui log detaliat al procesării R8.
Pentru automatizarea compilării cu R8 în CI/CD, este importantă păstrarea fișierelor mapping ca artefacte de compilare. Fiecare fișier mapping trebuie asociat cu numărul de versiune și varianta de compilare. Google recomandă arhivarea build/outputs/mapping/ împreună cu APK/AAB în sistemul de gestionare a artefactelor. Aceasta va asigura posibilitatea deofuscării crash-urilor din orice versiune a aplicației.
Experiența de mai mulți ani de utilizare a R8 în comunitatea Android a dezvoltat un set de practici verificate care ajută la evitarea problemelor tipice și la obținerea beneficiului maxim de pe urma instrumentului.
La trecerea de la ProGuard la R8 se recomandă începerea cu AGP 7.x, unde R8 este activat implicit, dar fullMode este dezactivat. După verificarea stabilității compilării pe setul complet de dispozitive și scenarii, se poate activa fullMode. Fiecare etapă necesită testarea compilării release pe dispozitive fizice cu diferite versiuni de Android.
Fișierele mapping R8 au același format ca ProGuard, dar conțin mai multe informații datorită analizei mai detaliate. Google recomandă: păstrarea fișierelor mapping pe termen nelimitat — sunt necesare pentru deofuscarea crash-urilor versiunilor vechi; integrarea fișierelor mapping cu Firebase Crashlytics prin încărcare automată; verificarea periodică că deofuscarea în consola Firebase restabilește corect numele claselor.
Modul complet R8 poate elimina cod care este considerat accesibil în modul standard. Domenii critice pentru testare: ecrane cu WebView (R8 poate elimina clasele interfețelor bridge), aplicații cu pluginuri prin classLoader, biblioteci de analitică și raportare a crash-urilor și view-uri personalizate în fișierele layout create prin inflate.
Google recomandă urmărirea dimensiunii APK după aplicarea R8 în fiecare compilare. Utilizați APK Analyzer în Android Studio pentru compararea dimensiunii componentelor individuale: classes.dex, resources.arsc și bibliotecile de cod nativ. R8 poate influența dimensiunea fișierelor DEX neliniar — uneori optimizarea agresivă duce la creșterea dimensiunii din cauza inlinării. Monitorizarea regulată ajută la detectarea la timp a anomaliilor și corectarea regulilor de ofuscare.
// Exemplu de clasă păstrată pentru Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — păstrează toate clasele cu @Keep
// -keep @androidx.annotation.Keep class * { *; }
Întrebări frecvente
Nu, R8 este încorporat în Android Gradle Plugin și se instalează automat la actualizarea AGP. Începând cu AGP 8.0, ProGuard a fost complet eliminat din plugin, iar R8 este singurul instrument. Pentru AGP 7.x, R8 este utilizat implicit, dar ProGuard rămâne ca opțiune. Instalarea separată a R8 nu este necesară — este suficient să actualizați versiunea AGP.
R8 este mai rapid datorită a trei factori: integrarea în compilatorul DEX elimină o trecere suplimentară prin bytecod, arhitectura multi-threading utilizează mai eficient procesoarele multi-core, iar analiza mai inteligentă a accesibilității reduce volumul de cod procesat. Conform testelor Google pe un proiect de dimensiune medie, R8 efectuează procesarea în 12 secunde față de 18 secunde pentru ProGuard.
În AGP 7.x se poate dezactiva R8 prin gradle.properties: android.enableR8=false. În AGP 8.0+ revenirea la ProGuard nu este posibilă, deoarece pluginul a trecut complet la R8. Dacă proiectul depinde critic de comportamentul specific al ProGuard, se recomandă fixarea AGP la versiunea 7.4, unde ambele instrumente sunt disponibile.
R8 procesează corect corutinele Kotlin datorită analizei încorporate a metadatelor Kotlin. Instrumentul înțelege semantica funcțiilor suspend, a obiectelor Continuation și a generării StateMachine de către compilatorul Kotlin. R8 nu elimină clasele necesare de corutine și le poate optimiza dacă este sigur. Pentru proiectele în Kotlin, se recomandă fullMode pentru optimizare maximă.
Cele mai frecvente probleme la migrare: Missing classes — R8 elimină clase pe care ProGuard le păstra; Inlining issues — inlinarea agresivă strică reflecția; Library incompatibility — biblioteci cu reguli vechi ProGuard; Full mode crashes — eliminarea suplimentară a codului în fullMode. Soluție: testați pe dispozitive fizice, utilizați -keep pentru reflection și verificați stacktrace-ul prin fișierul mapping.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și