Resolver errores de ANR en tu juego de Unity es un proceso sistemático:
Integra servicios de informes
Los servicios de informes, como Android vitals, Firebase Crashlytics y Backtrace (un socio certificado de Unity partner), proporcionan registro y análisis de errores para tu juego a gran escala. Integra los SDKs de los servicios de informes en tu juego al comienzo del ciclo de desarrollo. Analiza qué servicio de informes se adapta mejor a las necesidades y el presupuesto de tu juego.
Los diferentes servicios de informes tienen diferentes formas de capturar errores de ANR. Incluye un segundo servicio de informes para aumentar la probabilidad de obtener datos válidos que respalden tu decisión de corregir los errores de ANR.
La integración de los SDKs de informes no afecta el rendimiento del juego ni el tamaño del APK.
Analiza los símbolos
Analiza los informes de tu servicio de informes y verifica si los seguimientos de pila están en formato legible. Consulta Simboliza las fallas de Android y ANR para los juegos de Unity para obtener más información.
libil2cpp.so faltantes.Cómo verificar el ID de compilación de símbolos
Si el sistema de informes muestra el ID de compilación faltante, pero los símbolos de compilación aún existen en el almacenamiento de la máquina de compilación, es posible verificar el ID de compilación de los símbolos y, luego, subirlos al servicio de informes. De lo contrario, se requiere una compilación nueva para subir los archivos de símbolos.
En Windows o macOS, haz lo siguiente:
- Navega a la carpeta de símbolos según tu backend
de secuencias de comandos (consulta Resolución).
- Usa el siguiente comando (en Windows, usa Cygwin para ejecutar
la
readelfutilidad). - El uso de grep es opcional para filtrar el resultado de texto.
- Busca el ID de compilación.
- Usa el siguiente comando (en Windows, usa Cygwin para ejecutar
la
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95
Inspecciona el código del juego
Cuando el seguimiento de pila muestra una función en la biblioteca libil2cpp.so,
el error ocurrió en el código C#, que se convierte a C++.
La biblioteca libil2cpp.so no solo tiene el código del juego, sino también complementos y paquetes.
El nombre de archivo C++ sigue el nombre del ensamblaje definido en el proyecto de Unity.
De lo contrario, el nombre de archivo tiene el nombre predeterminado Assembly-C#. Por ejemplo, la figura 3 muestra el error en el archivo Game.cpp (destacado en azul), que es el nombre definido en el archivo de definición de ensamblaje. Logger es el nombre de la clase (destacado en rojo) en la secuencia de comandos C#, seguido del nombre de la función (destacado en verde). Por último, es el nombre completo que generó el convertidor IL2CPP (destacado en naranja).
Para inspeccionar el código del juego, haz lo siguiente:
- Examina el proyecto C# en busca de código sospechoso. Por lo general, las excepciones no controladas de C# no causan un error de ANR ni una falla de la aplicación. Aun así, asegúrate de que el código se ejecute correctamente en diferentes situaciones. Verifica si el código usa un módulo de motor de terceros y analiza si una versión reciente introdujo el error. Además, revisa si actualizaste Unity recientemente o si el error solo ocurre en dispositivos específicos.
- Exporta el juego como un proyecto de Android Studio. Con acceso completo al código fuente C# convertido de tu juego, puedes encontrar la función que causa el error de ANR. El código C++ se ve muy diferente del código C#, y la conversión de código rara vez tiene un problema. Si encuentras algo, envía un ticket de asistencia a Unity.
- Revisa el código fuente del juego y asegúrate de que se limpie correctamente cualquier lógica que se ejecute en las devoluciones de llamada
OnApplicationFocus() y OnApplicationPause().
- El motor de Unity tiene un tiempo de espera para pausar su ejecución; una carga de trabajo excesiva en estas devoluciones de llamada puede causar un error de ANR.
- Agrega registros o rutas de navegación a partes del código para mejorar el análisis de datos.
- Usa el Generador de perfiles de Unity para investigar el rendimiento del juego. Generar perfiles de tu app también puede ser una excelente manera de identificar cuellos de botella que podrían causar el error de ANR.
- Una excelente manera de identificar operaciones de E/S largas en el subproceso principal es usar el modo estricto.
- Analiza el historial de Android Vitals o de otro servicio de informes y verifica las versiones de lanzamiento del juego para las que el error ocurre con mayor frecuencia. Revisa tu código fuente en el historial de control de versiones y compara los cambios de código entre las versiones. Si encuentras algo sospechoso, experimenta con cada cambio o posible corrección de forma individual.
- Examina el historial de informes de ANR de Google Play para los dispositivos y las versiones de Android que reciben la mayor cantidad de errores de ANR. Si los dispositivos o las versiones están desactualizados, es probable que puedas ignorarlos de forma segura si hacerlo no afecta la rentabilidad del juego. Estudia los datos con atención, ya que un grupo particular de usuarios ya no podrá jugar tu juego. Para obtener más información, consulta el panel de distribución.
- Revisa el código fuente del juego para asegurarte de no llamar a ningún código que pueda causar un problema. Por ejemplo, finish puede ser destructivo si no se usa correctamente. Consulta las guías para desarrolladores de Android para obtener más información sobre el desarrollo de Android.
- Después de revisar los datos y exportar la compilación del juego a Android Studio, trabajas con código C y C++, por lo que puedes aprovechar al máximo las herramientas más allá de las soluciones estándar de Unity, como el Generador de perfiles de memoria de Android, el Generador de perfiles de CPU de Android y Perfetto.
Código del motor de Unity
Para saber si se produce un error de ANR en el motor de Unity, busca libUnity.so o libMain.so en los seguimientos de pila. Si los encuentras, sigue estos pasos:
- Primero, busca en los canales de la comunidad (foros de Unity, debates de Unity, Stackoverflow).
- Si no encuentras nada, informa un error para resolver el problema. Proporciona un seguimiento de pila simbolizado para que los ingenieros del motor puedan comprender y resolver mejor el error.
- Verifica si la versión Unity LTS más reciente realizó mejoras relacionadas con tus problemas. Si es así, actualiza tu juego para usar esa versión. (Es posible que esta solución solo esté disponible para algunos desarrolladores).
- Si tu código usa una
Activitypersonalizada en lugar de la predeterminada, revisa el código Java para asegurarte de que la actividad no cause ningún problema.
SDK de terceros
- Verifica que todas las bibliotecas de terceros estén actualizadas y no tengan informes de fallas o errores de ANR para la versión más reciente de Android.
- Ve a los foros de Unity para ver si ya se resolvió algún error en una versión posterior o si Unity o un miembro de la comunidad proporcionaron una solución alternativa.
- Revisa el informe de ANR de Google Play y asegúrate de que Google aún no haya identificado el error. Google está al tanto de algunos errores de ANR y está trabajando activamente para corregirlos.
Biblioteca del sistema
Por lo general, las bibliotecas del sistema están lejos del control del desarrollador, pero no representan un porcentaje significativo de errores de ANR. Más allá de comunicarte con el desarrollador de la biblioteca o agregar registros para acotar el problema, los errores de ANR de la biblioteca del sistema son difíciles de resolver.
Motivos de salida
ApplicationExitInfo es una API de Android para comprender las causas de los errores de ANR.
Si tu juego usa Unity 6 o una versión posterior, puedes llamar a ApplicationExitInfo
directamente. En el caso de las versiones anteriores de Unity, debes implementar tu propio complemento para habilitar las llamadas ApplicationExitInfo desde Unity.
Crashlytics también usa ApplicationExitInfo; sin embargo, tu propia
implementación te brinda un control más preciso y te permite incluir
información más relevante.