Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

앱 실행 직후 종종 crash 발생 - llegalStateException: Session is not initialized. Call KakaoSDK#init first. #91

Closed
warmherz opened this issue Dec 16, 2019 · 31 comments · Fixed by #126
Assignees

Comments

@warmherz
Copy link
Contributor

warmherz commented Dec 16, 2019

Version of kakao-login libraries

2.1.2 에 Kakao SDK 1.25.0 버전을 사용합니다.

Version of react-native

0.61.4

Platforms you faced the error (IOS or Android or both?)

Android

Expected behavior

앱 실행 후 스플래쉬 화면 진입

Actual behavior

항상 그런 건 아니지만 너무나 자주 앱 실행 시 아래와 같은 예외가 발생합니다.

Fatal Exception: java.lang.RuntimeException: Unable to resume activity {com....MainActivity}: java.lang.IllegalStateException: Session is not initialized. Call KakaoSDK#init first.
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4016)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4048)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1950)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7073)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Caused by java.lang.IllegalStateException: Session is not initialized. Call KakaoSDK#init first.
at com.kakao.auth.Session.getCurrentSession(Session.java:111)
at com.kakao.auth.KakaoSDK$1.onActivityResumed(KakaoSDK.java:69)
at android.app.Application.dispatchActivityResumed(Application.java:264)
at android.app.Activity.onResume(Activity.java:1403)
at androidx.fragment.app.FragmentActivity.onResume(FragmentActivity.java:514)
at com.facebook.react.ReactActivity.onResume(ReactActivity.java:55)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)

Tested environment (Emulator? Real Device?)

Real device 이며 갤 S8, 갤노트8 등 다양한 기종에서 발생하고 있습니다.

@warmherz
Copy link
Contributor Author

kakao sdk 버전 확인 중에 제 gradle.properties 파일에 KAKAO_SDK_VERSION=1.14.0 가 포함되어 있었네요. 이걸 지우고 확인해보겠습니다.

@warmherz
Copy link
Contributor Author

지우고 새로 빌드한 후에도 여전히 crash 가 발생합니다.

@warmherz
Copy link
Contributor Author

manual install 로 전환하니 해당 문제가 안 나타납니다. 같은 문제를 겪는 분들은 참고하세요~

@heyman333
Copy link
Contributor

heyman333 commented Dec 17, 2019

@warmherz 피드백 감사합니다.혹시 크래쉬의 원인으로 의심되는 부분이 있나요?

https://devtalk.kakao.com/t/session/19450 이 글이 관계가 있는거같은데
간헐적으로 발생하는점이 이상하네요ㅎㅎ

@warmherz
Copy link
Contributor Author

@heyman333 KakaoSDK.init(...) 이 호출되는 타이밍이 link 방법에 따라서, 그리고 폰에 따라서 미묘하게 늦어지는 경우가 있는 것 같습니다.

@heyman333
Copy link
Contributor

@warmherz 네 한번 테스트 해보겠습니다. 감사합니다.

@heyman333 heyman333 self-assigned this Dec 26, 2019
@heyman333
Copy link
Contributor

아마 빌드환경에 따른 버그인것 가테요 ... 문제 재현이 힘들어서 클로즈하겠습니다 ㅠㅠ

@journeyWorker
Copy link
Contributor

journeyWorker commented Jan 15, 2020

@warmherz
mainApplication onCreate() 함수 밑에 아래 코드를 추가해보세용.

// mainApplication.java
    if (KakaoSDK.getAdapter() == null) {
      KakaoSDK.init(new KakaoSDKAdapter(getApplicationContext()));
    }

아래 패키지들도 추가로 import 해주시구요.

import com.kakao.auth.KakaoSDK;
import com.dooboolab.kakaologins.KakaoSDKAdapter;

위 코드추가로 이슈가 해결이 안되시면 react-native-kakao-login 에 RNkakaoLoginModules.java 에 아래 코드까지 추가해보세요.

@Override
     public void onHostResume() {
      if (KakaoSDK.getAdapter() == null) {
        KakaoSDK.init(new KakaoSDKAdapter(reactContext.getApplicationContext()));
        reactContext.addActivityEventListener(this);
        callback = new SessionCallback();
        Session.getCurrentSession().addCallback(callback);
        Session.getCurrentSession().checkAndImplicitOpen();
      }
     }

@warmherz
Copy link
Contributor Author

가이드해주셔서 정말 감사합니다.
manual install 로 전환하면서 RNKakaoLoginsPackage 를 가장 먼저 생성해주니 문제가 나타나지 않았던 것 같습니다. 가이드해주신 방법도 참고하도록 하겠습니다!

@keepcosmos
Copy link

keepcosmos commented Jan 21, 2020

2.2.0 버전에서 똑같은 현상발생합니다. 이슈 다시 오픈해주실 수 있나요?

@warmherz 혹시 initialize에 영향을 주는 다른 네이티브 모듈 쓰고 계신게 있나요?

@heyman333
Copy link
Contributor

@keepcosmos 네 다시 오픈할게요.
@HwangJJung 님의 제안대로 코드를 수정해도 문제가 발생하나요?

@heyman333 heyman333 reopened this Jan 21, 2020
@keepcosmos
Copy link

@heyman333 @HwangJJung 님이 제안해준 코드가 해결책은 맞습니다.
하지만 근본적으로, 카카오 네이티브 모듈이 초기화 되어 패키지로 등록되기 전에 다른 네이티브 모듈이 쓰레드를 생성하여 resume시키는 문제였습니다.

별도 쓰레드에서 resume시켰기 때문에, 경우에 따라서 KakaoSDK의 getSession 호출시 오류가 발생하였습니다.

해당 라이브러리는 react-native-splash-screen이었어요. 감사합니다.

@heyman333 heyman333 pinned this issue Jan 27, 2020
@warmherz
Copy link
Contributor Author

@keepcosmos react-native-splash-screen 를 쓰고 있습니다.
resume 시켰다는 것이 무슨 의미인가요? 좀더 자세히 설명해주실 수 있을까요?
아무튼 그런 문제가 있었군요. 알려주셔서 감사합니다!

@keepcosmos
Copy link

@warmherz
일단 제가 RN도 처음이고, 안드로이드에 대한 지식이 거의 없기 때문에 제 설명이 정확한지 모르겠으나,

KakaoSDK 에서 안드로이드 액티비티 생명주기 중에, onResume 단계에서 session을 확인하고 설정되어있지 않으면 예외를 발생시킵니다.
그런데, RN은 네이티브 모듈을 MainActivity의 onCreate 단계에서 초기화 시킵니다. 즉 onResume 단계에서 session 문제가 생길리가 없을겁니다.

허나 react-native-splash-screen은 별도의 activity 스레드를 만드는 것으로 보입니다. 아마 show 메서드를 호출할 때일텐데요,

SplashScreen.show(this);
super.onCreate(savedInstanceState);

아마 MainActivity.java 에 저렇게 설정하셨을거에요. 즉, show메서드가 생성한 스레드가 만든 activity가 resume단계에 들어설 때, MainActivity의 KakaoSDK가 초기화 되지 않았다면 문제가 발생합니다.

super.onCreate(savedInstanceState);
SplashScreen.show(this);

이렇게 순서를 바꾸어 해결하였습니다.

다시 한 번 참고로, 저는 안드로이드도 자바도 RN도 익숙하지 않아서 위 설명이 정확하지 않을 수 있습니다.

@Dngel
Copy link

Dngel commented Feb 6, 2020

@HwangJJung

해당 메뉴얼대로 작업중에

error: can
not find symbol
import com.kakao.auth.KakaoSDK;
^
symbol: class KakaoSDK
location: package com.kakao.auth

에러가 발생하네요..
buildToolsVersion = "28.0.3"
minSdkVersion = 16
compileSdkVersion = 28
targetSdkVersion = 28
supportLibVersion = '28.0.0'
입니다.

해당모듈은 수동으로 설치해야하나요? rn버전이 0.62라 오토링크로 설치되었는데 설치시에 해당모듈들이 자동으로 링크되는건가요?

@heyman333
Copy link
Contributor

@Dngel 네 오토링크로 설치가 되므로 특별하게 메뉴얼 설치가 필요하신 경우가 아니라면 자동으로 설치 됩니다.

@JongGyuChoi
Copy link

저도 같은 에러가 나서 메뉴얼 인스톨로 해봐도 똑같네요 ㅜㅜ 위에 RNKakaoLoginsPackage 를 먼저 생성해주니 개선되었다는 글이 있던데 어떻게 먼저 생성하도록 수정 할 수 있을까요??

@JongGyuChoi
Copy link

@warmherz
mainApplication onCreate() 함수 밑에 아래 코드를 추가해보세용.

// mainApplication.java
    if (KakaoSDK.getAdapter() == null) {
      KakaoSDK.init(new KakaoSDKAdapter(getApplicationContext()));
    }

아래 패키지들도 추가로 import 해주시구요.

import com.kakao.auth.KakaoSDK;
import com.dooboolab.kakaologins.KakaoSDKAdapter;

위 코드추가로 이슈가 해결이 안되시면 react-native-kakao-login 에 RNkakaoLoginModules.java 에 아래 코드까지 추가해보세요.

@Override
     public void onHostResume() {
      if (KakaoSDK.getAdapter() == null) {
        KakaoSDK.init(new KakaoSDKAdapter(reactContext.getApplicationContext()));
        reactContext.addActivityEventListener(this);
        callback = new SessionCallback();
        Session.getCurrentSession().addCallback(callback);
        Session.getCurrentSession().checkAndImplicitOpen();
      }
     }

이 가이드를 따라서 빌드시 com.kakao.auth.KakaoSDK를 못 읽어서 오류가 납니다
sdk를 수동 설치 해주어야 하나요?

@heyman333
Copy link
Contributor

@JongGyuChoi @Dngel
https://github.com/react-native-seoul/react-native-kakao-login#android-1
여기까지 작업하기고
sync gradle 해보실래요?

@JongGyuChoi
Copy link

@JongGyuChoi @Dngel
https://github.com/react-native-seoul/react-native-kakao-login#android-1
여기까지 작업하기고
sync gradle 해보실래요?

오토링크로 말씀이신가요? 아니면 메뉴얼 인스톨인가요?

@heyman333
Copy link
Contributor

@JongGyuChoi @Dngel
https://github.com/react-native-seoul/react-native-kakao-login#android-1
여기까지 작업하기고
sync gradle 해보실래요?

오토링크로 말씀이신가요? 아니면 메뉴얼 인스톨인가요?

오토로 진행하셔도 됩니다!

@pyeonjaesik
Copy link

@heyman333 @HwangJJung 저도 com.kakao.auth.KakaoSDK를 못 읽어서 오류가 납니다
이경우 어떻게 해결하면 좋을까요?

@pyeonjaesik
Copy link

@warmherz 어떻게 해결하셨는지 좀만 더 자세히 여쭤볼 수 있을까요??

@pyeonjaesik
Copy link

@Dngel 해결하셨나용??

@koalagon
Copy link
Contributor

onHostResume 구현 후에도 여전히 발생합니다. 아마 Session 객체와 라이프 사이클하고 연관이 있을 것 같은데요, 자체 테스트 후 PR 올려볼께요

@heyman333
Copy link
Contributor

@koalagon 감사합니다 😙

@koalagon
Copy link
Contributor

간헐적 문제라 확인할 방법은 없지만, 일단 PR은 올렸습니다.
라이프사이클 이벤트 리스너가 빠져있더군요. 이슈가 해결되면 좋겠네요.

@kosick
Copy link

kosick commented May 27, 2020

버젼 2.4.5 에서 현재 재현되는듯 합니다 ㅠ. (Crashlytics 에 고객 기기들 로그)
위에 mainApplication.java 관련된 코드는 아직 넣어보진 않았습니다. 업데이트 후 재현되는지 확인해보겠습니다.

@heyman333
Copy link
Contributor

@kosick 감사합니다. 혹시 해결된다면 좀 알려주세요 ㅠㅠ

@kosick
Copy link

kosick commented Jun 4, 2020

@heyman333 드디어? ㅠㅠ 해결했습니다.
1줄 요약하면 HwangJJung 님이 쓰신 글대로 해서 해결을 했습니다.
위에 몇분들이 com.kakao.auth.KakaoSDK를 못 읽어서 오류가 난다고 써주셨는데요, 저도 이게 문제였습니다.
요게 어디서 com.kakao.auth.KakaoSDK 를 받아야하나 뭔가 링킹을 잘못했나 삽질하다가 카카오 안드로이드 문서를 봤는데요,
https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android-v1

여기에 Step 2.project/module 레벨의 build.gradle에 디펜던시 설정 부분이 있습니다.
dependencies { // 카카오 로그인 implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.27.0'
위의 코드를 /android/app/build.gradle 파일에 dependencies 부분에 넣어주니깐 KakaoSDK 가 import 되었습니다.

@Dngel
@JongGyuChoi
@pyeonjaesik

@koalagon
Copy link
Contributor

koalagon commented Jun 9, 2020

@kosick 감사합니다. 저번 PR로 onResume에서 exception 내는 것은 잡았는데, MainAppilcation인가에서 계속 같은 exception을 던져서 의아했는데, 이렇게 고치면 되겠네요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

9 participants