반응형

다른 안드로이드 개발자분들의 글을 읽다가 'ANR'이라는 걸 보게 됐다. 분명히 예전에 스쳐 지나가며 알았던 건데 기억도 애매하고 관련해서 여러 내용들을 정리하려 한다.


ANR 발생

 

ANR 이란?

'Application Not Responding'의 약자이며 '애플리케이션이 응답하지 않음'라는 뜻이다. Windows OS로 비교해 보자면 간혹 실행 중이던 프로그램이 무한 로딩 되거나 멈추게 되면 잠시 후 '응용프로그램이 응답하지 않습니다.'라는 창이 뜨는데 이것과 같다고 생각할 수 있을 것 같다.

 

ANR이 발생하는 이유는 뭐지?

안드로이드 공식 레퍼런스 문서에서는 이렇게 정리되어 있다.

● 입력 전달 타임아웃: 앱이 입력 이벤트(예: 키 누름 또는 화면 터치)에 5초 이내에 응답하지 않은 경우
● 서비스 실행: 앱에서 선언한 서비스가 몇 초 이내에 Service.onCreate() 및 Service.onStartCommand()/Service.onBind() 실행을 완료할 수 없는 경우
● Service.startForeground()가 호출되지 않음: 앱이 Context.startForegroundService()를 사용하여 포그라운드에서 새 서비스를 시작했지만 서비스가 5초 내에 startForeground()를 호출하지 않은 경우
● 인텐트 브로드캐스트: BroadcastReceiver가 설정된 시간 내에 실행을 완료하지 못한 경우. 앱에 포그라운드 활동이 있는 경우 이 제한 시간은 5초입니다.

정확하게는 각 상황 별로 ANR이 발생되는 트리거는 다르지만 단순하게 생각하면 요청받은 특정 동작이 5초 이내에 정상적으로 실행되지 않을 경우 발생된다고 생각하면 될 것 같다. 정보를 찾아보던 중 몇몇 곳에서는 BroadcastReceiver로 인해 발생될 경우에는 10초 이내라고 설명되어 있던데 확인해보진 못했다.

여담으로 왜 하필 5초인가? 하는 궁금증이 생겼지만 아쉽게도 그 이유는 공식 문서를 포함해서 나와 있지 않아 알 수 없었다...

 

 

그런데 5초 이상 걸리는 것들은 꽤 많지 않나?
 

ANR 발생 트리거 경우들을 잘 보면 '모든 동작에 있어서 5초'가 아니다. 정확하게는 'UI 업데이트를 담당하는 UI Thread에서 수행되는 동작의 5초'이다. 스레드는 프로세스 내에서 실행되는 실행의 흐름인데 이는 'Main Thread'와 'Background Thread'로 나누어져 있다. 그중 사용자에 눈에 보이는 시각적인 부분을 담당하는 Thread가 'Main Thread'이며 때문에 'UI Thread'라고 불리기도 한다.

 

ANR의 발생을 예방하려면?

단순하게 생각하면 소요 시간이 긴 작업을 최소화하면 된다. 하지만 당연하게도 모르는 게 아니라 알고 있음에도 필요한 작업이거나 예상 보다 오래 걸리는 작업들이 있지 않은가? 그래서 예방하는 방법으로 가장 쉬운 방법은

UI 업데이트(사용자에게 보여지는 시각적인 것들)를 제외한 나머지 작업은 Main Thread에서 수행하지 말라는 것이다.

이는 즉 연산이나 네트워크 통신, 저장소와 관련된 작업들을 뜻한다. 굳이 사용자에게 시각적으로 보여주지 않고 해당 작업의 결과만 알려주면 되기 때문이다. 또한 작업이 수행되고 있음을 사용자가 알 수 있도록 프로그래스바 등을 표현해 주는 것도 좋다. 사용자가 특정 기능을 수행하는 버튼을 눌렀을 때 기능이 수행되고 있음에도 시각적으로 알 수가 없다면 실행되지 않았다고 생각하고 동일 기능을 반복, 연속해서 실행시키게 되면 작업의 과부하로 인해 ANR이 발생될 수도 있고, 아예 프로그램 자체를 꺼버리거나 문제가 있다고 생각할 수 있기 때문이다.


지금까지는 ANR이 발생될만한 경우를 맞닥뜨려본 적이 없어서 ANR을 예방하는 설계를 해본 적은 없지만 이른바, '앱이 죽었다'라고 표현되는 이 문제는 사용자가 앱을 사용하는 데 있어서 불편함과 신뢰성에 직결되는 문제라고 생각하기 때문에 앞으로의 프로젝트에선 염두에 두고 작업할 수 있으면 좋겠다.


https://developer.android.com/topic/performance/vitals/anr?hl=ko 

 

ANR  |  Android 개발자  |  Android Developers

ANR 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱의 UI 스레드가 너무 오랫동안 차단되면 'ANR(애플리케이션 응답 없음)' 오류가 트리거됩니다. 앱이

developer.android.com

https://developer.android.com/guide/components/processes-and-threads?hl=ko 

 

프로세스 및 스레드 개요  |  Android 개발자  |  Android Developers

프로세스 및 스레드 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 애플리케이션 구성 요소가 시작되고 애플리케이션에 실행 중인 다른 구성 요소가

developer.android.com

https://itmining.tistory.com/3

 

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

이 글은 PC 버전 TISTORY에 최적화 되어있습니다. 서론 안드로이드 앱을 구현하여 돌리다보면, 또는 플레이스토어에 올라온 앱임에도 불구하고, 앱의 중지를 알리는 메시지를 심심치 않게 봤을 것

itmining.tistory.com

https://recipes4dev.tistory.com/143

 

안드로이드 스레드(Android Thread)

1. 스레드(Thread), 그리고 프로그램(Program)과 프로세스(Process). 스레드(Thread)를 설명하는 이 문장을 읽고 나서, 어떤 용어 또는 개념들이 머리 속에서 확장되나요? 스레드(Thread)라는 단어를 듣는 것

recipes4dev.tistory.com

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기