피드로 돌아가기
Dev.toInfrastructure
원문 읽기
FCM Heartbeat 도입으로 Android Doze 모드 무력화 및 24/7 가동성 확보
I pushed my Android app to production. Then Android and the OEMs spent two weeks tearing it apart.
AI 요약
Context
고령자 대상 Safety-critical 앱 특성상 사용자 개입 없는 지속적 모니터링이 필수적인 상황. Android OS 및 OEM의 공격적인 Battery Optimization으로 인해 앱이 Deep Doze 상태에 진입하며 모든 내부 Recovery Layer(WorkManager, AlarmManager 등)가 무력화되는 병목 지점 발생.
Technical Solution
- GitHub Actions Cron을 활용한 6시간 주기 FCM Data Message 전송 체계 구축을 통한 외부 Wake-up 소스 확보
- 서버리스 아키텍처 구현을 위해 Device Token 대신 Topic Messaging을 채택하여 서버 상태 저장 비용 제거 및 Fan-out 효율 극대화
- Doze 모드에서도 즉시 실행 가능한 HIGH Priority Data Message를 사용하여 OS의 실행 제한 우회
- Android 14의 Foreground Service 제한 대응을 위해 FCM 핸들러 내에서 Expedited WorkManager Job을 큐잉하는 2단계 실행 구조 설계
- OEM별 예외 상황 대응을 위해 BuildConfig 기반의 Compile-time Kill Switch를 도입한 가역적 제어 경로 마련
- 매 Wake-up 시점에 Battery Optimization 및 Permission 상태를 재검증하는 Stateless 검증 로직 적용
실천 포인트
- Android 배경 작업 설계 시 내부 스케줄러에만 의존하지 말고 FCM 기반의 외부 트리거 경로 확보 검토 - Permission 및 Battery Exemption 상태를 일회성 설정이 아닌 런타임 시점에 지속적으로 재검증하는 로직 구현 - Silent Degradation 방지를 위해 앱 생존 여부가 아닌 '실제 기능 동작 여부'를 감시하는 자체 헬스체크 알림 체계 구축 - OS 버전 및 OEM 제조사별 정책 변화에 즉각 대응 가능한 기능별 Feature Flag 또는 Kill Switch 설계