Ear Alarm 서비스를 1.5.2 버전 업데이트를 한 이후, Firebase Crashlytics와 Play Console에서 NavHost와 관련된 오류를 확인할 수 있었습니다. 출시 이후에 처음으로 발견된 오류로 비정상 종료를 발생시키는 치명적인 오류로 확인하고 대응해야 했습니다.
Firebase Crashlytics에서 확인할 수 있듯이 세션을 시작하고 5초 이내에 발생했다는 것도 확인할 수 있었습니다.
Fatal Exception: java.lang.IllegalStateException
Restoring the Navigation back stack failed: destination 200282259 cannot be found from the current destination ComposeNavGraph(0x0) startDestination={Destination(0xf2c5eda) route=com.dev.earalarm.core.navigation.Route.Timer}
1.5.2 버전을 개발하면서 전체적으로 모듈화와 더불어 Compose Navigation을 적용하였고 여기서 문제가 발생한 것 같습니다.
에러 메시지를 살펴보면 내비게이션 상태를 복원할 때 발생하는 문제로 백 스택을 복원하려고 할 때, 화면을 현재 내비게이션 그래프에서 찾을 수 없어서 발생한 오류로 파악하였습니다.
디버그 하면서 왜 내비게이션 그래프에서 현재 화면을 찾을 수 없는지 이해할 수 없었습니다.
발생한 오류의 로그를 살펴보면 꽤 장시간 알람을 설정한 상태에서 알림이 울리고, 앱을 실행했을 때 발생할 가능성이 높은 것으로 파악하였습니다. 오류를 재현해 보기 위해 비슷한 시간을 설정해서 테스트를 해보았지만 오류를 재현할 수 없었습니다.
오류에 대해 찾아보던 중, 구글 이슈 트래커에서도 비슷한 이슈를 찾을 수 있었습니다. 프로세스 종류 후 복원 과정에서 문제가 발생한다는 것을 알 수 있었습니다.
이는 알람을 맞춰놓은 상태에서 앱을 백그라운드로 돌려놓고 프로세스가 죽은 상태에서 다시 앱을 실행시켰을 때 발생할 수 있는 오류 시나리오와 딱 맞아떨어졌습니다.
테스트 기기에서 개발자 옵션을 통해 백그라운드 프로세스 수를 제한해 두고,
앱을 실행시킨 후 앱을 백그라운드 상태로 전환시키고, 다른 앱을 실행시키면서 현재 앱의 프로세스가 죽은 이후 다시 앱을 실행시켜 보면서 오류를 재현할 수 있었습니다.
이슈 트래커에 올라온 Compose Navigation의 버전은 2.8.0-beta01이었고, 프로젝트에서 사용하고 있던 버전은 2.8.0.-beta02 버전이었습니다.
해당 이슈는 이미 해결된 이슈로, destination ID의 문제인 버그로 발생한 문제였습니다.
기존 버전에서는 destination ID의 생성 방식이 hashcode() 기반으로 생성되었지만, 이 hashcode() 메서드가 반환하는 값은 앱의 프로세스가 종료되고 다시 시작될 때 동일성이 보장되지 않았습니다.
그렇기 때문에 프로세스가 종료되고 다시 시작될 때, destination ID가 일치하지 않아 백 스택에서 찾을 수 없고 이로 인해 오류가 발생한 것이었습니다. 현재는 destination ID를 생성하는 hash 알고리즘을 수정하여 버그가 고쳐진 상태입니다.
Navigation 공식문서를 참고하여 버전 2.8.0-beta04부터 해당 문제가 해결되었음을 확인할 수 있었습니다..
Compose Navigation 버전을 최신버전으로 업데이트하면서 해당 오류를 수정할 수 있었습니다.
마무리
개발과정과 테스트 과정에서는 계속 앱을 활성 상태로 두고 개발을 진행하다 보니, 프로세스 종료 후 복원되는 과정에서 발생하는 문제를 파악하는 것은 쉽지 않았던 것 같습니다.
그렇기 때문에 출시 이후 실제로 사용자들이 사용하는 과정에서 발견되는 문제에 대해서 빠르게 대응하는 것이 더 중요한 것 같고, 이런 부분이 앱을 출시하는 과정에서 겪는 어려움 중 하나라고 생각합니다.
참고자료
https://issuetracker.google.com/issues/341801005
Google Issue Tracker
issuetracker.google.com
https://github.com/hellosagar/PlayInfo/issues/14
Crash when reopening app after process death if using typed navigation · Issue #14 · hellosagar/PlayInfo
I've tested the app's behaviour using typed navigation. I've also discovered that it crashes after the death process when reopening the app. I tested this on API 33 and API 30 emulators. You can fi...
github.com
https://android-review.googlesource.com/c/platform/frameworks/support/+/3132936
https://android-review.googlesource.com/c/platform/frameworks/support/+/3132936
android-review.googlesource.com
https://developer.android.com/jetpack/androidx/releases/navigation?hl=ko#2.8.0-beta04
탐색 | Jetpack | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 탐색 Navigation은 Android 애플리케이션 내에서 '대상' 사
developer.android.com
'Project > Ear Alarm' 카테고리의 다른 글
Attempting to launch an unregistered ActivityResultLauncher with contract (0) | 2025.05.24 |
---|---|
Google Play In-App updates 연결하기 (0) | 2025.05.21 |
Google Play In-App Review API 연결하기 (1) | 2025.05.19 |
타이머 서비스 분석 및 알람 로직 개선 (0) | 2025.03.31 |