R8 Configuration Analyzer è uno strumento progettato per aiutarti a massimizzare i vantaggi in termini di prestazioni di R8 fornendo informazioni dettagliate sulla qualità della configurazione della tua app. Ti consente di monitorare e migliorare l'ottimizzazione R8 monitorando le metriche chiave, in particolare i punteggi di riduzione, ottimizzazione e offuscamento, che indicano la percentuale del codebase disponibile per l'ottimizzazione. Identificando regole di conservazione ampie o non necessarie, incluse quelle introdotte da librerie di terze parti, l'analizzatore ti aiuta a perfezionare la configurazione per garantire che R8 possa ottimizzare efficacemente il maggior numero possibile di classi, campi e metodi.
Genera il report
Con AGP 9.3.0 e versioni successive, puoi generare il report di R8 Configuration Analyzer utilizzando un'attività Gradle autonoma dedicata o automaticamente durante una build R8.
Esegui l'attività Gradle autonoma (consigliata per l'utilizzo locale)
Quando esegui l'iterazione attiva sulle regole di conservazione, utilizza l'attività Gradle autonoma per valutare rapidamente l'impatto delle modifiche senza creare completamente l'APK o il bundle:
./gradlew :app:analyzeReleaseR8Config
Poiché questa attività ignora la generazione di APK o bundle, fornisce un ciclo di feedback molto più breve. In questo modo puoi analizzare rapidamente l'impatto delle regole di conservazione sui punteggi di riduzione, ottimizzazione e offuscamento e perfezionarli immediatamente. Il report
HTML viene generato alle
app/build/reports/r8/r8-config-analyzer-release.html.
Generati automaticamente durante le build regolari
Quando esegui una build di release R8 completa (ad esempio assembleRelease), il report viene
generato automaticamente in build/outputs/mapping/release/configanalyzer.html.
Per disattivare la generazione automatica degli output durante le build regolari, imposta
la seguente proprietà Gradle:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Per AGP 9.2 e versioni precedenti
Per AGP 9.2 e versioni precedenti, imposta la proprietà di sistema
com.android.tools.r8.dumpkeepradiushtmltodirectory quando
esegui un'attività Gradle con una build abilitata con R8.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
Ad esempio, utilizza il seguente comando per generare il report HTML nella directory
/tmp/r8analysis:
# To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
# To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
Comprendere il report
R8 Configuration Analyzer fornisce informazioni sulla configurazione R8 della tua app e sull'impatto di ogni regola di conservazione sull'app. In questo modo, puoi ottenere la massima ottimizzazione da R8, migliorando le prestazioni dell'app. Utilizza i seguenti punteggi per capire quanto del tuo codebase è disponibile per l'ottimizzazione da parte di R8.
Punteggio di riduzione
Quando R8 riduce le dimensioni dell'app, ne riduce le dimensioni complessive identificando ed eliminando il codice e le risorse inutilizzati, assicurando che la build finale sia il più snella possibile. Il punteggio di riduzione tiene traccia della percentuale di classi, campi e metodi soggetti a riduzione. Ad esempio, un punteggio di riduzione del 66% significa che R8 può eseguire la riduzione nel 66% del tuo codebase.
Punteggio di ottimizzazione
R8 esegue ottimizzazioni come l'incorporamento dei metodi e l'unione delle classi, il che comporta miglioramenti dell'avvio e della memoria per la tua app. Il punteggio di ottimizzazione monitora la percentuale di classi, campi e metodi soggetti alle ottimizzazioni R8. Ad esempio, se il punteggio di ottimizzazione è del 66%, significa che R8 può eseguire l'ottimizzazione solo nel 66% del codebase.
Punteggio di offuscamento
Offuscando classi, campi e metodi in nomi più brevi, R8 riduce il footprint dei metadati dell'app per risparmiare memoria. Il punteggio di offuscamento misura la percentuale di codice disponibile per l'offuscamento all'interno del tuo codebase.
Perfezionare le regole di conservazione
Per migliorare i punteggi e sbloccare un'ottimizzazione R8 migliore, devi perfezionare le regole di conservazione in modo che non impediscano inutilmente a R8 di ottimizzare la tua app. Devi conservare solo le classi, i metodi o i campi a cui si accede tramite reflection.
Per farlo, utilizza l'analisi delle regole di conservazione.
Per visualizzare l'analisi dettagliata di una regola, fai clic per aprire la schermata dei dettagli.
Come perfezionare le regole di conservazione
Per perfezionare le regole di conservazione e sfruttare appieno il potenziale delle ottimizzazioni R8 per la tua app:
- Per ogni regola di conservazione, visualizza la percentuale di classi, campi e metodi che non possono essere ottimizzati da R8 in Configuration Analyzer. Utilizzalo per identificare le regole di conservazione che impediscono l'ottimizzazione in un numero elevato di classi, campi o metodi. Vengono elencate anche le proprietà di ottimizzazione impedite da ogni regola di conservazione.
- Se vedi una regola di conservazione che impedisce l'ottimizzazione di un numero elevato di classi, devi assicurarti di controllare quali classi, campi e metodi non possono essere ottimizzati dalla regola di conservazione per verificare se questa regola conserva elementi che non vengono richiamati dinamicamente utilizzando la reflection.
- Riduci l'ottimizzazione bloccata dalle regole di conservazione scegliendo l'opzione di conservazione corretta e seguendo le best practice, in modo da scegliere come target solo le classi, i campi o i metodi necessari.
- Esamina ed esegui test che coprano le classi, i campi e i metodi interessati della regola di conservazione e perfeziona le regole di conservazione.
Esaminare l'ottimizzazione delle librerie
Quando integri librerie di terze parti, spesso includono le proprie regole di conservazione per funzionare con R8. Poiché l'autore della libreria non può prevedere la tua implementazione specifica, a volte scrive regole conservative e di ampia portata che impediscono l'ottimizzazione in più classi, campi e metodi del necessario. Ciò potrebbe impedire a R8 di ottimizzare parti della tua app che non hanno nulla a che fare con l'esecuzione effettiva della libreria in fase di runtime. Puoi utilizzare R8 Configuration Analyzer per identificare le librerie che introducono regole che influiscono negativamente sull'ottimizzazione della tua app.
Utilizza l'analizzatore della configurazione per esaminare l'effetto combinato di tutte le regole di conservazione dei consumatori unite. Analizzando l'impatto di ogni regola di conservazione proveniente da una libreria di terze parti, puoi identificare e tracciare le librerie di terze parti specifiche che impediscono un elevato livello di ottimizzazione nella tua app.
Come ottimizzare le librerie
Per risolvere i problemi relativi alle regole di conservazione introdotte dalle librerie di terze parti:
- Se una libreria include una regola eccessivamente ampia, ti consigliamo di contattare il manutentore della libreria con i dati del report per dimostrare in che modo le regole attuali influiscono sui punteggi di ottimizzazione della tua app. Se si tratta di una libreria esterna, cerca bug esistenti nella libreria prima di segnalare problemi.
- Se necessario, puoi testare i potenziali miglioramenti filtrando le regole di una libreria specifica. Puoi importare le regole della libreria nel tuo progetto, escludere quelle generiche ed eseguire di nuovo l'analizzatore della configurazione per misurare i potenziali miglioramenti in termini di dimensioni e prestazioni.
Regole incluse
Potrebbero esserci casi in cui più regole di conservazione si sovrappongono e una delle regole potrebbe impedire un'ottimizzazione maggiore del necessario. Se nel codebase sono presenti due regole di conservazione.
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
La prima regola di conservazione che impedisce l'ottimizzazione dell'intero pacchetto comprende la seconda regola di conservazione che ha come target una classe all'interno del pacchetto conservata dalla prima regola di conservazione. Quando le regole di conservazione si sovrappongono, una potrebbe bloccare più ottimizzazioni del necessario. Perfezionando queste regole sovrapposte, puoi massimizzare l'ottimizzazione R8 ed eliminare il debito tecnico. Questo processo prevede la semplificazione della configurazione per garantire che venga mantenuto solo il codice essenziale, sfruttando appieno il potenziale delle funzionalità di ottimizzazione di R8.
Ottimizzare le regole incluse
- Trova le regole di conservazione di inclusione utilizzando lo strumento di analisi della configurazione R8.
- Identifica le classi, i campi o i metodi esatti nel tuo codebase che si basano effettivamente sulla reflection, che deve essere mantenuta utilizzando le regole keep. Conoscere questo aspetto ti aiuterà a perfezionare le regole di conservazione.
- Utilizzando l'analizzatore della configurazione, confronta l'impatto di ogni regola che ha come target le stesse classi, gli stessi campi o gli stessi metodi. Puoi utilizzare la percentuale di ottimizzazione impedita da ogni regola di conservazione per identificare quale è più ampia e quale è più ristretta.
- Se la regola restrittiva è scritta con precisione, mantenendo solo i membri o le classi a cui si accede in modo riflessivo, rimuovi la regola di conservazione più ampia. In questo modo, vengono sbloccate in modo sicuro le ottimizzazioni R8 per il resto del pacchetto.
- Se la regola generale ha come target le classi giuste, mantienila ed elimina la regola specifica. La regola restrittiva è solo un ingombro ridondante. Assicurati di perfezionare la regola generica in modo da scegliere come target solo le classi, i campi o i metodi che hai identificato.
Verifica e testa le modifiche: esegui di nuovo l'analizzatore della configurazione per assicurarti che il conflitto sia stato risolto. Dopodiché, compila una build di rilascio e testa le modifiche per assicurarti che la base di codice funzioni come previsto.
Rimuovere le regole non necessarie
Utilizzando lo strumento di analisi della configurazione, puoi controllare sistematicamente la tua base di codice per identificare ed eliminare le regole di conservazione obsolete che ingombrano la configurazione. R8 Configuration Analyzer evidenzia in particolare due fonti principali di regole non necessarie:
- Regole inutilizzate: regole che corrispondono a zero classi, metodi o campi nella build corrente. Spesso persistono dopo il refactoring del codice, la rimozione delle dipendenze o da configurazioni copia-incolla non più pertinenti, aumentando la complessità della configurazione.
- Regole identiche: regole di conservazione identiche significa regole che hanno come target le stesse classi, gli stessi campi e gli stessi metodi o dichiarazioni duplicate di regole di conservazione nello stesso file di regole di conservazione o in file diversi.
Entrambi i tipi di regole aggiungono confusione alla configurazione, rendendo più difficile la manutenzione e il debug. Identificandoli, puoi ripulire la configurazione.