Crashlytics 대시보드에서 ANR 태그를 기반으로 Android 앱 디버깅

애플리케이션 응답 없음(ANR) 오류는 애플리케이션의 UI 스레드가 5초 이상 응답하지 않을 때 트리거됩니다. ANR 및 ANR 진단에 관한 자세한 내용은 Android 문서를 참조하세요.

또한 Crashlytics는 문제가 있는 특정 스레드를 파악하는 데 도움이 될 수 있습니다. ANR을 분석한 다음 Crashlytics 대시보드에서 관련 스레드에 태그를 지정하여 ANR 디버깅 방법에 관한 힌트를 제공합니다.

이 페이지의 다음 섹션에서는 각 ANR 태그의 의미를 설명하고 태그가 지정된 ANR 예시를 보여주며 ANR을 디버깅하기 위한 권장 솔루션을 제공합니다.

Triggered ANR

너무 오랫동안 차단되어 ANR을 트리거한 스레드는 이 Triggered ANR 태그로 주석 처리됩니다.

문제가 있는 스레드는 앱의 기본 스레드이거나 응답하지 않는 스레드가 될 수 있습니다. 하지만 Triggered ANR 태그가 지정된 스레드는 ANR의 실제 원인일 수도 있고 그렇지 않을 수도 있습니다. 이러한 ANR 디버깅 및 해결에 도움이 되는 통계를 제공하기 위해 Crashlytics는 ANR과 관련된 다른 스레드에 태그를 지정하기도 합니다. 이 페이지의 다음 섹션에서 스레드에 적용될 수 있는 다른 태그에 관해 알아봅니다.

Deadlocked

ANR로 이어지는 교착 상태에 관여하는 것으로 확인된 스레드는 이 Deadlocked 태그로 주석 처리됩니다.

한 스레드에서 필요한 리소스를 다른 스레드가 보유하고 있고, 다른 스레드 역시 첫 번째 스레드가 보유 중인 리소스를 대기하고 있어 스레드가 대기 상태가 되는 경우 교착 상태가 발생합니다. 앱의 기본 스레드가 이 상황이면 ANR이 발생할 가능성이 높습니다.

권장사항

교착 상태에 관련하는 스레드를 살펴보고 이러한 스레드에서 획득한 리소스/잠금을 확인합니다. 가능한 해결 방법은 교착 상태교착 상태 방지 알고리즘을 참조하세요.

IO Root blocking

느린 I/O 작업을 실행하고 Triggered ANR 스레드를 차단한 모든 스레드는 IO Root blocking 태그로 주석 처리됩니다. Triggered ANR 스레드가 다른 스레드에 의해 차단되지 않는 경우 IO Root blocking 스레드 역시 Root blocking 스레드입니다.

권장사항

일반적으로 앱은 기본 스레드에서 비용이 많이 드는 I/O 작업을 실행해서는 안 됩니다. 기본 스레드가 IO Root blocking인 경우 엄격한 모드를 사용하여 기본 스레드에서 발생하고 있는 의도하지 않은 I/O 작업을 식별할 수도 있습니다.

Root blocking

Triggered ANR 태그가 지정된 스레드를 차단한 모든 스레드는 Root blocking 태그로 주석 처리됩니다. 스레드에 Root blockingTriggered ANR 태그가 모두 지정되었다면 이 스레드를 차단하는 다른 스레드가 없습니다.

Triggered ANR 스레드가 다른 스레드를 대기 중인 경우(전이적일 수 있음) Root blocking입니다. 스레드가 ANR의 근본 원인인 이유는 여러 가지가 있을 수 있습니다.

권장사항

기본 스레드에서 CPU 집약적인 작업을 최소화합니다. CPU를 많이 사용하는 작업을 실행하기 위해 작업자 또는 백그라운드 스레드를 사용합니다.

기본 스레드에서 데이터베이스 로드와 같은 I/O 집약적 작업을 최소화합니다.

Unknown root cause

ANR이 트리거되었지만 ANR이 발생했을 때 프로세스에서 유휴 상태였던 스레드에는 Unknown root cause 태그가 지정됩니다. Crashlytics에는 근본 원인을 파악할 수 있는 정보가 충분하지 않습니다. 이 ANR이 발생한 명확한 이유가 없습니다.

권장사항

ANR을 방지하는 방법에 관한 일반적인 권장사항을 따르세요. 예를 들어 코드에서 앱의 기본 스레드가 5초 이상 사용될 수 있는 위치를 파악합니다.