ANR
안드로이드 앱의 UI 스레드가 너무 오랫동안 차단되면 'ANR(애플리케이션 응답 없음)' 오류가 트리거된다. 앱이 포그라운드에 있으면 그림과 같이 시스템에서 사용자에게 대화상자를 표시한다. 사용자가 ANR 대화상자에서 앱을 강제 종료할 수 있다.
다음 조건 중 하나가 발생하면 앱과 관련한 ANR이 트리거된다.
- 입력 전달 타임아웃: 앱이 입력 이벤트(예: 키 누름 또는 화면 터치)에 5초 이내에 응답하지 않은 경우이다. 키 이벤트인 볼륨, 메뉴, 백 키의 경우는 눌리고서 5초 이상 지연 시 바로 ANR을 발생시킨다. 참고로 홈 키와 전원 키는 앱과 별개로 동작하고 ANR 발생과는 무관하다. 터치 이벤트는 경우가 다르다. 터치 이벤트도 메인 스레드가 사용 중이라면 대기하는 것은 동일하지만 타임아웃 된다고 해서 바로 ANR이 발생하지 않는다. 그 다음으로 이어서 터치 이벤트가 왔을 떄는 두 번째 터치 이벤트가 전달되지 않는 시간이 타임아웃되면 ANR이 발생한다.
- 서비스 실행: 앱에서 선언한 서비스가 몇 초 이내에 Service.onCreate() 및 Service.onStartCommand()/Service.onBind() 실행을 완료할 수 없는 경우
- Service.startForeground()가 호출되지 않음: 앱이 Context.startForegroundService()를 사용하여 포그라운드에서 새 서비스를 시작했지만 서비스가 5초 내에 startForeground()를 호출하지 않은 경우
- 인텐트 브로드캐스트: BroadcastReceiver가 설정된 시간 내에 실행을 완료하지 못한 경우. 앱에 포그라운드 활동이 있는 경우 이 제한 시간은 5초입니다. 결론적으로 브로드캐스트 리시버의 경우에 오래 걸리는 작업이 있다면 서비스로 넘겨서 실행해야 하고, 서비스에서는 다시 백그라운드 스레드를 이용해야 한다.
- Message 처리 각각이 5초 이내라도 총합 처리 시간 영향: 특정 Message 처리가 5초가 넘더라도 그 사이에 터치가 없을 때는 문제가 발생하지 않는다. 예를들어, for문을 0부터 4까지 돌리는데 2초씩 메인 스레드를 블로킹하고 있다고 가정하자. 5개의 Message를 처리하는 시간은 총 10초다. 가만히 두면 문제가 없다. 하지만 Message를 처리하는 중에 화면을 두 번 이상 터치하면 ANR이 발생한다. (앞에 쌓여있는 Message를 먼저 처리하느라 터치 이벤트에 대한 처리가 지연되는 것)
출처
https://developer.android.com/topic/performance/vitals/anr?hl=ko
ANR | App quality | Android Developers
ANR 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱의 UI 스레드가 너무 오랫동안 차단되면 'ANR(애플리케이션 응답 없음)' 오류가 트리거됩니다. 앱이
developer.android.com
'Studying > Android' 카테고리의 다른 글
[INTERVIEW 2주차] Dialog and Toast, SnackBar (0) | 2023.06.30 |
---|---|
[INTERVIEW 2주차] MainThread + Handler (0) | 2023.06.30 |
[INTERVIEW 2주차] What is the Intent ? (0) | 2023.06.29 |
[INTERVIEW 1주차] Activity, Fragment LifeCycle (0) | 2023.06.07 |
[INTERVIEW 1주차] Activity와 Fragment의 차이점 (0) | 2023.06.07 |