-
[Android] isMinifyEnabled 사용 시 java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 에러Android📱/삽질 기록... 2023. 9. 15. 23:03
개발을 하던 중
디버그 모드에서는 잘 개발을 했는데
릴리즈로 빌드시에 java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType가 나고 callAdapter를 생성하지 못해서 retrofit이 데이터를 받아 오지 못해 터지는 현상을 겪었다.
사실 이번이 2번째인데 한 번은 과제 수행 중에 일어나서 급한 나머지 isMinifyEnabled를 false로 주고, 그냥 끝냈었는데
이번에는 시간이 조금 있어서 해결해 보고, 기록해 놓으려 한다.
같은 에러였는데 또 헤매다가 생각난 걸 보면 확실히 기록을 해놔야 할 거 같았다.
일단 문제의 원인은 isMinifyEnabled를 true 할 때 코드 축소화가 일어나는데 이때 어떤 객체의 코드가 지워지고, calladapter에서 ParameterizedType로 캐스트를 할 수 없게 되어 일어나는 일이었다.
나 같은 경우는 처음에 Flow와 CallAdapter만 계속 의심을 하다가
내가 만든 DTO까지 의심을 했었는데
결과적으로 Response 객체가 원인이었다.
ApiResponse라는 이름으로 sealed class를 만들어
Flow <ApiResponse <DTO>>>형식으로 매핑을 해놨는데
Flow와 ApiResponse가 축소화될 때 지워지면서 일어난 문제였다.
해결방법은 간단하다.
proguard-rules.pro 파일에 들어가서
-keep,allowobfuscation,allowshrinking class kotlinx.coroutines.flow.Flow -keep class my.app.path.response.**
위 코드를 추가해 주면 해결된다.
의심되는 객체를 잘 찾아야 하는데
그 과정이 조금 어려웠다.
덕분에 프로가드와 R8에 대해 처음으로 공부해보고 프로가드 룰도 이것저것 만져보는 기회가 되었다.
누군가에게 도움이 되면 좋겠다. ㅎㅎ
'Android📱 > 삽질 기록...' 카테고리의 다른 글
Android : 번들 관리의 중요성.... java.lang.RuntimeException:android.os.TransactionTooLargeException (0) 2024.02.09 [Android] Camera Preview가 준비됐는지 알아보기 (0) 2024.02.08 [Android] 화면 이동시 cannot be found from the current destination (0) 2023.08.28 [Android] popUpTo & popUpToInclusive (0) 2023.08.02 [Android] Oss-licenses 오픈소스 라이선스 표시하기 (2) 2023.05.19