A solução de ANRs no seu jogo do Unity é um processo sistemático:
Integrar serviços de relatórios
Serviços de relatórios, como Android vitals, Firebase Crashlytics e Backtrace (um parceiro certificado do Unity) oferecem geração de registros e análise de erros em escala do jogo. Integre SDKs de serviços de relatórios ao seu jogo no início do ciclo de desenvolvimento. Analise 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 receber dados válidos para apoiar sua decisão na correção de ANRs.
A integração de SDKs de relatórios não afeta a performance do jogo nem o tamanho do APK.
Analisar símbolos
Analise os relatórios do serviço de relatórios e verifique se os stack traces estão em um formato legível. Consulte Simbolizar falhas do Android e o erro ANR para jogos Unity para mais informações.
Como verificar o ID de build do símbolo
Se o sistema de relatórios mostrar o ID de build ausente, mas os símbolos de build ainda existirem no armazenamento da máquina de build, será possível verificar o ID de build dos símbolos e fazer o upload deles para o serviço de relatórios. Caso contrário, um novo build será necessário para fazer upload dos arquivos de símbolo.
No Windows ou macOS:
- Navegue até a pasta de símbolos com base no back-end
de scripts (consulte a Solução:)
- Use o comando a seguir (no Windows, use o Cygwin para executar
o utilitário
readelf
). - O uso de grep é opcional para filtrar a saída de texto.
- Procurar o ID do build
- Use o comando a seguir (no Windows, use o Cygwin para executar
o utilitário
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 em C++.
A biblioteca libil2cpp.so
não tem apenas o código do jogo, mas também plug-ins e pacotes.
O nome do arquivo C++ segue o nome do 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
nome da classe (destacado em vermelho) no script C#, seguido pelo
nome da função (destacado em verde). Por fim, está o nome completo
gerado pelo conversor IL2CPP (destacado em laranja).
Inspecione o código do jogo fazendo o seguinte:
- Examine o projeto C# para detectar códigos suspeitos. Normalmente, as exceções não processadas em C# não causam um ANR ou uma falha do aplicativo. Mesmo assim, garanta que o código seja executado corretamente em diferentes situações. Confira se o código usa um módulo de mecanismo de terceiros e analise se uma versão recente introduziu o erro. Além disso, verifique se você atualizou o Unity recentemente ou se o erro só acontece em dispositivos específicos.
- Exporte o jogo como um projeto do Android Studio. Com acesso completo ao código-fonte C# convertido do jogo, você pode encontrar a função que está causando o ANR. O código C++ é muito diferente do código C#, e a conversão de código raramente apresenta um problema. Se você encontrar algo, abra um tíquete de suporte no Unity.
- Revise o código-fonte do jogo e verifique se toda a lógica executada nos
callbacks OnApplicationFocus() e OnApplicationPause()
é limpa adequadamente.
- O mecanismo do Unity tem um tempo limite para pausar a execução. Uma carga de trabalho excessiva nesses callbacks pode causar um ANR.
- Adicione registros ou rastros de navegação a partes do código para melhorar a análise de dados.
- Use o Unity Profiler para investigar o desempenho do jogo. Criar um perfil do app também pode ser uma ótima maneira de identificar gargalos que podem estar causando o ANR.
- Uma ótima maneira de identificar operações de E/S longas na linha de execução principal é usar o modo restrito.
- Analise o Android Vitals ou outro histórico de serviço de relatórios e verifique as versões de lançamento do jogo em que o erro está ocorrendo com mais frequência. Revise seu código-fonte no histórico de controle de versão e compare as mudanças de código entre as versões. Se você encontrar algo suspeito, teste cada alteração ou correção em potencial individualmente.
- Analise o histórico de relatórios de ANR do Google Play para saber quais dispositivos e versões do Android receberam mais ANRs. Se os dispositivos ou versões estiverem desatualizados, é provável que você possa ignorá-los com segurança se isso não afetar a lucratividade do jogo. Estude os dados com cuidado, já que um grupo específico de usuários não poderá mais jogar seu jogo. Para mais informações, consulte o painel de distribuição.
- Revise o código-fonte do jogo para garantir que você não esteja chamando nenhum código que possa causar um problema. Por exemplo, finish pode ser destrutivo se não for usado corretamente. Consulte os guias para desenvolvedores Android para saber mais sobre o desenvolvimento para Android.
- Depois de analisar os dados e exportar o build do jogo para o Android Studio, você vai lidar com códigos C e C++, então poderá aproveitar ao máximo as ferramentas além das soluções padrão do Unity, como o Android Memory Profiler, o Android CPU Profiler e o perfetto.
Código do mecanismo do Unity
Para saber se um ANR está acontecendo no mecanismo do Unity, procure
libUnity.so
ou libMain.so
nos rastros de pilha. Se você encontrar, siga estas
etapas:
- Primeiro, pesquise nos canais da comunidade (Unity Forums, Unity Discussions, Stackoverflow).
- Se você não encontrar nada, informe um bug para resolver o problema. Forneça um stack trace simbólico para que os engenheiros do mecanismo possam entender e resolver melhor o erro.
- Verifique se a versão mais recente do Unity LTS trouxe melhorias relacionadas aos seus problemas. Se for o caso, faça upgrade para usar essa versão. Essa solução pode ser possível apenas para alguns desenvolvedores.
- Se o código usar 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 têm relatórios de falhas ou ANRs para a versão mais recente do Android.
- Acesse os fóruns do Unity para saber se algum erro já foi resolvido em uma versão mais recente ou se uma solução alternativa foi fornecida pelo Unity ou por um membro da comunidade.
- Analise o relatório de ANR do Google Play e verifique se o erro já foi identificado pelo Google. O Google está ciente de alguns ANRs e trabalha ativamente para corrigi-los.
Biblioteca do sistema
As bibliotecas do sistema geralmente estão longe do controle do desenvolvedor, mas não representam uma porcentagem significativa de ANRs. Além de entrar em contato com o desenvolvedor da biblioteca ou adicionar registros para restringir o problema, os ANRs de biblioteca do sistema são difíceis de resolver.
Motivos de saída
ApplicationExitInfo
é uma API do Android para entender as causas de ANRs.
Se o jogo estiver usando o Unity 6 ou mais recente, você poderá chamar ApplicationExitInfo
diretamente. Para versões mais antigas do Unity, é necessário implementar seu próprio plug-in
para ativar as chamadas ApplicationExitInfo
do Unity.
O Crashlytics também usa ApplicationExitInfo
. No entanto, sua própria
implementação oferece um controle mais refinado e permite incluir
informações mais relevantes.