Как отлаживать приложение Android на основе тегов ANR на панели управления Crashlytics

Ошибки ANR ("Приложение не отвечает") возникают, когда поток UI приложения не отвечает более 5 секунд. Подробную информацию об ошибках ANR и их диагностике можно найти в документации Android.

Кроме того, Crashlytics может помочь выявить конкретные проблемные цепочки. Мы анализируем ошибки ANR и на панели DevOps и вовлеченность > Crashlytics помечаем тегами соответствующие потоки, чтобы дать подсказки по отладке.

В следующих разделах этой страницы объясняется, что означает каждый тег ANR, приводится пример ANR с этим тегом и предлагается рекомендуемое решение для отладки ANR.

Triggered ANR

Поток, который был заблокирован слишком долго и вызвал ошибку ANR, помечается тегом Triggered ANR.

Проблемным может быть основной поток приложения или любой другой поток, который не отвечает. Однако поток, помеченный как Triggered ANR, может и не быть фактической причиной ошибки ANR. Чтобы помочь вам в отладке и устранении ошибок ANR, Crashlytics также помечает другие потоки, связанные с ошибкой. В следующих разделах этой страницы вы узнаете о других тегах, которые могут быть применены к цепочке.

Deadlocked

Все потоки, которые участвовали во взаимной блокировке, приведшей к ошибке ANR, помечаются тегом Deadlocked.

Взаимная блокировка возникает, когда поток переходит в режим ожидания, потому что необходимый ресурс занят другим потоком, который также ожидает ресурс, занятый первым потоком. Если в такой ситуации оказывается основной поток приложения, скорее всего, возникнет ошибка ANR.

Рекомендация

Посмотрите на потоки, участвующие во взаимной блокировке, и проверьте ресурсы/блокировки, полученные этими потоками. Возможные решения описаны в статьях Взаимная блокировка и Алгоритмы предотвращения взаимной блокировки.

IO Root blocking

Любой поток, который выполнял медленные операции I/O и блокировал поток Triggered ANR, помечается тегом IO Root blocking. Если поток Triggered ANR не заблокирован другими потоками, то поток IO Root blocking также является потоком Root blocking.

Рекомендация

В целом не рекомендуется выполнять ресурсоемкие операции ввода-вывода в основном потоке. Если основной поток IO Root blocking, вы также можете использовать строгий режим, чтобы выявить непреднамеренные операции I/O, которые выполняются в основном потоке.

Root blocking

Любой поток, который заблокировал поток с тегом Triggered ANR, помечается тегом Root blocking. Если цепочка помечена как Root blocking и Triggered ANR, то нет других цепочек, которые ее блокируют.

Если какие-либо потоки Triggered ANR ожидали (возможно, транзитивно) другие потоки, они Root blocking. Причины, по которым поток может быть основной причиной ошибки ANR, могут быть разными.

Рекомендация

Минимизируйте работу, требующую высокой производительности ЦП, в основном потоке. Для выполнения задач, требующих интенсивного использования ЦП, используйте рабочие или фоновые потоки.

Минимизируйте в основном потоке работу, связанную с I/O, например загрузку из базы данных.

Unknown root cause

Тег Unknown root cause присваивается потоку, который вызвал ошибку ANR, но бездействовал в процессе, когда она произошла. У Crashlytics недостаточно информации, чтобы определить основную причину. Очевидной причины возникновения этой ошибки ANR нет.

Рекомендация

Следуйте общим рекомендациям по предотвращению ошибок ANR. Например, определите, в каких местах кода основной поток приложения может быть занят более 5 секунд.

Waiting for binder call

Любой поток, который ожидал вызова связывателя и заблокировал поток Triggered ANR, помечается тегом Waiting for binder call. Если поток Triggered ANR не заблокирован другими потоками, то поток Waiting for binder call также является потоком Root blocking.

Рекомендация

Поскольку задержка вызова binder может быть непредсказуемой, относитесь к таким вызовам как к операциям I/O и по возможности избегайте их в основном потоке. Переместите код, который запускает вызовы Binder (включая вызовы API платформы, приводящие к транзакциям Binder), в фоновый поток или кешируйте результаты, если вызов из основного потока неизбежен.