ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ANR이란
    안드로이드 학습/Android 기술면접 대비 2023. 6. 12. 10:31

    ANR이란 ?? 

    ANR(Application Not Responding)은 안드로이드 운영 체제에서 발생하는 오류 상태를 나타냅니다. 안드로이드 애플리케이션이 일시적으로 응답하지 않고 멈춰있는 상태를 의미합니다.

    ANR이 발생하는 상황 :

    Android에서는 Activity Manager 및 Window Manager 시스템 서비스에서 애플리케이션 응답성을 모니터링합니다. Android는 다음 조건 중 하나를 감지하면 애플리케이션에 대해 ANR 대화상자를 표시합니다.

     

    • 입력 이벤트: 앱이 입력 이벤트(예: 키 누름 또는 화면 터치)에 5초 이내에 응답하지 않은 경우 (5초)
      • 키 이벤트인 볼륨, 메뉴, 백 키의 경우는 눌리고서 5초 이상 지연 시 바로 ANR을 발생시킨다.
      • 터치 이벤트는 경우가 다르다. 한번 터치로 바로 ANR이 발생하지 않는다. 첫번째 터치 이후 터치 이벤트가 왔을 떄는 전달되지 않는 시간이 타임아웃되면 ANR이 발생한다.
    • 서비스 (Background Service, Foreground Service)
      • (Background Service) 서비스 실행: 앱에서 선언한 서비스가 몇 초 이내에 Service.onCreate() 및 Service.onStartCommand() / Service.onBind() 실행을 완료할 수 없는 경우
      • (Foreground Service) Service.startForeground()가 호출되지 않음: 앱이 Context.startForegroundService()를 사용하여 포그라운드에서 새 서비스를 시작했지만 서비스가 5초 내에 startForeground()를 호출하지 않은 경우
    • 인텐트 브로드캐스트: (5초)
      • BroadcastReceiver가 설정된 시간 내에 실행을 완료하지 못한 경우. 앱에 포그라운드 활동이 있는 경우 이 제한 시간은 5초입니다.  Broadcast Receiver는 onReceive 메소드는 메인스레드에서 실행되므로 5초이내에 처리가 완료되어야 한다.
    • JobScheduler 상호작용: 
      • JobService가 몇 초 이내에 JobService.onStartJob() 또는 JobService.onStopJob()에서 반환되지 않거나 
      • 사용자 시작 작업이 시작되고 JobService.onStartJob()이 호출된 후 몇 초 이내에 앱이 JobService.setNotification()을 호출하지 않는 경우.
      • Android 13 및 이전 버전을 타겟팅하는 앱의 경우 ANR이 음소거되고 앱에 보고되지 않습니다. Android 14 및 이후 버전을 타겟팅하는 앱의 경우 ANR이 명시적이고 앱에 보고됩니다.

     

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

     

     

    보통 ANR이 발동되는 경우가 MainThread(UI Thread)에서 너무 많은 작업(네트워크, 파일 읽기/쓰기, 소켓 등)을 할 때 입니다. (네트워크가 안좋은 환경에서 가져올때)

     

    화면에 UI를 그리는것은 메인쓰레드만 할 수 있는 작업으로 메인쓰레드에 많은 작업을 부여하면 UI를 그리지 못하고 유저와 상호작용을 하지 못해 ANR이 발생합니다.

     

    더보기
    여기서 메인쓰레드에 부과될 많은 작업이란 :
    1. 복잡한 계산: 메인 스레드에서 긴 반복문이나 복잡한 계산 작업을 수행하는 경우, 이 작업이 완료될 때까지 UI 업데이트가 차단될 수 있습니다.
    2. 네트워크 요청: 메인 스레드에서 네트워크 요청을 수행하는 경우, 서버 응답을 기다리는 동안 UI 업데이트가 지연될 수 있습니다. 특히 응답 시간이 긴 경우에는 ANR이 발생할 수 있습니다.
    3. 데이터베이스 작업: 메인 스레드에서 데이터베이스 작업을 수행하는 경우, 큰 데이터셋을 로딩하거나 복잡한 쿼리를 실행하는 동안 UI 업데이트가 지연될 수 있습니다.
    4. 파일 입출력: 메인 스레드에서 파일 입출력 작업을 수행하는 경우, 파일의 크기가 크거나 파일 시스템 작업이 지연되면 UI 업데이트가 차단될 수 있습니다.
    5. 이미지 렌더링: 메인 스레드에서 많은 양의 이미지를 로드하거나 복잡한 이미지 처리를 수행하는 경우, UI 업데이트가 지연되고 ANR이 발생할 수 있습니다.

    ANR을 예방 및 피하는 방법

    • Main Thread에 시간이 많이 걸리는 작업 X
    • 네트워크나 데이터베이스 작업과 같이 장기 실행 가능성이 있는 작업이나 비트맵 크기 조정과 같이 계산이 많이 필요한 작업은 Worker Thread에서 비동기 방식으로 실행해야 합니다.
    • BroadcastReceiver의 경우에는 오래 걸리는 작업이 있다면 Service로 넘겨 실행해야 하고, Service에서도 역시 오래 걸리는 작업인 경우 별도의 백그라운드 쓰레드를 이용해야 한다.
    • 사용자에게 프로그레스바 등을 이용해 작업의 진행 과정을 안내해 기다리도록 한다.

    참고 문헌: https://developer.android.com/training/articles/perf-anr?hl=ko#kotlin

     

     

    '안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글

    Jetpack - AAC  (0) 2023.06.13
    Activity와 Fragment 그리고 생명주기  (0) 2023.06.12
    Android Service  (0) 2023.06.12
    Android 런타임 ART 및 Dalvik  (0) 2023.06.05
    안드로이드 참고할한 링크들  (0) 2023.05.29
Designed by Tistory.