Skill di Android
Visualizza su GitHubStrumento di analisi R8
android skills add r8-analyzerPer un'esperienza utente ottimale, devi ottimizzare l'app per renderla il più piccola e veloce possibile. Il nostro strumento di ottimizzazione delle app, chiamato R8, semplifica l'app rimuovendo codice e risorse inutilizzati, riscrivendo il codice per ottimizzare le prestazioni di runtime e altro ancora. Per gli utenti, questo significa:
- Avvii più rapidi
- Memoria utilizzata ridotta
- Prestazioni di rendering e runtime migliorate
- Meno ANR
Panoramica dell'ottimizzazione R8
R8 utilizza un processo in più fasi per ottimizzare le dimensioni e la velocità dell'app. Le operazioni principali includono le seguenti:
Riduzione del codice (nota anche come tree shaking): R8 identifica e rimuove il codice non raggiungibile dall'applicazione e dalle relative dipendenze della libreria. Analizzando i punti di ingresso dell'app (ad esempio
ActivitiesoServicesdefiniti nel file manifest), R8 crea un grafico del codice a cui viene fatto riferimento e rimuove tutto ciò a cui non viene fatto riferimento.Ottimizzazioni logiche: R8 riscrive il codice per migliorare l'efficienza di esecuzione e ridurre il sovraccarico. Le tecniche principali includono:
Inlining dei metodi: R8 sostituisce un sito di chiamata al metodo con il corpo effettivo del metodo chiamato. In questo modo si elimina il sovraccarico di una chiamata di funzione e R8 può eseguire ulteriori ottimizzazioni.
Unione delle classi: R8 combina insiemi di classi e interfacce in una singola classe. In questo modo si riduce il numero di classi nell'app, si riduce la pressione sulla memoria e si migliora la velocità di avvio.
Offuscamento (noto anche come minimizzazione): per ridurre le dimensioni del file DEX , R8 abbrevia i nomi di classi, campi e metodi (ad esempio,
com.example.MyActivitypotrebbe diventarea.b.a).
A partire dalla versione 8.12.0 del plug-in Android per Gradle (AGP), R8 ottimizza anche le risorse nell'ambito delle sue fasi di ottimizzazione. Per ulteriori informazioni, consulta Riduzione ottimizzata delle risorse.
Abilitare l'ottimizzazione
Per abilitare l'ottimizzazione dell'app, utilizza il DSL appropriato in base alla versione AGP del progetto. Ti consigliamo di abilitare l'ottimizzazione dell'app solo nella versione finale dell'app che testi prima della pubblicazione, in genere la build di release, perché le ottimizzazioni aumentano il tempo di compilazione del progetto e possono rendere più difficile il debug a causa del modo in cui modificano il codice.
Per le versioni AGP 9.3 e successive
Per abilitare l'ottimizzazione dell'app per AGP 9.3 e versioni successive:
- Imposta
enable = truenel bloccooptimizationnello script di build a livello di app della build della release. - Aggiungi le tue regole di conservazione a un file con il suffisso
.keepnelsrc/<variant>/keepRulesset di risorse. Ad esempio,src/main/keepRules/custom-rules.keep.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Alla moda
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
DSL legacy per le versioni AGP precedenti alla 9.3
Per abilitare l'ottimizzazione dell'app, imposta isMinifyEnabled = true (per l'ottimizzazione del codice)
e isShrinkResources = true (per l'ottimizzazione delle risorse) nello script di build a livello di app della build della release
build's. Ti consigliamo di abilitare sempre entrambe le impostazioni.
DSL legacy (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
DSL legacy (Groovy)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
Migliorare l'ottimizzazione R8
I vantaggi in termini di prestazioni di R8 sono direttamente correlati alla quantità di codebase che R8 è in grado di ottimizzare. Per ottenere il massimo da R8, segui le best practice:
- Abilita R8 in modalità completa
- Abilita l'offuscamento, l'ottimizzazione e la riduzione
- Abilita la riduzione delle risorse e la riduzione ottimizzata delle risorse
- Perfeziona le regole di conservazione per consentire la massima ottimizzazione di classi, campi e metodi.
Per perfezionare le regole di conservazione, utilizza R8 Configuration Analyzer.
R8 Configuration Analyzer ti consente di:
- Monitorare e migliorare la qualità complessiva della configurazione R8 monitorando le metriche fornite dal report di R8 Configuration Analyzer.
- Trovare le regole di conservazione più ampie, quelle che impediscono la massima ottimizzazione
- e capire quale ottimizzazione impediscono per perfezionarle.
R8 Configuration Analyzer è disponibile in AGP versione 9.3.0-alpha05 o da R8 versione 9.3.7-dev. Per ulteriori informazioni, consulta Analizzare la configurazione R8.
Ottimizzare la riduzione delle risorse per app ancora più piccole
La versione 8.12.0 di AGP introduce la riduzione ottimizzata delle risorse, che mira a integrare l'ottimizzazione delle risorse e del codice per creare app ancora più piccole e veloci. Prima della riduzione ottimizzata delle risorse, Android Asset Packaging Tool (AAPT2) generava regole di conservazione che trattavano efficacemente la riduzione delle risorse separatamente dal codice, spesso conservando codice o risorse inaccessibili che facevano riferimento l'uno all'altro.
Con la riduzione ottimizzata delle risorse, le risorse vengono considerate come parte del codice del programma, formando il grafico di riferimento. Quando una raccolta di codice o risorse non viene referenziata, non è protetta da una regola di conservazione e può essere rimossa.
Abilitare la riduzione ottimizzata delle risorse
Per abilitare la nuova pipeline di riduzione ottimizzata delle risorse per AGP 8.12 o 8.13, aggiungi quanto segue al file gradle.properties del progetto:
android.r8.optimizedResourceShrinking=true
Se utilizzi AGP 9.0.0 o una versione successiva, non devi impostare android.r8.optimizedResourceShrinking=true. La riduzione ottimizzata delle risorse viene applicata automaticamente quando isShrinkResources = true è abilitata nella configurazione della build.
Verificare e configurare le impostazioni di ottimizzazione R8
Per consentire a R8 di utilizzare tutte le sue funzionalità di ottimizzazione, rimuovi la
seguente riga dal file gradle.properties del progetto, se esiste:
android.enableR8.fullMode=false
Tieni presente che l'abilitazione dell'ottimizzazione dell'app rende difficile la comprensione delle analisi dello stack, soprattutto se R8 rinomina i nomi di classi o metodi. Per ottenere analisi dello stack che corrispondano correttamente al codice sorgente, consulta Recuperare l'analisi dello stack originale.
Se R8 è abilitato, devi anche creare profili di avvio per prestazioni di avvio ancora migliori.
Se abiliti l'ottimizzazione dell'app e si verificano errori, ecco alcune strategie per risolverli:
- Aggiungi regole di conservazione per mantenere intatto il codice.
- Adotta le ottimizzazioni in modo incrementale.
- Aggiorna il codice per utilizzare librerie più adatte all' ottimizzazione.
Se ti interessa ottimizzare la velocità di build, consulta Configurare la modalità di esecuzione di R8 per informazioni su come configurare R8 in base al tuo ambiente.
Modifiche al comportamento della versione AGP e R8
La tabella seguente descrive le funzionalità principali introdotte in varie versioni del plug-in Android per Gradle (AGP) e del compilatore R8.
| Versione AGP | Funzionalità introdotte |
|---|---|
| 9.3 |
DSL semplificato: il nuovo blocco `optimization {}` richiede meno configurazione: la riduzione ottimizzata delle risorse è sempre abilitata, le regole di conservazione Android predefinite sono escluse.
Set di risorse`keepRules`: se utilizzi il nuovo DSL, devi inserire le regole di conservazione nel set di risorse src/<variant>/keepRules, nei file con il suffisso .keep. I set di origine sono compatibili anche con il DSL legacy.
Regole di consumo KMP (Kotlin MultiPlatform): KMP non richiede più l'impostazione di publish = true e supporta il set di risorse src/<variant>/keepRules con l'estensione .keep.
Tieni presente che il DSL legacy è ancora supportato. |
| 9.1 |
Classi riconfezionate per impostazione predefinita: R8 riconfeziona le classi (spostandole nel pacchetto senza nome, a livello principale) per compattare ulteriormente DEX, eliminando la necessità di specificare l'opzione -repackageclasses. Per informazioni su come funziona e su come disattivare questa opzione, consulta Opzioni globali.
|
| 9.0 |
Riduzione ottimizzata delle risorse: abilitata per impostazione predefinita (controllata tramite android.r8.optimizedResourceShrinking). La riduzione ottimizzata delle risorse consente di integrare la riduzione delle risorse con la pipeline di ottimizzazione del codice, ottenendo app più piccole e veloci. Ottimizzando contemporaneamente i riferimenti a codice e risorse, identifica e rimuove le risorse a cui viene fatto riferimento esclusivamente dal codice inutilizzato. Si tratta di un miglioramento significativo rispetto ai precedenti processi di ottimizzazione separati.Questa funzionalità è particolarmente utile per le app che condividono risorse e codice sostanziali tra diversi verticali di fattori di forma, con miglioramenti misurati di oltre il 50% nelle dimensioni dell'app. La riduzione delle dimensioni risultante comporta download più piccoli, installazioni più rapide e un'esperienza utente migliore con avvio più rapido, rendering migliorato e meno ANR. Filtro delle regole della libreria: il supporto per le opzioni globali (ad esempio -dontobfuscate) nelle regole di consumo della libreria è stato rimosso e le app le filtreranno. Per ulteriori informazioni, consulta Aggiungere opzioni globali.Controlli null di Kotlin: ottimizzati per impostazione predefinita (controllati tramite -processkotlinnullchecks). Questa versione ha introdotto anche miglioramenti significativi nella velocità di build. Per ulteriori informazioni, consulta Opzioni globali per un'ulteriore ottimizzazione.Ottimizzare pacchetti specifici: puoi utilizzare packageScope per ottimizzare pacchetti specifici. Questo è in fase di supporto sperimentale. Per ulteriori informazioni, consulta Ottimizzare i pacchetti specificati con packageScope.Ottimizzato per impostazione predefinita: il supporto per getDefaultProguardFile("proguard-android.txt") è stato rimosso perché include -dontoptimize, che deve essere evitato. Utilizza invece "proguard-android-optimize.txt". Se devi disabilitare globalmente l'ottimizzazione nella tua app, aggiungi manualmente il flag a un file ProGuard.
|
| 8.12 |
Riduzione ottimizzata delle risorse: è stato aggiunto il supporto iniziale (controllato tramite android.r8.optimizedResourceShrinking). La riduzione ottimizzata delle risorse consente di integrare la riduzione delle risorse con la pipeline di ottimizzazione del codice. In questa versione di AGP devi abilitarla manualmente.Retracing di Logcat: supporto per il retracing automatico nella finestra Logcat di Android Studio. |
| 8.6 |
Retracing migliorato: include il retracing del nome file e del numero di riga per impostazione predefinita per tutti i livelli minSdk (in precedenza era richiesto minSdk 26+ nella versione 8.2).L'aggiornamento di R8 contribuisce a garantire che le analisi dello stack delle build offuscate siano facilmente e chiaramente leggibili. Questa versione migliora la mappatura dei numeri di riga e dei file di origine, semplificando la retracing automatica degli arresti anomali al codice sorgente originale da parte di strumenti come Logcat di Android Studio. |
| 8.0 |
Modalità completa per impostazione predefinita: la modalità completa di R8 offre un'ottimizzazione significativamente più potente. È abilitato per impostazione predefinita. Puoi disattivare questa opzione utilizzando android.enableR8.fullMode=false.
|
| 7.0 |
Modalità completa disponibile: introdotta come funzionalità di attivazione utilizzando android.enableR8.fullMode=true. La modalità completa applica ottimizzazioni più potenti facendo ipotesi più rigorose su come il codice utilizza la riflessione e altre funzionalità dinamiche. Sebbene riduca le dimensioni dell'app e ne migliori le prestazioni, potrebbe richiedere regole di conservazione aggiuntive per impedire la rimozione del codice necessario.
|
Utilizzare R8 con altri sistemi di build
Sebbene AGP sia il sistema di compilazione consigliato e ufficialmente supportato per le app per Android, potresti utilizzare un sistema di compilazione alternativo come Bazel. Se utilizzi Bazel, puoi integrare R8 nella pipeline di build per ridurre, offuscare e ottimizzare l'app.
Per informazioni sull'ottimizzazione di un'app per Android utilizzando Bazel, consulta la documentazione
rules_android di Bazel. Tieni presente che Bazel non è
ufficialmente supportato per lo sviluppo di app per Android.