naveridlogin-sdk-android icon indicating copy to clipboard operation
naveridlogin-sdk-android copied to clipboard

SDK v5.1.0 kotlin.UninitializedPropertyAccessException

Open JaehoJu opened this issue 2 years ago • 0 comments

안녕하세요.

네아로 SDK v5.1.0 버전에서 kotlin.UninitializedPropertyAccessException 이 발생합니다.

Caused by kotlin.UninitializedPropertyAccessException: lateinit property context has not been initialized
       at com.navercorp.nid.oauth.EncryptedPreferences.init(EncryptedPreferences.kt:33)
       at com.navercorp.nid.oauth.EncryptedPreferences.access$init(EncryptedPreferences.kt:16)
       at com.navercorp.nid.oauth.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:28)
       at com.navercorp.nid.oauth.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:27)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.oauth.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:27)
       at com.navercorp.nid.oauth.EncryptedPreferences.get(EncryptedPreferences.kt:84)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:53)
       at com.navercorp.nid.oauth.NidOAuthBridgeActivity.initData(NidOAuthBridgeActivity.kt:45)
       at com.navercorp.nid.oauth.NidOAuthBridgeActivity.onCreate(NidOAuthBridgeActivity.kt:75)
       at android.app.Activity.performCreate(Activity.java:8054)
       at android.app.Activity.performCreate(Activity.java:8034)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3688)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:7870)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

분석해본 결과 EncryptedPreferences 클래스에 정의된 lateinit 코드로 인해 크래시가 발생하는 것으로 보입니다.

object EncryptedPreferences {
    private lateinit var context: Context
}

찾아낸 재현 조건은 다음과 같습니다.

  • 메모리 부족으로 인해 앱 프로세스 종료

재현 경로

  1. 서비스 앱 실행 -> 네아로 버튼 클릭으로 네이버 로그인 페이지로 이동 (이때 서비스 앱의 activity 는 onPause 상태로 변경)
  2. (조건) 이후 메모리 부족으로 서비스 앱의 프로세스가 종료된 경우
  3. 네이버 로그인 페이지에서 로그인 요청 및 취소를 통해 서비스 앱으로 복귀
  4. 서비스 앱이 재생성되며 네아로 SDK 에 포함된 클래스 EncryptedPreferences 객체도 재생성 (context 값이 없어짐)
  5. 네아로 SDK 관련 코드 흐름 (위 스택 참고) 에서 context 에 접근하며 크래시 발생

예상 해결 방안

  • lateinit 으로 선언된 context 로부터 kotlin.UninitializedPropertyAccessException 가 발생하지 않도록 값을 초기화할 수 있는 기회를 제공해야 할 것 같습니다.

참고

  • 이 이슈는 https://github.com/naver/naveridlogin-sdk-android/issues/40 와 동일한 이슈일 수 있습니다.

감사합니다.

JaehoJu avatar Jun 23 '22 09:06 JaehoJu