naveridlogin-sdk-android
naveridlogin-sdk-android copied to clipboard
SDK v5.1.0 kotlin.UninitializedPropertyAccessException
안녕하세요.
네아로 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
}
찾아낸 재현 조건은 다음과 같습니다.
- 메모리 부족으로 인해 앱 프로세스 종료
재현 경로
- 서비스 앱 실행 -> 네아로 버튼 클릭으로 네이버 로그인 페이지로 이동 (이때 서비스 앱의 activity 는 onPause 상태로 변경)
- (조건) 이후 메모리 부족으로 서비스 앱의 프로세스가 종료된 경우
- 네이버 로그인 페이지에서 로그인 요청 및 취소를 통해 서비스 앱으로 복귀
- 서비스 앱이 재생성되며 네아로 SDK 에 포함된 클래스 EncryptedPreferences 객체도 재생성 (context 값이 없어짐)
- 네아로 SDK 관련 코드 흐름 (위 스택 참고) 에서 context 에 접근하며 크래시 발생
예상 해결 방안
- lateinit 으로 선언된 context 로부터 kotlin.UninitializedPropertyAccessException 가 발생하지 않도록 값을 초기화할 수 있는 기회를 제공해야 할 것 같습니다.
참고
- 이 이슈는 https://github.com/naver/naveridlogin-sdk-android/issues/40 와 동일한 이슈일 수 있습니다.
감사합니다.