Competenze Android
Visualizza su GitHubStrumento di analisi R8
android skills add --skill 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
- Riduzione della memoria utilizzata
- Miglioramento del rendering e delle prestazioni di runtime
- 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:
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 di release. - Aggiungi le tue regole keep 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 di 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 keep per consentire la massima ottimizzazione di classi, campi e metodi.
Per perfezionare le regole keep, utilizza lo strumento di analisi della configurazione R8.
Lo strumento di analisi della configurazione R8 ti consente di:
- Monitorare e migliorare la qualità complessiva della configurazione R8 monitorando le metriche fornite dal report dello strumento di analisi della configurazione R8.
- Trovare le regole keep più ampie, ovvero quelle che impediscono la maggior parte dell'ottimizzazione
- e capire quale ottimizzazione impediscono per perfezionarle.
Lo strumento di analisi della configurazione R8 è 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 keep che trattavano efficacemente la riduzione delle risorse separatamente dal codice, spesso mantenendo 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 keep 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:
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 è abilitato 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 presente:
bash android.enableR8.fullMode=false # Remove this line from your codebase.
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 keep 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 keep Android predefinite sono escluse.
Set di risorse`keepRules`: se utilizzi il nuovo DSL, devi inserire le regole keep 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 consumer 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 consumer 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. Questa funzionalità è 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. È abilitata 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 reflection e altre funzionalità dinamiche. Sebbene riduca le dimensioni dell'app e migliori le prestazioni, potrebbe richiedere regole keep aggiuntive per impedire la rimozione del codice necessario.
|