[Android] ANR

new Dean( );·2021년 11월 11일
1

안드로이드

목록 보기
2/2

android 공식문서 정리 및 번역 글..

ANR (Android Not Working)

Android 앱의 UI스레드가 오랫동안 차단되면 ANR(어플리케이션 응답 없음)오류가 트리거된다. ANR은 UI 업데이트를 담당하는 앱의 기본 스레드가 사용자의 입력 이벤트를 처리하지 못해 불만을 초래한다. 따라서 앱에 응답성을 설계하여 시스템이 사용자에게 ANR 대화상자를 표시하지 않도록 하는 것이 중요하다.

앱이 다른 작업을 수행하느라 입력 이벤트나 인텐트 브로드캐스트를 처리할 기회를 제공하지 않게 된다.

발생 원인

  • 앱이 입력 이벤트 또는 BroadcastReceiver에 5초 이내로 응답하지 않는 경우
    • 가장 나중에 입력된 이벤트 기준으로 5초 이내에 응답하지 않으면 발생한다.
    • 예를들어, 12시 00분 5초에 A이벤트 발생, 12시 00분 8초에 B이벤트가 발생했고 아무 응답이 없다면, 12시 00분 10초가 아닌 12시 00분 13초에 ANR이 발생한다!
      프로그램이 응답하지 않을 때, 입력을 한 번 더 하면 그제서야 '응답없음 대화상자'가 뜨는 이유다.
  • 포그라운드에 활동이 없을 때 BroadcastReceiver가 10초 내에 실행을 완료하지 못한 경우

ANR 피하는 방법

  • UI 스레드에서 실행되는 메서드는 가능한 한 작업을 적게 실행해야 한다.
    • 특히 activity는 onCreate()onResume()과 같은 주요 생명주기 메서드에서 처리하는 작업을 가능한 줄여야 한다. (라고 해석했습니다.)
    • 네트워크나 DB작업, 비트맵 크기 조정과 같이 긴 시간이 소요될 가능성이 있는 작업은 Worker thread에서 실행해야 한다. (db작업은 비동기식 요청으로)

그 외 응답성 강화 방법

일반적으로 100-200ms은 사용자가 앱의 속도 저하를 감지하는 임계값이다. 따라서 ANR을 피하고 앱이 적절한 속도로 사용자에게 응답하도록 하기 위해 추가적으로 할 작업은 다음과 같다.

  • 사용자 입력에 대한 응답으로 백그라운드 작업을 실행하는 경우 진행 상황을 보여준다. (ex. ProgressBar)
  • 앱의 초기 설정 단계가 있는 경우 Splash 화면을 표기하거나, 기본 화면을 가능한 빨리 렌더링하고 로딩중임을 나타내며 비동기로 화면을 채운다.
    (=> 네이버 기본앱의 메인화면이 검색창만 있는 것으로 바뀐 이유 중 하나라고 생각한다. 기본 화면을 가능한 빨리 렌더링하기)
  • 중요한 것은 어떤 경우든 앱이 멈추지 않았음을 사용자가 인지할 수 있게 진행 상황을 표시하는 것이다.
  • 성능 도구(Systrace, Traceview)를 사용하여 앱 응답성의 병목 현상을 확인한다.

참조

0개의 댓글