• 이슈

    • android 앱을 사용 중 홈버튼 클릭 후 백그라운드 이동한 후 다시 앱을 키려고하면 앱 크래시 발생
  • 원인

    1. 앱 background 이동 시 android에서 마지막 상태를 savedInstanceState를 활용하여 저장
    2. 앱 foreground 이동 시 android os에서 JS엔진의 명령이 오기전에 네이티브 영역에서 저장된 화면 복구 시도
    3. react-native-screens 측에서 화면 생성 시 JS통제를 받아서 생성해야 하는데 fragment의 주체가 js엔진이 아니라는것을 감지할경우 throw IllegalStateException 발생하여 앱 크래시
    • RAM 용량에 따른 크래시 발생 상이한 이유
      • RAM 여유가 있을경우 background 이동 시 화면 자체를 그대로 보관하여 foreground로 돌아올경우 그대로 화면을 노출
      • RAM 여유가 없는 경우 backgrond 이동 시 LMK에서 ‘설계도’만 남기고 화면 자체는 제거 후 다시 복귀 시 화면을 다시그리려고할 때 주도권에 의해 충돌 발생
  • 해결

    • MainActivity.kt
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(null)
        }
    
    • onCreate에 null을 넘겨줄경우 android에서 화면상태를 복구하지않겠다는 뜻
    • 즉, 주도권이 RN(JS)에 가도록 설정
  • 결론

    • RN은 JS엔진의 명령으로 네이티브가 동작하는 구조인데 이를 무시하고 native에서 화면을 그리려고 하니 예외 오류가 발생하는것

    • iOS에서는 native에서 강제로 복구려하고 들지않고 RN측에서 JS단에서 기억하는 화면정보를 활용하여 iOS native에 화면생성 명령이 가능한 형태로 이슈가 없는 상태

      구분 android iOS
      복구 주도 android OS가 가로챔 JS엔진(RN)이 끝까지 주도
      명령 네이티브와 JS 서로 충돌 JS에서 네이티브에 명령
      결과 크래시 정상작동