ANR(Application Not Responding)에 대해

울늘·2024년 3월 14일
0

기술 질문

목록 보기
2/2

ANR (Application Not Responding)

ANR(앱이 응답하지 않음, Application Not Responding)은 안드로이드 애플리케이션이 사용자 입력에 대해 적절하게 응답하지 않을 때 발생하는 상태를 나타냅니다. 사용자 입력에 대한 응답이 없으면 안드로이드 시스템은 ANR을 감지하고 사용자에게 경고를 표시합니다.

작성자 본인도 앱을 만들 때도 물론이고 앱을 출시하고 나서도 ANR을 수도 없이 겪어봤다. 앱을 충분히 개발하고나면 원인을 알기 어려운 경우도 있으니 이번기회에 자세히 알고 코드를 작성하면서 주의하도록 하자.

다음 조건 중 하나가 발생하면 앱과 관련한 ANR이 트리거됩니다.

입력 전달 타임아웃: 앱이 입력 이벤트(예: 키 누름 또는 화면 터치)에 5초 이내에 응답하지 않은 경우

서비스 실행: 앱에서 선언한 서비스가 몇 초 이내에 Service.onCreate() 및 Service.onStartCommand()/Service.onBind() 실행을 완료할 수 없는 경우

Service.startForeground()가 호출되지 않음: 앱이 Context.startForegroundService()를 사용하여 포그라운드에서 새 서비스를 시작했지만 서비스가 5초 내에 startForeground()를 호출하지 않은 경우

인텐트 브로드캐스트: BroadcastReceiver가 설정된 시간 내에 실행을 완료하지 못한 경우. 앱에 포그라운드 활동이 있는 경우 이 제한 시간은 5초입니다.

JobScheduler 상호작용: JobService가 몇 초 이내에 JobService.onStartJob() 또는 JobService.onStopJob()에서 반환되지 않거나 사용자 시작 작업이 시작되고 JobService.onStartJob()이 호출된 후 몇 초 이내에 앱이 JobService.setNotification()을 호출하지 않는 경우. Android 13 및 이전 버전을 타겟팅하는 앱의 경우 ANR이 음소거되고 앱에 보고되지 않습니다. Android 14 및 이후 버전을 타겟팅하는 앱의 경우 ANR이 명시적이고 앱에 보고됩니다.

ANR 진단

ANR을 진단할 때 다음과 같은 일반 패턴을 찾아야 합니다.

  • 앱이 기본 스레드에서 I/O와 관련된 느린 작업을 실행 중입니다.
  • 앱이 기본 스레드에서 긴 계산을 실행 중입니다.
  • 기본 스레드에서 다른 프로세스에 관한 동기 바인더 호출을 실행 중이고 다른 프로세스가 반환하는 데 오랜 시간이 걸립니다.
  • 다른 스레드에서 발생하는 긴 작업을 위해 동기화된 블록을 대기하는 동안 기본 스레드가 차단되었습니다.
  • 기본 스레드가 프로세스에서 또는 바인더 호출을 통해 다른 스레드와 교착 상태에 있습니다. 기본 스레드가 긴 작업이 완료될 때까지 대기하는 것만이 아니라 교착 상태에 있습니다. 자세한 내용은 위키백과에서 교착 상태를 참고하세요.

위의 Android 공식 페이지의 내용들을 살펴보면 기본 쓰레드에 문제가 생겼을 떄 ANR이 발생하는 것을 알 수 있다. 특히나 작업이 오래걸리는 경우 기본 쓰레드를 사용할 때 문제가 많이 발생하므로 작업이 오래걸리는 경우 별도의 쓰레드를 사용하는 것이 중요하다.

ANR을 방지하기 위해

먼저 Android vitals를 사용하면 앱의 ANR 발생률을 모니터링하고 개선할 수 있도록 도와준다고 한다. 만약 ANR이 계속해서 발생한다면 Android vitals 데이터를 수집해서 어느 부분에서 기본 쓰레드에 과부화를 주는지 알아보면 좋을 것 같다. 제일 중요한건 기본 쓰레드의 관리인 것 같다. 오래걸릴 것 같은 작업은 꼭 별도의 쓰레드를 사용해서 기본 쓰레드가 멈추지 않도록 하자

profile
주니어 안드로이드 개발자입니다!

0개의 댓글