Corrigir problemas de otimização

Como as otimizações do R8 atualizam o código do app, é importante testar o comportamento dele para garantir que ele esteja funcionando como esperado. Em caso de comportamento inesperado, use esta página como guia para resolver problemas potenciais após a otimização. Para mais informações sobre as regras que podem ser usadas para resolver problemas de otimização, consulte Usar regras para resolver problemas de otimização.

Ao resolver problemas, concentre-se nas seguintes situações:

  • Otimização excessiva que leva a falhas no app: o app falha porque o R8 otimizou muito código.
  • Otimização pouco clara ou insuficiente: o R8 não otimizou o app tanto quanto você esperava ou você precisa de mais explicações sobre as otimizações.

Falhas no app

Se o app falhou após a otimização com o R8, isso geralmente ocorre devido à reflexão quebrada. Para identificar a reflexão quebrada, siga estas diretrizes:

  • Você observa uma exceção que significa que a classe, o método ou o campo indicado está sendo usado por reflexão. Essas exceções geralmente são uma das seguintes: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • Você vê um código que faz referência à reflexão com import kotlin.reflect.* ou import java.lang.reflect.*.
  • Você observa um construtor de classe sendo usado da seguinte maneira: Something::class.constructors.
  • Você vê Class.forName(...).

Solução: adicione uma regra keep.

Se o próprio código realizar a reflexão, você poderá anotar esse código com as anotações Jetpack Keep em vez de adicionar uma regra keep. As verificações de lint do Jetpack Keep também sinalizam outras chamadas reflexivas que não são anotadas, o que ajuda a evitar falhas semelhantes.

Otimização pouco clara ou insuficiente

Como as regras são aplicadas do app e das bibliotecas incluídas, talvez seja necessário mais clareza sobre as regras aplicadas ou uma explicação de por que o R8 manteve determinadas seções de código que você esperava que fossem otimizadas.

  • Ambiguidade sobre as regras aplicadas: como as regras das bibliotecas incluídas também se aplicam ao app e as opções globais dessas bibliotecas também são propagadas para o app, talvez você não saiba quais regras são aplicadas.

    Solução: confira quais regras são aplicadas visualizando o relatório de todas as regras que o R8 aplica ao criar o projeto. Esse relatório pode ser encontrado em ./app/build/outputs/mapping/configuration.txt. Ele contém todas as regras mescladas de cada biblioteca e módulo usado para configurar o R8 e pode ser usado para identificar regras ineficientes.

  • Muitos códigos sendo mantidos: a otimização do R8 pode reter códigos que você esperava que fossem removidos.

    Solução: use a opção de configuração -whyareyoukeeping para entender por que o código foi mantido. A saída contém um caminho do código mantido para um dos pontos de entrada do app. Para mais informações, consulte -whyareyoukeeping.

  • Dificuldade em entender o stack trace original: o R8 muda o código de várias maneiras, fazendo com que o stack trace não se refira mais ao código original. Por exemplo, os números de linha e os nomes de classes e métodos podem mudar.

    Solução: a partir da atualização de recursos do Android Studio Otter 3 e do AGP 9.0, o Logcat desofusca automaticamente os stack traces. No entanto, se você estiver usando uma versão anterior do Android Studio, será necessário recuperar manualmente o stack trace original. Para recuperar o stack trace original, use a retrace ferramenta de linha de comando, que faz parte do pacote de ferramentas de linha de comando.

    Para usar retrace, forneça o comando com o caminho para um arquivo de mapeamento e um arquivo de stack trace. O arquivo de mapeamento, chamado mapping.txt, é agrupado automaticamente com o Android App Bundle (AAB). Para mais detalhes, consulte a documentação do retrace e o artigo da Central de Ajuda do Play Console sobre como desofuscar stack traces de falhas. Ao usar o Play e o Firebase Crashlytics, use o arquivo mapping.txt com as falhas que o serviço coleta dos usuários do app. O comando a seguir mostra como executar retrace na raiz do projeto:

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

Informar bugs

Se você não conseguir resolver um problema com o R8, registre um bug.