Habilidades do Android
Conferir no GitHubAnalisador de configuração do R8
android skills add --skill r8-analyzerAnalyze the R8 configurationO analisador de configuração do R8 é uma ferramenta projetada para ajudar você a maximizar os benefícios de desempenho do R8, fornecendo insights detalhados sobre a qualidade da configuração do seu app. Ele permite rastrear e melhorar a otimização do R8 monitorando as principais métricas, especificamente as pontuações de redução, otimização e ofuscação, que indicam a porcentagem da sua base de código disponível para otimização. Ao identificar regras keep amplas ou desnecessárias, incluindo aquelas introduzidas por bibliotecas de terceiros, o analisador ajuda você a refinar sua configuração para garantir que o R8 possa otimizar o maior número possível de classes, campos e métodos.
Gerar o relatório
Com o AGP 9.3.0 e versões mais recentes, é possível gerar o relatório do analisador de configuração do R8 usando uma tarefa independente dedicada do Gradle ou automaticamente durante um build do R8.
Executar a tarefa independente do Gradle (recomendada para uso local)
Ao iterar ativamente nas regras keep, use a tarefa independente do Gradle para avaliar rapidamente o impacto das mudanças sem criar o APK ou o pacote completo:
./gradlew :app:analyzeReleaseR8Config
Como essa tarefa ignora a geração de APK ou pacote, ela oferece um loop de feedback muito mais curto. Isso permite que você analise rapidamente como as regras keep afetam as pontuações de redução, otimização e ofuscação e as refine imediatamente. O relatório HTML é gerado em app/build/reports/r8/r8-config-analyzer-release.html.
Gerar automaticamente durante builds normais
Ao executar um build de lançamento completo do R8 (como assembleRelease), o relatório é gerado automaticamente em build/outputs/mapping/release/configanalyzer.html.
Para desativar a geração automática das saídas durante builds normais, defina a seguinte propriedade do Gradle:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Para o AGP 9.2 e versões anteriores
Para o AGP 9.2 e versões anteriores, defina a
com.android.tools.r8.dumpkeepradiushtmltodirectory propriedade do sistema ao
executar uma tarefa do Gradle com um build ativado com o R8.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
Por exemplo, use o comando a seguir para gerar o relatório HTML no diretório /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
Entender o relatório
O analisador de configuração do R8 fornece insights sobre a configuração do R8 do seu app e o impacto de cada regra keep no app. Isso ajuda você a alcançar a otimização máxima do R8, melhorando o desempenho do app. Use as pontuações a seguir para entender quanto da sua base de código está disponível para otimização pelo R8.
Pontuação de redução
Quando o R8 reduz o app, ele diminui o tamanho geral do app identificando e eliminando códigos e recursos não utilizados, garantindo que o build final seja o mais enxuto possível. A pontuação de redução acompanha a porcentagem de classes, campos e métodos sujeitos à redução. Por exemplo, uma pontuação de redução de 66% significa que o R8 pode realizar a redução em 66% da sua base de código.
Pontuação de otimização
O R8 realiza otimizações, como a incorporação de métodos e a mesclagem de classes, o que resulta em melhorias de inicialização e memória para o app. A pontuação de otimização acompanha a porcentagem de classes, campos e métodos sujeitos a otimizações do R8. Por exemplo, se a pontuação de otimização for de 66%, isso significa que o R8 só poderá realizar a otimização em 66% da sua base de código.
Pontuação de ofuscação
Ao ofuscar classes, campos e métodos em nomes mais curtos, o R8 reduz a pegada de metadados do app para economizar memória. A pontuação de ofuscação mede a porcentagem de código disponível para ofuscação na sua base de código.
Refinar regras keep
Para melhorar as pontuações e desbloquear uma melhor otimização do R8, refine as regras keep para que elas não impeçam desnecessariamente o R8 de otimizar seu app. Mantenha apenas as classes, os métodos ou os campos acessados usando reflexão.
Para fazer isso, use a análise de regras keep.
Para conferir a análise detalhada de uma regra, clique nela para abrir a tela de detalhes.
Como refinar regras keep
Para refinar as regras keep e desbloquear todo o potencial das otimizações do R8 para seu app, faça o seguinte:
- Para cada regra keep, confira a porcentagem de classes, campos e métodos que não podem ser otimizados pelo R8 no analisador de configuração. Use isso para identificar as regras keep que impedem a otimização em um grande número de classes, campos ou métodos. As propriedades de otimização impedidas por cada regra keep também são listadas.
- Se você encontrar uma regra keep que esteja impedindo a otimização de um grande número de classes, verifique quais classes, campos e métodos estão impedidos de otimização pela regra keep para conferir se essa regra está mantendo itens que não são invocados dinamicamente usando reflexão.
- Reduza a otimização bloqueada pelas regras keep segmentando apenas as classes, os campos ou os métodos necessários, escolhendo a opção keep certa e seguindo as práticas recomendadas.
- Investigue e execute testes que cubram as classes, os campos e os métodos afetados da regra keep e refine as regras keep.
Inspecionar a otimização de bibliotecas
Ao integrar bibliotecas de terceiros, elas geralmente incluem as próprias regras keep do consumidor para trabalhar com o R8. Como o autor da biblioteca não pode prever sua implementação específica, às vezes ele escreve regras conservadoras e abrangentes que impedem a otimização em mais classes, campos e métodos do que o necessário. Isso pode impedir que o R8 otimize partes do seu app que não têm nada a ver com a execução real da biblioteca. É possível usar o analisador de configuração do R8 para identificar bibliotecas que introduzem regras que afetam negativamente a otimização do seu app.
Use o analisador de configuração para inspecionar o efeito combinado de todas as regras keep do consumidor mescladas. Ao analisar o impacto de cada regra keep de uma biblioteca de terceiros, é possível identificar e rastrear as bibliotecas de terceiros específicas que impedem uma grande quantidade de otimização no seu app.
Como otimizar bibliotecas
Para resolver as regras keep introduzidas por bibliotecas de terceiros, faça o seguinte:
- Se uma biblioteca incluir uma regra muito ampla, recomendamos entrar em contato com o responsável pela manutenção da biblioteca com os dados do relatório para demonstrar como as regras atuais afetam as pontuações de otimização do seu app. Se for uma biblioteca externa, procure bugs existentes na biblioteca antes de registrar problemas.
- Se necessário, teste possíveis melhorias filtrando regras de uma biblioteca específica. É possível importar as regras da biblioteca para o projeto, excluir as regras amplas e executar novamente o analisador de configuração para medir os possíveis ganhos de tamanho e performance.
Regras subsumidas
Pode haver casos em que várias regras keep se sobrepõem e uma das regras pode estar impedindo mais otimização do que o necessário. Se houver duas regras keep na sua base de código.
# 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
A primeira regra keep, que impede a otimização em todo o pacote, está subsumindo a segunda regra keep, que segmenta uma classe dentro do pacote mantido pela primeira regra keep. Quando as regras keep se sobrepõem, uma pode bloquear mais otimizações do que o necessário. Ao refinar essas regras sobrepostas, é possível maximizar a otimização do R8 e eliminar a dívida técnica. Esse processo envolve a simplificação da configuração para garantir que apenas o código essencial seja mantido, ao mesmo tempo em que desbloqueia todo o potencial dos recursos de otimização do R8.
Otimizar regras subsumidas
- Encontre as regras keep subsumidas usando o analisador de configuração do R8.
- Identifique as classes, os campos ou os métodos exatos na sua base de código que realmente dependem da reflexão, que precisam ser mantidos usando regras keep. Saber disso vai ajudar você a refinar as regras keep.
- Usando o analisador de configuração, compare o impacto de cada regra que segmenta as mesmas classes, campos ou métodos. É possível usar a porcentagem de otimização impedida por cada regra keep para identificar qual é mais ampla e qual é uma regra keep restrita.
- Se a regra restrita for escrita com precisão, mantendo apenas os membros ou classes exatos que são acessados de forma reflexiva, remova a regra keep mais ampla. Isso desbloqueia com segurança as otimizações do R8 para o restante do pacote.
- Se a regra ampla estiver segmentando as classes certas, mantenha a regra ampla e exclua a regra restrita. A regra restrita é apenas uma desordem redundante. Refine a regra ampla para segmentar apenas as classes, os campos ou os métodos identificados.
Verificar e testar as mudanças: execute novamente o analisador de configuração para garantir que o conflito seja corrigido. Em seguida, compile um build de lançamento e teste as mudanças para garantir que a base de código funcione conforme o esperado.
Remover regras desnecessárias
Usando o analisador de configuração, é possível auditar sistematicamente sua base de código para identificar e remover regras keep obsoletas que poluem sua configuração. O analisador de configuração do R8 destaca especificamente duas fontes principais de regras desnecessárias:
- Regras não usadas: regras que correspondem a zero classes, métodos ou campos no seu build atual. Elas geralmente persistem após a refatoração do código, a remoção de dependências ou de configurações de copiar e colar que não são mais relevantes, adicionando complexidade de configuração desnecessária.
- Regras idênticas: regras keep idênticas significam regras que segmentam as mesmas classes, campos e métodos ou declarações duplicadas de regras keep no mesmo arquivo de regras keep ou em arquivos diferentes.
Os dois tipos de regras adicionam desordem à configuração, dificultando a manutenção e a depuração. Ao identificá-las, é possível limpar a configuração.