Устранение ошибок ANR в вашей игре Unity — это систематический процесс:

Интеграция служб отчетности
Такие сервисы отчётности, как Android Vitals , Firebase Crashlytics и Backtrace (сертифицированный партнёр Unity), обеспечивают масштабное ведение журнала ошибок и анализ ошибок в вашей игре. Интегрируйте SDK сервисов отчётности в свою игру на ранних этапах разработки. Проанализируйте, какой сервис отчётности лучше всего соответствует потребностям и бюджету вашей игры.
Разные сервисы отчётности используют разные способы сбора данных об ошибках ANR. Добавьте второй сервис отчётности, чтобы повысить вероятность получения достоверных данных для обоснования вашего решения об устранении ошибок ANR.
Интеграция пакетов SDK для создания отчетов не влияет на производительность игры или размер APK.
Анализировать символы
Проанализируйте отчёты вашей службы отчётности и убедитесь, что трассировки стека представлены в удобном для восприятия формате. Подробнее см. в статье «Сбои Android и ANR для игр Unity в Symbolicate» .

libil2cpp.so
.Как проверить идентификатор сборки символа
Если система отчётности показывает отсутствующий идентификатор сборки, но символы сборки всё ещё присутствуют в хранилище машины сборки, можно проверить идентификатор сборки символов и загрузить их в службу отчётности. В противном случае для загрузки файлов символов потребуется новая сборка.
В Windows или macOS:
- Перейдите в папку символов, соответствующую вашему скриптовому бэкэнду (см. Разрешение :)
- Используйте следующую команду (в Windows используйте Cygwin для запуска утилиты
readelf
) - Использование Grep необязательно для фильтрации текстового вывода.
- Найдите идентификатор сборки
- Используйте следующую команду (в Windows используйте Cygwin для запуска утилиты
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95
Проверить код игры
Если в трассировке стека отображается функция в библиотеке libil2cpp.so
, ошибка произошла в коде C#, который был преобразован в C++ . Библиотека libil2cpp.so
содержит не только код вашей игры, но также плагины и пакеты.
Имя файла C++ соответствует имени сборки, определённому в проекте Unity. В противном случае имя файла будет соответствовать имени по умолчанию Assembly-C#. Например, на рисунке 3 показана ошибка в файле Game.cpp
(выделена синим цветом), имя которого определено в файле определения сборки. Logger
— это имя класса (выделено красным) в скрипте C#, за которым следует имя функции (выделено зелёным). Наконец, следует полное имя, сгенерированное конвертером IL2CPP (выделено оранжевым цветом).

Проверьте код вашей игры, выполнив следующие действия:
- Проверьте проект C# на наличие подозрительного кода. Обычно необработанные исключения C# не приводят к ошибке ANR или сбою приложения. Тем не менее, убедитесь, что код корректно работает в различных ситуациях. Проверьте, использует ли код сторонний модуль движка, и проанализируйте, не появилась ли ошибка в недавнем выпуске. Кроме того, проверьте, обновляли ли вы Unity недавно или ошибка возникает только на определённых устройствах.
- Экспортируйте игру как проект Android Studio. Имея полный доступ к конвертированному исходному коду C# вашей игры, вы можете найти функцию, вызывающую ошибку ANR. Код C++ сильно отличается от кода C#, и проблемы с конвертацией кода возникают редко. Если вы что-то обнаружите, отправьте запрос в службу поддержки Unity.
- Проверьте исходный код игры и убедитесь, что вся логика, работающая в обратных вызовах OnApplicationFocus() и OnApplicationPause(), надлежащим образом очищена.
- Движок Unity имеет тайм-аут для приостановки выполнения; чрезмерная нагрузка на эти обратные вызовы может привести к ошибке ANR.
- Добавляйте журналы или навигационные цепочки к частям кода, чтобы улучшить анализ данных.
- Используйте Unity Profiler для анализа производительности игры. Профилирование приложения также может быть отличным способом выявления узких мест, которые могут вызывать ошибку ANR.
- Отличным способом выявления длительных операций ввода-вывода в основном потоке является использование строгого режима .
- Проанализируйте историю Android Vitals или другого сервиса отчётности и проверьте версии игры, в которых ошибка возникает чаще всего. Проверьте исходный код в истории системы контроля версий и сравните изменения кода между выпусками. Если вы обнаружите что-то подозрительное, протестируйте каждое изменение или потенциальное исправление по отдельности.
- Изучите историю сообщений об ошибках ANR в Google Play для устройств и версий Android, на которые приходится наибольшее количество ошибок ANR. Если устройства или версии устарели, скорее всего, вы можете спокойно игнорировать их, если это не повлияет на прибыльность игры. Внимательно изучите данные, поскольку определённая группа пользователей больше не сможет играть в вашу игру. Подробнее см. на панели управления дистрибуцией .
- Проверьте исходный код игры, чтобы убедиться, что вы не вызываете код, который может вызвать проблему. Например, метод finish может привести к деструктивным результатам при неправильном использовании. Подробнее о разработке для Android см. в руководствах для разработчиков Android.
- После просмотра данных и экспорта сборки игры в Android Studio вы имеете дело с кодом C и C++, и поэтому можете в полной мере воспользоваться инструментами, выходящими за рамки стандартных решений Unity, такими как Android Memory Profiler , Android CPU Profiler и perfetto .
Код движка Unity
Чтобы узнать, возникает ли ошибка ANR в движке Unity, проверьте наличие libUnity.so
или libMain.so
в трассировках стека. Если вы их обнаружите, выполните следующие действия:
- Сначала просмотрите каналы сообщества ( форумы Unity , обсуждения Unity , Stackoverflow ).
- Если вы ничего не нашли, сообщите об ошибке , чтобы решить проблему. Предоставьте символьную трассировку стека, чтобы инженеры движка могли лучше понять и устранить ошибку.
- Проверьте, внесены ли в последнюю версию Unity LTS улучшения, связанные с вашими проблемами. Если да, обновите игру до этой версии. (Это решение может быть доступно только некоторым разработчикам.)
- Если ваш код использует пользовательское
Activity
вместо действия по умолчанию, проверьте код Java, чтобы убедиться, что это действие не вызывает никаких проблем.
Сторонний SDK
- Проверьте, что все сторонние библиотеки обновлены и не имеют сообщений о сбоях или ошибках ANR для последней версии Android.
- Посетите форумы Unity, чтобы узнать, были ли какие-либо ошибки исправлены в более поздней версии или был ли предложен обходной путь Unity или участником сообщества.
- Ознакомьтесь с отчётом об ошибках ANR в Google Play и убедитесь, что эта ошибка ещё не обнаружена Google. Google знает о некоторых ошибках ANR и активно работает над их устранением.
Системная библиотека
Системные библиотеки обычно находятся далеко не под контролем разработчика, но на них приходится незначительная доля ошибок ANR. Устранить ошибки ANR системных библиотек сложно, за исключением обращения к разработчику библиотеки или добавления журналов для уточнения характера проблемы.
Причины выхода
ApplicationExitInfo
— это API Android для анализа причин ошибок ANR. Если ваша игра использует Unity 6 или более позднюю версию , вы можете вызывать ApplicationExitInfo
напрямую. Для более старых версий Unity необходимо реализовать собственный плагин для включения вызовов ApplicationExitInfo
из Unity.
Crashlytics также использует ApplicationExitInfo
; однако ваша собственная реализация обеспечивает более точный контроль и позволяет включать больше релевантной информации .