피드로 돌아가기
Dev.toFrontend
원문 읽기
메인 스레드 블로킹 제거를 통한 ANR 발생률 2.1%에서 0.08%로 개선
Eliminating Android ANRs in Production
AI 요약
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 도입으로 메인 스레드 점유 감시