Poiché gli aggiornamenti delle ottimizzazioni di R8 modificano il codice dell'app, è importante testare attentamente il comportamento dell'app per assicurarsi che funzioni come previsto. In caso di comportamenti imprevisti, utilizza questa pagina come guida per risolvere i potenziali problemi dopo l'ottimizzazione. Per saperne di più sulle regole che puoi utilizzare per risolvere i problemi di ottimizzazione, consulta Utilizzare le regole per risolvere i problemi di ottimizzazione.
Durante la risoluzione dei problemi, concentrati sulle seguenti situazioni:
- Ottimizzazione eccessiva che causa arresti anomali dell'app: l'app si arresta in modo anomalo perché R8 ha ottimizzato troppo codice.
- Ottimizzazione poco chiara o insufficiente: R8 non ha ottimizzato l'app come previsto o hai bisogno di ulteriori spiegazioni per le ottimizzazioni.
Arresti anomali dell'app
Se l'app si è arrestata in modo anomalo dopo l'ottimizzazione con R8, in genere è dovuto a una reflection interrotta. Per identificare la reflection interrotta, utilizza le seguenti linee guida:
- Osservi un'eccezione che indica che la classe, il metodo o il campo indicato viene utilizzato tramite reflection. Queste eccezioni sono in genere una delle seguenti:
ClassNotFoundException,NoSuchMethodException,NoSuchFieldException,NoClassDefFoundError,NoSuchMethodError,NoSuchFieldError. - Vedi codice che fa riferimento alla reflection con
import kotlin.reflect.*oimport java.lang.reflect.*. - Osservi un costruttore di classe utilizzato come segue:
Something::class.constructors. - Vedi
Class.forName(...).
Soluzione: aggiungi una regola keep.
Se il codice esegue la reflection, puoi annotarlo con le annotazioni Jetpack Keep anziché aggiungere una regola keep. I controlli lint di Jetpack Keep segnalano anche altre chiamate reflective non annotate, il che ti aiuta a prevenire arresti anomali simili.
Ottimizzazione poco chiara o insufficiente
Poiché le regole vengono applicate sia dall'app sia dalle librerie incluse, potresti aver bisogno di maggiore chiarezza sulle regole applicate o di una spiegazione del motivo per cui R8 ha conservato determinate sezioni di codice che prevedevi di ottimizzare.
Ambiguità sulle regole applicate: poiché le regole delle librerie incluse si applicano anche alla tua app e le opzioni globali di queste librerie si propagano anche alla tua app, potresti non essere sicuro di quali regole vengono applicate.
Soluzione: controlla quali regole vengono applicate visualizzando il report di tutte le regole che R8 applica durante la creazione del progetto. Puoi trovare questo report in
./app/build/outputs/mapping/configuration.txt. Questo report contiene tutte le regole unite di ogni libreria e modulo utilizzati per configurare R8 e può essere utilizzato per identificare le regole inefficienti.Troppo codice mantenuto: l'ottimizzazione di R8 potrebbe conservare il codice che prevedevi di rimuovere.
Soluzione: utilizza l'opzione di configurazione
-whyareyoukeepingper capire perché il codice è stato mantenuto. L'output contiene un percorso dal codice mantenuto a uno dei punti di accesso dell'app. Per saperne di più, consulta-whyareyoukeeping.Difficoltà a comprendere l'analisi dello stack originale: R8 modifica il codice in vari modi, quindi l'analisi dello stack non fa più riferimento al codice originale. Ad esempio, i numeri di riga e i nomi di classi e metodi possono cambiare.
Soluzione: a partire da Android Studio Otter 3 Feature Drop e AGP 9.0, Logcat deoffusca automaticamente le analisi dello stack. Tuttavia, se utilizzi una versione precedente di Android Studio, devi recuperare manualmente l'analisi dello stack originale. Per recuperare l'analisi dello stack originale, utilizza lo
retracestrumento a riga di comando, incluso nel pacchetto degli strumenti a riga di comando.Per utilizzare
retrace, fornisci al comando il percorso di un file di mapping e di un file di analisi dello stack. Il file di mapping, denominatomapping.txt, viene incluso automaticamente nell'Android App Bundle (AAB). Per maggiori dettagli, consulta la documentazione di retrace e l'articolo del Centro assistenza Play Console su come deoffuscare le analisi dello stack in caso di arresto anomalo. Quando utilizzi Play e Firebase Crashlytics, utilizza il filemapping.txtcon gli arresti anomali che il servizio raccoglie dagli utenti dell'app. Il seguente comando mostra come eseguireretracedalla radice del progetto:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
Segnalazione di bug
Se non riesci a risolvere un problema con R8, segnala un bug.