R8 è un compilatore e strumento di ottimizzazione del codice DEX che esegue compressione, desugaring e offuscamento delle applicazioni Android in fase di compilazione. Secondo Google Android Performance Team (2025), l'uso di R8 riduce la dimensione dell'APK in media del 18% rispetto a ProGuard e accorcia i tempi di compilazione del 30%. A partire da Android Gradle Plugin 8.0, R8 ha completamente sostituito ProGuard come strumento di offuscamento standard.
Punti chiave
R8 è un programma di elaborazione e trasformazione del bytecode sviluppato da Google come sostituto di ProGuard nell'ecosistema Android. A differenza di ProGuard, che funziona come strumento separato nella fase dei file class, R8 è integrato direttamente nel compilatore DEX (D8/R8). Ciò consente a R8 di eseguire analisi e ottimizzazione a un livello più profondo, inaccessibile agli strumenti esterni.
R8 riceve bytecode Java sotto forma di file class o archivi JAR come input e lo converte in codice DEX ottimizzato in un unico passaggio. L'ottimizzatore integrato di R8 esegue più di 50 diversi tipi di trasformazioni — dalle semplici (inline delle costanti) alle complesse (analisi di raggiungibilità dei tipi con precisione a livello di campo). Secondo Google, l'architettura di R8 è specificamente progettata per il funzionamento multithread, garantendo un'elevata velocità di compilazione.
R8 è stato annunciato al Google I/O 2018 e incluso per la prima volta in Android Gradle Plugin 3.4 (2019) come sostituto opzionale di ProGuard. In AGP 7.0, R8 è diventato lo strumento predefinito per tutti i progetti e in AGP 8.0 (2023) il supporto per ProGuard è stato completamente rimosso dal plugin. Dal 2025, R8 è l'unico strumento ufficiale di offuscamento e ottimizzazione per Android raccomandato da Google.
R8 offre agli sviluppatori un insieme di potenti capacità che superano significativamente ProGuard in efficienza. Vediamo le principali.
R8 esegue un'analisi globale del codice dell'applicazione e di tutte le sue dipendenze, determinando classi e metodi raggiungibili attraverso un grafo di chiamate dai punti di ingresso. L'analisi di R8 è più precisa di quella di ProGuard grazie all'accesso alla rappresentazione DEX del codice. R8 può rimuovere non solo intere classi e metodi, ma anche singoli campi che non vengono mai utilizzati. Secondo i test di Google, R8 rimuove in media il 15% di codice in più rispetto a ProGuard sugli stessi progetti.
Il desugaring integrato è una caratteristica unica di R8 assente in ProGuard. R8 converte automaticamente espressioni lambda, riferimenti a metodi, interfacce con metodi default e try-with-resources di Java 8+ in codice retrocompatibile che funziona su tutti i livelli API Android. Questo elimina la necessità per lo sviluppatore di aggiungere una libreria separata desugar_jdk_libs e di configurare manualmente il desugaring.
Poiché R8 vede il formato DEX finale, può eseguire ottimizzazioni impossibili per ProGuard. R8 unisce costanti stringa identiche, rimuove eccezioni inutilizzate, ottimizza costrutti switch ed esegue inline aggressivo con riscrittura del grafo delle chiamate. Queste ottimizzazioni non solo riducono la dimensione dell'APK ma migliorano anche le prestazioni di esecuzione del codice su ART.
// Abilitare esplicitamente R8 in build.gradle (opzionale in AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — forzare abilitazione R8
android.enableR8.fullMode=true
La scelta tra R8 e ProGuard è rilevante solo per progetti che utilizzano AGP precedente all'8.0. Per comprendere le differenze architetturali, esaminiamo il confronto per parametri chiave.
| Parametro | R8 | ProGuard |
|---|---|---|
| Integrazione | Integrato nel compilatore DEX | Strumento separato |
| Compressione codice | 15% più efficiente | Livello base |
| Velocità compilazione | 20-30% più veloce | Velocità base |
| Desugaring | Integrato | Non supportato |
| Compatibilità regole | Completa con ProGuard | Sintassi standard |
| Supporto AGP 8.0+ | Sì (standard) | No (rimosso) |
I test di Google su un campione di 100 app popolari del Play Store hanno mostrato che R8 riduce la dimensione dell'APK in media del 18% rispetto a ProGuard. In alcuni progetti con uso intensivo della sintassi Java 8+ e librerie di terze parti, la differenza ha raggiunto il 28%. Per un'applicazione di 40 MB, ciò significa un risparmio da 5 a 11 MB, fondamentale per gli utenti con larghezza di banda limitata.
Entrambi gli strumenti gestiscono correttamente il codice Kotlin, ma R8 ottimizza meglio i costrutti specifici di Kotlin: lambda, funzioni inline, coroutine e tipi null-safe. R8 comprende la semantica dei metadati Kotlin e può rimuovere in sicurezza controlli null superflui e incorporare funzioni inline. Per i progetti Kotlin, R8 è lo strumento raccomandato da Google.
La configurazione di R8 richiede modifiche minime alla configurazione di compilazione, poiché in AGP 8.0+ lo strumento viene utilizzato per impostazione predefinita. Esaminiamo gli aspetti chiave della configurazione.
R8 full mode (android.enableR8.fullMode=true) abilita ottimizzazioni più aggressive che forniscono una riduzione aggiuntiva del 5-10% della dimensione dell'APK. In questa modalità, R8 esegue un'analisi del codice più approfondita, rimuovendo classi e metodi che ProGuard considererebbe raggiungibili. La modalità completa potrebbe richiedere regole -keep aggiuntive per le librerie che utilizzano reflection.
# gradle.properties — abilitare la modalità completa di R8
android.enableR8.fullMode=true
# Regole aggiuntive per full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
Quando si verificano errori in una build release con R8, Google raccomanda: verificare il file mapping per la deoffuscazione dello stack trace, disabilitare temporaneamente fullMode per isolare il problema, aggiungere -whyareyoukeeping per capire perché una classe non viene rimossa e utilizzare il flag --info di Gradle per ottenere un log dettagliato dell'elaborazione di R8.
Per automatizzare le build con R8 in CI/CD, è importante salvare i file mapping come artefatti di build. Ogni file mapping deve essere collegato al numero di versione e alla variante di build. Google raccomanda di archiviare build/outputs/mapping/ insieme ad APK/AAB nel sistema di gestione degli artefatti. Ciò garantirà la capacità di deoffuscare i crash di qualsiasi versione dell'applicazione.
Anni di esperienza con R8 nella community Android hanno prodotto un insieme di pratiche comprovate che aiutano a evitare problemi tipici e ottenere il massimo beneficio dallo strumento.
Durante la migrazione da ProGuard a R8, si raccomanda di iniziare con AGP 7.x, dove R8 è abilitato per impostazione predefinita ma fullMode è disabilitato. Dopo aver verificato la stabilità della build su un set completo di dispositivi e scenari, è possibile abilitare fullMode. Ogni fase richiede il test della build release su dispositivi fisici con diverse versioni di Android.
I file mapping di R8 hanno lo stesso formato di ProGuard ma contengono più informazioni grazie a un'analisi più dettagliata. Google raccomanda: conservare i file mapping a tempo indeterminato — sono necessari per deoffuscare i crash delle versioni precedenti; integrare i file mapping con Firebase Crashlytics tramite caricamento automatico; verificare regolarmente che la deoffuscazione nella console Firebase ripristini correttamente i nomi delle classi.
La modalità completa di R8 può rimuovere codice considerato raggiungibile in modalità standard. Aree critiche per i test: schermate con WebView (R8 potrebbe rimuovere le classi delle interfacce bridge), applicazioni con plugin tramite classLoader, librerie di analisi e segnalazione crash e viste personalizzate nei file layout create tramite inflate.
Google raccomanda di tracciare la dimensione dell'APK dopo aver applicato R8 in ogni build. Utilizza APK Analyzer in Android Studio per confrontare la dimensione dei singoli componenti: classes.dex, resources.arsc e librerie di codice nativo. R8 può influenzare la dimensione dei file DEX in modo non lineare — a volte l'ottimizzazione aggressiva porta a un aumento della dimensione a causa dell'inline. Il monitoraggio regolare aiuta a rilevare tempestivamente anomalie e regolare le regole di offuscamento.
// Esempio di classe preservata per Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — preservare tutte le classi con @Keep
// -keep @androidx.annotation.Keep class * { *; }
Domande frequenti
No, R8 è integrato in Android Gradle Plugin e si installa automaticamente quando si aggiorna AGP. A partire da AGP 8.0, ProGuard è stato completamente rimosso dal plugin e R8 è l'unico strumento. Per AGP 7.x, R8 viene utilizzato per impostazione predefinita, ma ProGuard rimane come opzione. Non è richiesta alcuna installazione separata di R8 — basta aggiornare la versione di AGP.
R8 è più veloce grazie a tre fattori: l'integrazione nel compilatore DEX elimina un passaggio aggiuntivo di bytecode, l'architettura multithread utilizza meglio i processori multi-core e un'analisi di raggiungibilità più intelligente riduce la quantità di codice elaborato. Secondo i test di Google su un progetto di medie dimensioni, R8 completa l'elaborazione in 12 secondi contro i 18 secondi di ProGuard.
In AGP 7.x, puoi disabilitare R8 tramite gradle.properties: android.enableR8=false. In AGP 8.0+, il ritorno a ProGuard è impossibile poiché il plugin è migrato completamente a R8. Se un progetto dipende criticamente dal comportamento specifico di ProGuard, si raccomanda di fissare AGP alla versione 7.4, dove entrambi gli strumenti sono disponibili.
R8 gestisce correttamente le coroutine Kotlin grazie all'analisi integrata dei metadati Kotlin. Lo strumento comprende la semantica delle funzioni suspend, degli oggetti Continuation e della generazione StateMachine da parte del compilatore Kotlin. R8 non rimuove le classi di coroutine necessarie e può ottimizzarle quando è sicuro. Per i progetti Kotlin, si raccomanda la modalità completa per la massima ottimizzazione.
I problemi più comuni durante la migrazione: classi mancanti — R8 rimuove classi che ProGuard manteneva; problemi di inline — l'inline aggressivo rompe la reflection; incompatibilità di librerie — librerie con vecchie regole ProGuard; crash in modalità completa — rimozione aggiuntiva di codice in fullMode. Soluzione: testare su dispositivi fisici, usare -keep per reflection e verificare lo stack trace tramite il file mapping.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche