이번에 모 회사의 코딩 테스트 문제를 풀고 있는데, 객관식 문제에서 ANR에 대해 묻는 문제가 나왔습니다. 아무래도 안드로이드 애플리케이션을 운영하다보면, 구글 플레이에서 보여주는 통계에서 ANR 비율도 보여주기 때문에 ANR이 무엇인지 모를 수는 없지만, 아무래도 정확하게 알지 못할 수도 있겠다 싶어 확실히 정리하고 가려고 합니다.
ANR, 그러니까 Application Not Responding은 뭔가 깊은 뜻이 따로 있을 것 같지만 어이없게도 번역 그대로 애플리케이션이 응답하지 않는다는 의미입니다. 일단 이 ANR이 뜨기 위해서는 안드로이드의 mainthread가 5초 이상 동작하지 않아야 한다고 공홈에 적혀 있습니다. 그러니까 이 ANR은 비정상 종료라고 하는 exception이 발생해 애플리케이션이 강제 종료되는 현상과는 다른 현상입니다.
ANR이 발생했을 때, 위의 화면과 같이 다이얼로그와 함께 애플리케이션이 강제종료됩니다. 이러한 ANR은 오랜 시간이 걸릴 것으로 예상되는(파일 I/O, 네트워크 통신) 것들을 안드로이드의 UI 쓰레드인 Main 쓰레드에서 실행시키게 됨으로서 발생하게 됩니다.
하지만 네트워크 통신을 할 때나 Room, SQLite 등을 가지고 데이터를 처리한다거나 하는 과정에 있어서는 안드로이드 자체에서 Exception을 발생시켜 메인쓰레드에서는 아예 그러한 과정을 실행시킬 수 없도록 처리해주었습니다. 그래서 현재는 보통 이러한 ANR은 과도한 반복문의 사용을 다른 쓰레드에서 처리하지 않고 별다른 코루틴이나 쓰레드의 이동 없이 처리하는 과정이 존재할 때 대부분 발생합니다.
혹은 브로드캐스트 리시버나 서비스의 바인드 과정에서의 교착상태 역시 파악해야 합니다. 이러한 ANR은 보통 코드를 작성할 때, 교착상태를 일으키거나 충분히 많은 데이터를 관리할 때 메인쓰레드에서 작성하는 경우 발생하기 때문에 이러한 경우에는 다른 쓰레드 및 코루틴에서 작동할 수 있도록 개발자의 컨트롤이 필요합니다. 하지만, 코틀린의 suspend와 같은 함수를 사용하는 경우, 메인쓰레드에서 실행하지 않고 있음에도 불구하고 다른 쓰레드의 작업을 기다리는 과정으로 인해 ANR이 발생할 수 있으니 항상 고려해서 코루틴의 변경이 이루어져야 합니다.
처음에는 ANR과 비정상 종료를 구분하지 않아서 ANR이 뜨는 알림이 올 때 exception을 살펴보는 바보같은 짓을 하곤 했습니다. 어쨌든 애플리케이션이 강제로 종료되는 것은 동일하니 같다고 무의식적으로 생각해버린 것 같은데... 코딩할 때 머리를 비워버리니 이상한 곳에서 이상한 생각을 가지게 되네요. 좀 더 머리를 채우고 일해야 할 것 같습니다.
'안드로이드 > 기타' 카테고리의 다른 글
안드로이드 쓰레드의 통신 과정(Looper, Handler, MessageQueue) (0) | 2022.09.25 |
---|---|
안드로이드 Application Class (2) | 2022.09.11 |
LiveData vs RxJava (0) | 2022.07.08 |
AAC 데이터 바인딩이란? (0) | 2022.05.25 |
안드로이드 앱 실행 시간(cold, hot, warm start) (1) | 2021.10.20 |
댓글