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 |