본문 바로가기
Android

카카오 API Error 해결] Class not found when unmarshalling: com.kakao.sdk.auth.AuthCodeClient$resultReceiver$1 오류

by 김마리님 2021. 8. 31.

회사에서 볶아대던 통에 내부 테스트를 거치지 않고 앱이 올라갔다. 그런데 짜잔 없던 오류가 생겼습니다.

 

(이런 미친)

 

저번 버전까지만 잘 되던 카카오톡 로그인이, 분명 디버그apk도 잘 되던게 릴리즈 - 구글 앱 apk에서는 안된다.  

(왜???????)

 

왜??????? 하고 키 해시도 다시 변경하고 하면서 한참 똥꼬쇼하다 깨달았다

아이 진짜 정말(험한 말) 릴리즈 빌드 설정이 문제구나

 

이번에 앱 크기가 너무 커서(ㅋㅋ) 앱 크기를 줄인다고 

shrinkResources true

다음 코드를 적용한다고 코드 난독화를 실행한 것이 문제였다...(minifyEnabled true)

이 코드가 무엇이냐.. 이 코드는 앱 코드를 난독화시켜주는 명령어이다. 안드로이드 스튜디오는 이 난독화를 기본적으로 제공하지만, 기본 설정은 false이다.

그럼 난독화는 무엇이냐? 프로그램의 소스코드를 알아보기 힘들게 변경하는 기술이라고 생각하면 된다. 그런데 그 과정에 카카오 api도 같이 난독화 되는 것이 문제였다. 그래서 unmarshalling error이 발생된 것이다.

 

 

(이건 제 생각이고, 아닐수도 있습니다. 아주 쪼꼬만 지식이고 이것도 틀릴수 있습니다ㅎㅎ.

marshalling이라는건, 원격 호출을 위해서 개체를 직렬화할때 사용합니다. 직렬화 된 개체가 원격으로 전송되고, 거기서 unmarshalling을 통해 개체를 읽을 수 있는 형태로 다시 변환작업을 거칩니다. 그런데, 난독화 된 개체가 marshalling을 거치면서, 전송 이후에 개체를 읽을 주체가 unmarshalling을 실행했을 시, 해당 개체가 난독화 되어있기 때문에 해당 전송 내역을 인식하지 못하면서 다음 오류가 나는 것이 아닌가 추측합니다. 그럼, 카카오 api에 난독화 하지 않는다는 예외 조건을 proguard에서 설정한다면, marshalling - unmarshalling 과정에서의 난독화에 따른 문제가 일어나지 않을거라 생각합니다. 카카오에서 제시한 해결방식과도 부합합니다.)

 

예, 간단합니다. 프로가드 파일에 예외설정을 걸어주면 됩니다.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
            proguardFiles 'proguard-rules.pro'
        }
    }

 

프로가드 파일의 이름이 보일텝니다. 이 파일은 디폴트 프로가드 파일로, Gradle Script 파일에 기본적으로 탑재되어있습니다.

만약 api에 따라 프로가드 설정을 따로 관리하고 싶다면

proguardFiles 'proguard-rules.pro'

proguardFiles 'proguard-kakao.pro'

proguardFiles 'proguard-naver.pro'

이렇게 아랫줄에 늘려가면서 추가하면 되겠지요. 저는 따로 추가할 생각이 없으니, proguardFiles 'proguard-rules.pro' 이 파일에 다음과 같은 명령어를 아래에 추가합니다.

 

-keep class com.kakao.sdk.**.model.* { <fields>; }
-keep class * extends com.google.gson.TypeAdapter

 

(프로가드 공부한 내용은 다음에 정리하고, -keep 명령어가 코드 난독화, 축소에서 예외된다 생각하면 됩니다.)

다음 코드를 추가하면 놀랍게도 로그인이 됩니다..!

반응형