Risolvere i problemi di ottimizzazione

Poiché le ottimizzazioni di R8 aggiornano il codice dell'app, è importante testare a fondo il comportamento dell'app per assicurarsi che funzioni come previsto. In caso di comportamento imprevisto, utilizza questa pagina come guida per risolvere potenziali problemi dopo l'ottimizzazione.

Durante la risoluzione dei problemi, concentrati sulle seguenti situazioni:

  • Ottimizzazione eccessiva che causa arresti anomali dell'app: la tua app si arresta in modo anomalo perché R8 ha ottimizzato troppo codice.
  • Ottimizzazione poco chiara o insufficiente: R8 non ha ottimizzato la tua app come ti aspettavi o hai bisogno di ulteriori spiegazioni per le ottimizzazioni.

Arresti anomali dell'app

Se la tua app ha subito un arresto anomalo dopo l'ottimizzazione con R8, in genere il motivo è una reflection interrotta. Per identificare i riflessi rotti, utilizza le seguenti linee guida:

  • Osservi un'eccezione, il che di solito significa che la classe, il metodo o il campo indicati vengono utilizzati tramite reflection. Queste eccezioni sono in genere una delle seguenti: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • Visualizzi il codice che fa riferimento alla reflection con import kotlin.reflect.* o import java.lang.reflect.*.
  • Osserva l'utilizzo di un costruttore di classe come segue: Something::class.constructors.
  • Vedi Class.forName(...).

Soluzione: aggiungi una regola di conservazione.

Ottimizzazione non chiara o insufficiente

Poiché le regole vengono applicate dalla tua app, nonché dalle librerie incluse, potresti aver bisogno di ulteriori chiarimenti sulle regole applicate o di una spiegazione del motivo per cui R8 ha conservato determinate sezioni di codice che prevedevi venissero ottimizzate.

  • 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 sapere con certezza 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 all'indirizzo ./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 conservato: l'ottimizzazione di R8 potrebbe conservare codice che ti aspettavi venisse rimosso.

    Soluzione: utilizza l'opzione di configurazione -whyareyoukeeping per capire perché il codice è stato mantenuto. L'output contiene un percorso dal codice mantenuto a uno dei punti di accesso della tua app. Per ulteriori informazioni, vedi -whyareyoukeeping.

  • Difficoltà a comprendere lo stack trace originale: R8 modifica il codice in vari modi, facendo in modo che lo stack trace non faccia 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 lo stack trace originale. Per recuperare lo stack trace originale, utilizza lo strumento a riga di comando retrace, incluso nel pacchetto strumenti a riga di comando.

    Per utilizzare retrace, fornisci al comando il percorso di un file di mappatura e un file di stack trace. Il file di mapping, denominato mapping.txt, viene raggruppato automaticamente con l'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 degli arresti anomali. Quando utilizzi Play e Firebase Crashlytics, utilizza il file mapping.txt con gli arresti anomali che il servizio raccoglie dagli utenti dell'app. Il seguente comando mostra come eseguire retrace dalla radice del progetto:

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

Segnala bug

Se non riesci a risolvere un problema con R8, segnala un bug.