R8: cos'è, funzionalità e confronto con ProGuard

Autore: IT Sectr Pubblicato: 2026-04-03 Tempo di lettura: 8 min

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 è il successore di ProGuard, integrato nel compilatore DEX e che sostituisce ProGuard a partire da AGP 8.0.
  • Compressione del codice in R8 è più efficiente di ProGuard — rimuove fino al 15% in più di metodi e classi inutilizzati.
  • Desugaring — supporto integrato per convertire la sintassi Java 8+ in codice retrocompatibile.
  • Velocità di compilazione con R8 è superiore del 20-30% grazie all'integrazione nel compilatore DEX.
  • Compatibilità con la sintassi delle regole ProGuard garantisce una migrazione trasparente.

Cos'è R8?

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.

Architettura di R8

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.

Storia dello sviluppo

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.

Caratteristiche principali di R8

R8 offre agli sviluppatori un insieme di potenti capacità che superano significativamente ProGuard in efficienza. Vediamo le principali.

Minificazione e compressione del codice

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.

Desugaring Java 8+

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.

Ottimizzazione a livello DEX

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.

groovy
// 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

Confronto R8 vs ProGuard

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.

ParametroR8ProGuard
IntegrazioneIntegrato nel compilatore DEXStrumento separato
Compressione codice15% più efficienteLivello base
Velocità compilazione20-30% più veloceVelocità base
DesugaringIntegratoNon supportato
Compatibilità regoleCompleta con ProGuardSintassi standard
Supporto AGP 8.0+Sì (standard)No (rimosso)

Dimensione finale dell'APK

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.

Compatibilità con Kotlin

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.

Configurazione di R8 in un progetto Android

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.

Modalità completa di R8

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.

properties
# 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 *;
}

Debug dei problemi di R8

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.

Integrazione CI/CD

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.

Buone pratiche con R8

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.

Adozione graduale

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.

Monitoraggio dei file mapping

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.

Test con R8 full mode

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.

Monitoraggio della dimensione della build

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.

kotlin
// 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

Devo installare R8 separatamente?

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.

Perché R8 è più veloce di ProGuard?

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.

Posso disabilitare R8 e tornare a 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.

Come gestisce R8 le coroutine Kotlin?

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.

Quali errori si verificano più comunemente durante la migrazione a R8?

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

  • R8 è il successore di ProGuard, integrato nel compilatore DEX e che sostituisce ProGuard a partire da AGP 8.0.
  • Compressione codice di R8 è il 15% più efficiente di ProGuard, riducendo l'APK di ulteriori 5-11 MB.
  • Velocità di compilazione con R8 è del 20-30% superiore grazie all'architettura multithread.
  • Desugaring Java 8+ è integrato in R8, eliminando la necessità di librerie aggiuntive.
  • Full mode abilita ottimizzazioni aggressive per la massima compressione dell'APK.
  • Compatibilità delle regole ProGuard con R8 garantisce una migrazione trasparente per i progetti esistenti.
  • File mapping di R8 sono obbligatori per l'archiviazione e l'integrazione con Firebase Crashlytics.

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.

Discuti il progetto

Leggi anche