티스토리 뷰

FrontEnd 마이닝/Android

[안드로이드] ANR의 의미와 예방

광부 금광캐는광부 2016.07.05 23:33


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.


서론



 

안드로이드 앱을 구현하여 돌리다보면, 또는 플레이스토어에 올라온 앱임에도 불구하고, 앱의 중지를 알리는 메시지를 심심치 않게 봤을 것이다. 이러한 시스템 이슈를 알리는 메시지 중 하나인 ANR에 대해서 알아보고 어떻게 피할 수 있을까? 생각해보도록 하겠다.



ANR이란?

ANR은 Application Not Responding의 약자로 그대로 해석해보면 의미를 쉽게 파악할 수 있다. '애플리케이션이 응답하지 않는다.' 인 것이다. 이 에러의 원인은 Main Thread(UI Thread)가 일정 시간 어떤 Task에 잡혀 있으면 발생하게 된다.



ANR의 발생 요인

ANR은 대체로 아래의 상황에서 발생하게 된다.

  • 애플리케이션이 UI 스레드에 어떠한 I/O 명령(빈번한 네트워크 액세스)으로 인해 막힐 때
  • 너무 많은 시간을 정교한 메모리 구조를 구축하는데 들일 때
구체적으로 설명하자면 Android Developers 에서는 아래와 같이 명시하고 있다.

  • Input 이벤트(키를 누르거나 화면을 터치하는 등)에 5초안에 반응을 하지 않을 때
  • BroadcatReceiver 가 10초내로 실행을 끝내지 않을 때 (UI가 없는 브로드캐스트 리시버, 서비스도 실행 주체가 메인스레드이므로 긴 시간을 소모하는 작업인 경우 ANR을 발생시킨다.)
 이렇게만 보면 '아 그냥 뭔가 오래 걸리면 ANR이 발생하는구나?' 생각할 것 이다. 그래서 쉽게 이해하도록 필자는 간단하게 Main Thread(UI Thread)가 일정시간 어떤 Task에 잡혀 있으면 발생하는 에러라고 칭하겠다.


ANR 예방 설계

 어떻게 ARN을 예방해야할까? 에 대한 질문도 친절하게 Android Developers 에서 설명해주고 있다. Main Thread에서 실행되는 임의의 method는 최소한의 일을 해야한다. 특히 onCreate( )나 onResume( ) 같은 안드로이드의 핵심 생명주기에 속해있는 method에서는 가능한 적은 일을 수행해야한다. 아래는 안드로이드 측에서 권장하는 ANR의 예방 설계 방법이다.

  1.  시간 소모가 많은 작업은 스레드를 통해 처리하라.
  2.  사용자에게 프로그레스바 등을 이용해 작업의 진행 과정을 안내해 기다리도록 한다.


ANR의 필요성

필자의 짧은 생각으로 ANR은 왜 필요할까? 오래 걸리는 작업이라도 어처피 처리해야하는 것이라면 하고 넘어가는 것이 당연한 것 아닌가? 라고 생각했었다. 하지만 안드로이드 OS를 사용하는 단말기는 대부분 스마트폰이나 패드 같은 작은 화면에 터치를 이용해 빠른 응답을 얻어내는 일을 한다.  대부분의 사용자와 마찬가지로 필자도 프로그레스바와 같은 진행사항이 없이 변화 없는 UI를 마주하면 이것이 먹통이 된 것인지, 진행하고 있는 것인지 생각할 겨를도 없이 꺼버리게된다. 그러므로 미리 사용자 편의성을 위해 개발자는 ANR이 최대한 발생하지 않도록 앱을 개발하라는 구글의 뜻이라고 생각한다.







댓글
댓글쓰기 폼