진행중이던 사이드 프로젝트 내부 테스트를 위해 번들 빌드 후에 배포했는데, 소셜 로그인 관련 난독화 문제가 발생했다.
대부분의 API나 라이브러리들 또한 난독화가 적용되어 있어서 디버깅이 쉽지는 않다.
이전에도 비슷한 문제가 몇번 발생해서 기록해야지 다짐만하고 까먹어서 이번에는 적어본다.
모든 이슈들은 디버그 빌드에서는 발생하지 않던 문제이므로, 무조건 난독화 관련 문제일 것이라고 예상하고
다른 블로그들을 참고해서 난독화 설정 파일만 계속 수정했으나, 해결되지 않았다.
1. 카카오 로그인 UserApi.checkAccessToken
로그만 보고 카카오 소셜 로그인 SDK 관련 난독화 문제일 줄 알았지만 로그와 내부 코드를 뜯어보니 내부에서 Retrofit2의 CallAdapter를 사용하고 있었고, 레트로핏 공식 Proguard 문서를 참고해서 난독화 설정을 수정하여 해결할 수 있었다.
FATAL EXCEPTION: main
Process: com.applemango.runnerbe, PID: 17151
at el.o.b(Unknown Source:2725)
at el.p0.c(Unknown Source:24)
at h9.k.invoke(Unknown Source:250)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy3.checkAccessToken(Unknown Source)
at com.kakao.sdk.user.UserApiClient.checkAccessToken$user_release(Unknown Source:7)
at com.kakao.sdk.user.AppLifecycleObserver.onStateChanged(Unknown Source:46)
at androidx.lifecycle.a0.a(Unknown Source:22)
at androidx.lifecycle.b0.h(Unknown Source:320)
at androidx.lifecycle.b0.f(Unknown Source:34)
at androidx.lifecycle.b0.e(Unknown Source:14)
at androidx.lifecycle.n0.onActivityPostStarted(Unknown Source:23)
at android.app.Activity.dispatchActivityPostStarted(Activity.java:1420)
at android.app.Activity.performStart(Activity.java:8352)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4136)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
2. 네아로 no_catagorized_error
앱 크러시를 해결한 후에, 이번에는 네이버 소셜 로그인 관련 난독화 문제가 발생했다.
소셜 로그인 버튼을 클릭하면 no_catagorized_error가 발생하는 문제였다.
동일한 문제가 발생한 사람에게 sdk 버전이 낮아서 그런 것이라는 네이버 측의 답변을 보고,
네아로 버전 업데이트 공식 문서 를 따라 버전을 업데이트 했다.
3. 네아로 난독화 문제
더 이상 no_catagorized_error는 발생하지 않았으나, 네이버 소셜 로그인 콜백 이후에 앱이 크래시되는 현상이 발생했다.
네아로 Proguard 공식 문서에 따라 난독화 설정을 수정하여 해결했다.
FATAL EXCEPTION: main
Process: com.applemango.runnerbe, PID: 20823
java.lang.ClassCastException
at ac.i7.B(Unknown Source:5)
at e0.f.a(Unknown Source:323)
at kotlinx.coroutines.flow.z.a(Unknown Source:60)
at kotlinx.coroutines.h0.O(Unknown Source:140)
at kotlinx.coroutines.flow.m.l(Unknown Source:11)
at fj.a.n(Unknown Source:8)
at kotlinx.coroutines.o0.run(Unknown Source:102)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8751)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
최종 proguard-rules.pro
# Retrofit
-keepattributes Signature, InnerClasses, EnclosingMethod
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
-keepattributes AnnotationDefault
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* <methods>;
}
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface <1>
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface * extends <1>
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>
-keep,allowobfuscation,allowshrinking class retrofit2.Response
# OkHttp
-keep class okhttp3.Callback { *; }
# Gson
-keep class com.google.gson.**Model { *; }
-keepclassmembers class * {
@com.google.gson.annotations.SerializedName <fields>;
}
-keep class * extends com.google.gson.TypeAdapter { *; }
# Parcelize
-keep @kotlinx.parcelize.Parcelize class * { *; }
. . . . .
# Kakao login
-keep class com.kakao.sdk.**.model.* { <fields>; }
# Naver login
-keep class com.navercorp.nid.oauth.** { *; }
-keep class com.navercorp.nid.profile.data.** { *; }
# Coroutine
-keep class kotlinx.coroutines.** { *; }
# Dagger Hilt
-keep class dagger.hilt.** { *; }
'개발 > 트러블슈팅' 카테고리의 다른 글
[안드로이드] 채팅 기능 메시지 그룹화 로직 개선 (0) | 2024.11.19 |
---|---|
[안드로이드] 안드로이드 스튜디오 PluginException (0) | 2023.11.10 |
[안드로이드] Jetpack compose dependency 설정 (0) | 2023.07.11 |
[안드로이드] FragmentContainerView NullPointerException 해결 (0) | 2023.05.27 |
[안드로이드] is not abstract and does not implement abstract member public abstract fun getActionId() 오류 (0) | 2023.04.17 |