Debuguj swoją aplikację na Androida na podstawie tagów ANR w panelu Crashlytics

Błędy typu Aplikacja nie odpowiada (ANR) są wywoływane, gdy wątek interfejsu aplikacji nie odpowiada przez ponad 5 sekund. Więcej informacji o błędach ANR i ich diagnozowaniu znajdziesz w dokumentacji Androida.

Crashlytics może też pomóc w określaniu konkretnych wątków, które powodują problemy. Analizujemy błędy ANR, a potem na panelu Crashlytics otagowujemy odpowiednie wątki, aby wyświetlać wskazówki dotyczące ich debugowania.

W sekcjach na tej stronie wyjaśniamy, co oznacza każdy z tagów ANR, przedstawiamy przykładowy błąd ANR z tym tagiem i podpowiadamy, co należy zrobić, aby je debugować.

Triggered ANR

Wątek, który był zablokowany zbyt długo i wywołał błąd ANR, jest oznaczony tagiem Triggered ANR.

Wątek powodujący problemy może być głównym wątkiem aplikacji lub dowolnym wątkiem, który nie odpowiada. Jednak wątek oznaczony jako Triggered ANR może, ale nie musi, być rzeczywistą przyczyną błędu ANR. Aby zapewnić statystyki potrzebne do debugowania i naprawiania tych błędów ANR, Crashlytics oznacza też tagami wszystkie inne wątki, które uczestniczą w tym błędzie. W kolejnych sekcjach tej strony dowiesz się, jakie inne tagi można zastosować do wątku.

Deadlocked

Wszystkie wątki, które zostały uznane za zaangażowane w blokadę wzajemną, która doprowadziła do błędu ANR, są oznaczone tym tagiem Deadlocked.

Blokada występuje, gdy wątek przechodzi w stan oczekiwania, ponieważ wymagany zasób jest zablokowany przez inny wątek, który również oczekuje na zasób zablokowany przez pierwszy wątek. Jeśli w tej sytuacji występuje główny wątek aplikacji, błędy ANR mogą się zdarzyć.

Rekomendacja

Sprawdź wątki zaangażowane w błąd Deadlock i sprawdź zasoby/blokady uzyskane przez te wątki. Możliwe rozwiązania znajdziesz w artykule Deadlock (w języku angielskim) i Algorytmy zapobiegające blokowaniu się (w języku angielskim).

IO Root blocking

Każdy wątek, który wykonywał powolne operacje wejścia-wyjścia i zablokował wątek Triggered ANR, jest oznaczony tagiem IO Root blocking. Jeśli wątek Triggered ANR nie jest blokowany przez inne wątki, to wątek IO Root blocking jest też wątkiem Root blocking.

Rekomendacja

Ogólnie rzecz biorąc, aplikacja nie powinna wykonywać kosztownych operacji wejścia-wyjścia w wątku głównym. Jeśli wątek główny to IO Root blocking, możesz też użyć trybu rygorystycznego, aby wykryć niezamierzone operacje wejścia-wyjścia, które występują w wątku głównym.

Root blocking

Każdy wątek, który zablokował wątek otagowany jako Triggered ANR, jest opatrzony tagiem Root blocking. Jeśli wątek jest otagowany jednocześnie jako Root blocking i Triggered ANR, to nie ma innych wątków, które blokują ten wątek.

Jeśli jakieś wątki Triggered ANR oczekiwały (być może pośrednio) na inne wątki, są one Root blocking. Może być wiele przyczyn, dla których wątek jest główną przyczyną ANR.

Rekomendacja

Zminimalizuj obciążenie procesora w wątku głównym. Do wykonywania zadań wymagających dużej mocy obliczeniowej procesora używaj wątków roboczych lub wątków w tle.

Zminimalizuj intensywne operacje we/wy, takie jak wczytywanie z bazy danych, w wątku głównym.

Unknown root cause

Wątek jest oznaczony tagiem Unknown root cause, jeśli był to wątek, który wywołał błąd ANR, ale był nieaktywny w czasie wystąpienia błędu ANR. Crashlytics nie ma wystarczających informacji, aby określić główną przyczynę. Nie ma oczywistej przyczyny tego błędu ANR.

Rekomendacja

Postępuj zgodnie z ogólnymi wskazówkami dotyczącymi zapobiegania błędom ANR. Na przykład zidentyfikuj miejsca w kodzie, w których wątek główny aplikacji może być zajęty dłużej niż 5 sekund.