본문 바로가기

Study/Android

ANR(Application Not Responding)

ANR

개발하다보면 마주하게 되는 '애플리케이션 응답 없음' 창, 바로 강제종료 창

안드로이드에서는 일정 시간 동안 응답하지 애플리케이션이 있으면 앱의 응답이 멈추었다고 알리는 대화상자를 표시한다.

 

 

ANR 발생 이유

대표적으로 ANR 발생하는 이유는 다음과 같다.

  • 애플리케이션이 UI스레드에 어떠한 I/O 명령으로 인해 막힐 때
  • 너무 많은 시간을 정교한 메모리 구조를 구축하는데 들일 때
  • Input 이벤트(키를 누르거나 화면을 터치하는 등)가 5초 안에 반응하지 않을 때
  • BroadcastReceiver가 10초 내로 실행을 끝내지 않을 때(UI가 없는 BroadcastReceiver, 서비스도 실행 주체가 된 Main Thread이므로 긴 시간을 소모하는 작업인 경우)

 

솔직히 이제까지 ANR 을 경험한 바로써

위에 써 놓은 4가지의 이유도 있지만 정말 무수히 많은 이유가 있다.

UI 측면에서의 이유도 있고, 무한 스레드를 돌려서도 생기고

특히나 어처구니 없는 실수(코드를 짰을 때 오류는 없었지만 기능상의 오류)로 인해 생길 때도 많다.

 

 

ANR 예방

그러면 어떻게 ANR 발생을 줄일 수 있을까?

Main Thread에서 실행되는 임의의 Method는 최소한의 일을 해야한다고 한다.

onCreate(), onResume() 같은 안드로이드 핵심 생명주기에 속해있는 Method에서는 가능한 적은 일을 수행해야한다.

아래는 안드로이드 측에서 권장하는 ANR 예방 설계 방법이다.

  • 시간 소모가 많은 작업은 스레드를 통해 처리
  • 사용자에게 프로그래스 바 등을 이용해 작업의 진행 과정을 안내

 

 

ANR 로 인한 오류 데이터 확인

내가 알고있는 한 2가지의 방법으로 확인할 수 있다.

첫번째는 안드로이드 개발자 페이지에서 나와있는 방법으로 확인할 수가 있다.

https://support.google.com/googleplay/android-developer/answer/9859174?hl=ko 

 

두번째는 Firebase Crashlytics로 확인할 수 있다.

https://firebase.google.com/docs/crashlytics/get-started?hl=ko&platform=Android 

 

첫번째 방법은 플레이스토어에 앱이 올라가 있어야 확인이 가능하지만

운영 중인 앱에 한해서만 버그 리포트를 수집하니 둘 다 비슷하다고 하겠다.

'Study > Android' 카테고리의 다른 글

[공유] RecycleView Animation  (0) 2021.08.23
DataBinding  (0) 2021.08.19
Dagger2 DaggerAppComponent Not Found  (1) 2021.08.11
[Kotlin] 기본  (0) 2020.09.24
[Android] Java & Kotlin 함께 쓰기  (0) 2020.09.23