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 UI 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śleniu konkretnych problematycznych wątków.Crashlytics Analizujemy błędy ANR, a następnie w panelu DevOps i zaangażowanie > Crashlytics dashboard oznaczamy odpowiednie wątki, aby podać wskazówki dotyczące debugowania błędów ANR.

W sekcjach poniżej wyjaśniamy, co oznacza każdy tag ANR, podajemy przykład błędu ANR z tym tagiem oraz zalecane rozwiązanie umożliwiające debugowanie błędu ANR.

Triggered ANR

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

Problematyczny wątek może być wątkiem głównym aplikacji lub dowolnym wątkiem, który nie odpowiada. Wątek oznaczony tagiem Triggered ANR może być lub nie być rzeczywistą przyczyną błędu ANR. Aby dostarczyć informacji umożliwiających debugowanie i naprawianie tych błędów ANR, Crashlytics oznacza też wszystkie inne wątki, które są powiązane z błędem ANR. W kolejnych sekcjach tej strony dowiesz się więcej o innych tagach, które można zastosować do wątku.

Deadlocked

Wszystkie wątki, które uczestniczyły w zakleszczeniu, które doprowadziło do błędu ANR, są oznaczane tagiem Deadlocked.

Zakleszczenie występuje, gdy wątek przechodzi w stan oczekiwania, ponieważ wymagany zasób jest używany przez inny wątek, który również czeka na zasób używany przez pierwszy wątek. Jeśli w takiej sytuacji znajdzie się wątek główny aplikacji, prawdopodobnie wystąpią błędy ANR.

Rekomendacja

Sprawdź wątki uczestniczące w zakleszczeniu i zasoby/blokady uzyskane przez te wątki. Możliwe rozwiązania znajdziesz w artykułach Deadlock i Deadlock prevention algorithms.

IO Root blocking

Każdy wątek, który wykonywał powolne operacje wejścia-wyjścia i zablokował Triggered ANR wątek jest oznaczony tagiem IO Root blocking. Jeśli wątek Triggered ANR nie jest zablokowany 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 jest oznaczony tagiem IO Root blocking, możesz też użyć trybu ścisłego aby zidentyfikować nieumyślne operacje wejścia-wyjścia wykonywane w wątku głównym.

Root blocking

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

Jeśli jakiekolwiek Triggered ANR wątki oczekiwały (być może przejściowo) na inne wątki, są one Root blocking. Przyczyn, dla których wątek może być główną przyczyną błędu ANR, może być wiele.

Rekomendacja

Zminimalizuj obciążenie procesora w wątku głównym. Do wykonywania zadań obciążających procesor używaj wątków roboczych lub wątków działających w tle.

Zminimalizuj obciążenie wejścia-wyjścia, np. wczytywanie z bazy danych, w wątku głównym.

Unknown root cause

Wątek jest oznaczony tagiem Unknown root cause, jeśli wywołał błąd ANR, ale w momencie wystąpienia błędu ANR był w procesie bezczynny. Crashlytics nie ma wystarczających informacji, aby określić główną przyczynę. Nie ma oczywistego powodu, dla którego wystąpił ten błąd 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 przez ponad 5 sekund.