Depurar ANRs

A solução de ANRs no seu jogo do Unity é um processo sistemático:

Figura 1. Etapas para resolver ANRs em jogos do Unity.

Integrar serviços de relatórios

Serviços de relatórios, como Android vitals e Firebase Crashlytics e Backtrace (uma plataforma certificada parceiro) oferecem geração de registros e análises de erros para seu jogo em grande escala. Integrar relatar os SDKs de serviços no seu jogo no início do ciclo de desenvolvimento. Análise qual serviço de relatórios é mais adequado às necessidades e ao orçamento do seu jogo.

Diferentes serviços de relatórios têm diferentes maneiras de capturar ANRs. Inclua um segundo serviço de relatórios para aumentar a chance de obter dados válidos para embasar sua decisão de corrigir ANRs.

A integração de SDKs de relatórios não afeta o desempenho do jogo nem o tamanho do APK.

Analisar símbolos

Analisar os relatórios do seu serviço de relatórios e verificar se os stack traces estão em um formato legível. Consulte Simbolizar o Android falhas e o ANR para jogos do Unity para mais informações.

Figura 2. Crashlytics mostrando o ID do build e libil2cpp.so símbolos ausentes.

Como verificar o ID da versão do símbolo

Se o sistema de relatórios mostrar o ID do build ausente, mas os símbolos do build ainda existem no armazenamento da máquina de build, é possível verificar o ID do build do e fazer o upload deles no serviço de relatórios. Caso contrário, um novo build será necessárias para carregar os arquivos de símbolo.

No Windows ou macOS:

  1. Navegue até a pasta de símbolos com base no seu scripting back-end (consulte Resolução:)
    1. Use o seguinte comando (no Windows, use Cygwin para executar o utilitário readelf)
    2. O uso de Grep é opcional para filtrar a saída de texto
    3. Procure o ID do build
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Inspecionar o código do jogo

Quando o stack trace mostra uma função na biblioteca libil2cpp.so, O erro ocorreu no código C#, que é convertido para C++. A biblioteca libil2cpp.so não tem apenas o código do seu jogo, mas também plug-ins e pacotes.

O nome de arquivo C++ segue o nome assembly definido no projeto do Unity. Caso contrário, o nome do arquivo terá o nome padrão do Assembly-C#. Por exemplo: a figura 3 mostra o erro no arquivo Game.cpp (destacado em azul), que é o nome definido no arquivo de definição de Assembly. Logger é o da classe (destacado em vermelho) no script C#, seguido por nome da função (destacado em verde). Por fim, temos o nome completo gerado pelo conversor IL2CPP (destacado em laranja).

Figura 3. Teste a pilha de chamadas do projeto no Backtrace.

Para inspecionar o código do jogo, faça o seguinte:

  • Examine o projeto C# em busca de códigos suspeitos. Normalmente, C# não são processados exceções não causam um ANR ou uma falha no aplicativo. Mesmo assim, garanta que o código seja executado corretamente em diferentes situações. Verifique se o código usa um módulo de mecanismo de terceiros e analisa se uma versão recente introduziu o erro. Além disso, verifique se você atualizou recentemente Unity ou se o erro acontece apenas em dispositivos específicos.
  • Exporte o jogo como um projeto do Android Studio. Com acesso ao código-fonte C# convertido do jogo, poderá encontrar a função que está causando o ANR. O código C++ é muito diferente do seu código C#, e a conversão do código raramente tem um problema. Se você encontrar algo, registre uma tíquete de suporte para o Unity.
  • Revise o código-fonte do jogo e verifique se toda a lógica em execução no OnApplicationFocus() e OnApplicationPause() os callbacks são limpos adequadamente.
    • o mecanismo do Unity tem um tempo limite para pausar a execução; carga de trabalho excessiva nesses callbacks pode causar um ANR.
    • Adicione registros ou navegação estrutural a partes do código para aprimorar a análise de dados.
  • Use o Unity Profiler para investigar desempenho. A criação de perfil também pode ser uma ótima maneira de ajudar a identificar e gargalos que possam estar causando o ANR.
  • Uma ótima maneira de identificar operações longas de E/S na linha de execução principal é usar modo estrito.
  • Analise o histórico do Android vitals ou de outro serviço de relatórios e verifique versões de lançamento do jogo em que o erro mais ocorre. Análise seu código-fonte no histórico de controle de versões e comparar as alterações entre as versões. Se você encontrar algo suspeito, experimente cada mudança ou correção em potencial individualmente.
  • Analisar o histórico de relatórios de ANR do Google Play nos dispositivos e no Android versões que recebem mais ANRs. Se os dispositivos ou as versões estiverem desatualizados, Se isso não afetar a experiência do jogo, da lucratividade. Estude os dados cuidadosamente, pois um determinado grupo de usuários não poderá mais jogar. Para mais informações, consulte Distribuição painel de controle.
  • Revise o código-fonte do jogo para garantir que você não está chamando um código que pode causar um problema, por exemplo, finish pode pode ser destrutivo se não for usado corretamente. Consulte os guias do desenvolvedor Android. para saber mais sobre o desenvolvimento para Android.
  • Depois de analisar os dados e exportar o build do jogo para o Android Studio, trabalhar com código C e C++ e aproveitar ao máximo as ferramentas além das soluções padrão do Unity, Android Memory Profiler, Android CPU Profiler e Perfeito.
.

Código do mecanismo do Unity

Para saber se um ANR está acontecendo no lado do mecanismo do Unity, verifique se libUnity.so ou libMain.so nos stack traces. Se você os encontrar, etapas a seguir:

  • Primeiro, pesquise os canais da comunidade (Unity Forums, Unity Discussões, Stack Overflow.
  • Se você não encontrar nada, registre um bug para resolver o problema. Fornecer um stack trace simbolizado para que os engenheiros do mecanismo possam entender e resolver melhor o erro.
  • Verifique se a versão mais recente do Unity O LTS fez melhorias relacionadas aos problemas. Em caso afirmativo, faça o upgrade para usar essa versão. Essa solução só é possível para alguns desenvolvedores.
  • Caso seu código use um Activity personalizado em vez do padrão, revise o Código Java para garantir que a atividade não esteja causando problemas.

SDK de terceiros

  • Verifique se todas as bibliotecas de terceiros estão atualizadas e não há relatórios de ou ANRs para a versão mais recente do Android.
  • Acesse os Fóruns do Unity para ver se já houve algum erro. resolvido em uma versão posterior ou se uma solução alternativa tiver sido fornecida pelo do Unity ou de um membro da comunidade.
  • Analise o Relatório de ANR do Google Play e verifique se o erro foi ainda não tenha sido identificado pelo Google. O Google está ciente de alguns ANRs e trabalhando ativamente para corrigi-los.

Biblioteca do sistema

Em geral, as bibliotecas do sistema estão longe do controle do desenvolvedor, mas não representam uma porcentagem significativa de ANRs. Além de entrar em contato com a biblioteca ou adicionar registros para resolver o problema, os ANRs da biblioteca do sistema difíceis de resolver.

Motivos de saída

A ApplicationExitInfo é uma API do Android para entender as causas de ANR. Se o jogo usar o Unity 6 ou mais recente, chame ApplicationExitInfo. diretamente. Para versões mais antigas do Unity, é necessário implementar seu próprio plug-in. para ativar chamadas ApplicationExitInfo do Unity.

O Crashlytics também usa ApplicationExitInfo. No entanto, a sua própria oferece um controle mais refinado e permite que você inclua informações mais relevantes.