피드로 돌아가기
Eliminating Android ANRs in Production
Dev.toDev.to
Frontend

메인 스레드 블로킹 제거를 통한 ANR 발생률 2.1%에서 0.08%로 개선

Eliminating Android ANRs in Production

SoftwareDevs mvpfactory.io2026년 5월 8일4intermediate

Context

Android 앱의 메인 스레드 점유로 인한 ANR(Application Not Responding) 발생 빈도 증가. SharedPreferences의 지연 쓰기, Binder 버퍼 제한, BroadcastReceiver의 동기 처리 등 고질적인 메인 스레드 병목 지점 존재.

Technical Solution

  • Main-thread Watchdog 구현을 통한 런타임 스택 트레이스 캡처 및 ANR 조기 탐지 체계 구축
  • SharedPreferences.apply()의 lifecycle transition 시점 블로킹 문제를 해결하기 위한 Jetpack DataStore 마이그레이션
  • Binder Transaction Buffer의 1MB 제한을 회피하기 위해 100KB 초과 페이로드를 ContentProvider 기반 스트림 방식으로 전환
  • BroadcastReceiver의 10초 타임아웃 제약을 goAsync()와 Coroutines(Dispatchers.IO) 조합으로 확장하여 메인 스레드 즉시 해제
  • StrictMode 활성화를 통한 메인 스레드 내 디스크 I/O 및 네트워크 호출 강제 감지

Impact

  • ANR 발생률 2.1%에서 0.08%로 획기적 감소
  • 34개 SharedPreferences 파일의 안전한 DataStore 전환 완료

1. SharedPreferences.apply()를 DataStore로 대체하여 Lifecycle 블로킹 제거

2. Intent Extras 페이로드 크기를 100KB 이하로 제한하고 초과 시 ContentProvider 사용

3. BroadcastReceiver 내 무거운 작업은 goAsync() 및 IO Dispatcher 적용

4. Debug 빌드 내 StrictMode 및 Custom Watchdog 도입으로 메인 스레드 점유 감시

원문 읽기