애플리케이션 응답 없음(ANR) 오류는 애플리케이션의 UI 스레드가
또한 Crashlytics는 문제가 있는 특정 스레드를 파악하는 데 도움이 될 수 있습니다. ANR을 분석한 다음 Crashlytics 대시보드에서 관련 스레드에 태그를 지정하여 ANR 디버깅 방법에 관한 힌트를 제공합니다.
이 페이지의 다음 섹션에서는 각 ANR 태그의 의미를 설명하고 태그가 지정된 ANR 예시를 보여주며 ANR을 디버깅하기 위한 권장 솔루션을 제공합니다.
Triggered ANR
너무 오랫동안 차단되어 ANR을 트리거한 스레드는 이 Triggered ANR
문제가 있는 스레드는 앱의 기본 스레드이거나 응답하지 않는 스레드가 될 수 있습니다. 하지만 Triggered ANR
Deadlocked
ANR로 이어지는 교착 상태에 관여하는 것으로 확인된 스레드는 이 Deadlocked
한 스레드에서 필요한 리소스를 다른 스레드가 보유하고 있고, 다른 스레드 역시 첫 번째 스레드가 보유 중인 리소스를 대기하고 있어 스레드가 대기 상태가 되는 경우 교착 상태가 발생합니다. 앱의 기본 스레드가 이 상황이면 ANR이 발생할 가능성이 높습니다.
예시 보기
다음은 교착 상태에 관여하는 두 스레드입니다.
main (unknown): tid=1 systid=1568 com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.getPackage(PackageManagerService.java:22701) com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.filterOnlySystemPackages(PackageManagerService.java:22787) ... com.android.server.SystemServer.main(SystemServer.java:368) java.lang.reflect.Method.invoke(Native method) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:517) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934) ActivityManager (unknown): tid=21 systid=1902 com.android.server.pm.PackageManagerService.getPackageSetting(PackageManagerService.java:23618) com.android.server.pm.PackageManagerService.getPackageUid(PackageManagerService.java:4542) ... android.os.Handler.handleCallback(Handler.java:907) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:216) android.os.HandlerThread.run(HandlerThread.java:67) com.android.server.ServiceThread.run(ServiceThread.java:44)
권장사항
교착 상태에 관련하는 스레드를 살펴보고 이러한 스레드에서 획득한 리소스/잠금을 확인합니다. 가능한 해결 방법은 교착 상태 및 교착 상태 방지 알고리즘을 참조하세요.
IO Root blocking
느린 I/O 작업을 실행하고 Triggered ANR
IO Root blocking
Triggered ANR
IO Root blocking
Root blocking
예시 보기
Thread main(THREAD_STATE_TIMED_WAITING) sun.misc.Unsafe.park( Unsafe.java:0 ) java.util.concurrent.locks.LockSupport.parkNanos( LockSupport.java:230 ) android.database.sqlite.SQLiteConnectionPool.waitForConnection( SQLiteConnectionPool.java:756 ) ... android.app.ActivityThread.main( ActivityThread.java:8192 )
Thread main(THREAD_STATE_NATIVE_WAITING) Syscall art::ConditionVariable::WaitHoldingLocks(art::Thread*) art::GoToRunnable(art::Thread*) art::JniMethodEnd(unsigned int, art::Thread*) libcore.io.Linux.fdatasync( Linux.java:0 ) libcore.io.ForwardingOs.fdatasync( ForwardingOs.java:105 ) ... java.io.RandomAccessFile.write( RandomAccessFile.java:559 ) ... android.app.ActivityThread.main( ActivityThread.java:8192 )
권장사항
일반적으로 앱은 기본 스레드에서 비용이 많이 드는 I/O 작업을 실행해서는 안 됩니다. 기본 스레드가 IO Root blocking
Root blocking
Triggered ANR
Root blocking
Root blocking
Triggered ANR
Triggered ANR
Root blocking
예시 보기
다음은 스레드 상태를 기반으로 한 몇 가지 예시입니다.
Thread main(THREAD_STATE_RUNNABLE) android.os.Parcel.createTypedArray( Parcel.java:3086 ) android.content.pm.PackageInfo.<init>( PackageInfo.java:546 ) ... android.app.ActivityThread$H.handleMessage( ActivityThread.java:2166 ) android.os.Handler.dispatchMessage( Handler.java:106 ) android.os.Looper.loop( Looper.java:246 ) android.app.ActivityThread.main( ActivityThread.java:8633 )
Thread main(THREAD_STATE_BLOCKED) DBHelper.runOnDB( DBHelper.java:97 ) DBHelper.runDb( DBHelper.java:125 ) ... java.lang.reflect.Method.invoke( Method.java:0 ) EventBus.invokeSubscriber( EventBus.java:510 ) postToSubscription( EventBus.java:437 ) ... android.os.Handler.handleCallback( Handler.java:938 ) android.os.Handler.dispatchMessage( Handler.java:99 ) android.os.Looper.loop( Looper.java:268 ) android.app.ActivityThread.main( ActivityThread.java:7904 )
권장사항
기본 스레드에서 CPU 집약적인 작업을 최소화합니다. CPU를 많이 사용하는 작업을 실행하기 위해 작업자 또는 백그라운드 스레드를 사용합니다.
기본 스레드에서 데이터베이스 로드와 같은 I/O 집약적 작업을 최소화합니다.
Unknown root cause
ANR이 트리거되었지만 ANR이 발생했을 때 프로세스에서 유휴 상태였던 스레드에는 Unknown root cause
예시 보기
Thread main(THREAD_STATE_NATIVE_WAITING) __epoll_pwait android::Looper::pollInner(int) android::Looper::pollOnce(int, int*, int*, void**) android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int) android.os.MessageQueue.nativePollOnce( MessageQueue.java:0 ) android.os.MessageQueue.next( MessageQueue.java:335 ) android.os.Looper.loop( Looper.java:193 ) android.app.ActivityThread.main( ActivityThread.java:8019 )
권장사항
ANR을 방지하는 방법에 관한 일반적인 권장사항을 따르세요. 예를 들어 코드에서 앱의 기본 스레드가