Android프로그래밍

[Android] java.lang.IllegalArgumentException: Unable to create call adapter for interface retrofit2.Call, Caused by: java.lang.IllegalArgumentException: Call return type must be parameterized as Call or Call 오류 해결 방법

오류 내용 :

Process: com.jspsoft.garakprice, PID: 13589
                                                                                                    java.lang.IllegalArgumentException: Unable to create call adapter for interface retrofit2.Call
                                                                                                        for method ApiService.getRawData
                                                                                                    	at retrofit2.Utils.methodError(Utils.java:54)
                                                                                                    	at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:116)
                                                                                                    	at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:67)
                                                                                                    	at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39)
                                                                                                    	at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
                                                                                                    	at retrofit2.Retrofit$1.invoke(Retrofit.java:160)
                                                                                                    	at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
                                                                                                    	at $Proxy4.getRawData(Unknown Source)
                                                                                                    	at com.jspsoft.garakprice.PriceActivity.loadData(PriceActivity.java:1017)
                                                                                                    	at com.jspsoft.garakprice.PriceActivity.lambda$setupSearchButton$9(PriceActivity.java:625)
                                                                                                    	at com.jspsoft.garakprice.PriceActivity.$r8$lambda$5uPEBN_ib4GlLrYPt1_FKGE4QX8(PriceActivity.java:0)
                                                                                                    	at com.jspsoft.garakprice.PriceActivity$$ExternalSyntheticLambda0.onClick(R8$$SyntheticClass:0)
                                                                                                    	at android.view.View.performClick(View.java:8508)
                                                                                                    	at android.widget.TextView.performClick(TextView.java:18631)
                                                                                                    	at android.view.View.performClickInternal(View.java:8485)
                                                                                                    	at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
                                                                                                    	at android.view.View$PerformClick.run(View.java:33213)
                                                                                                    	at android.os.Handler.handleCallback(Handler.java:995)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:273)
                                                                                                    	at android.os.Looper.loop(Looper.java:363)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:10060)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
                                                                                                    Caused by: java.lang.IllegalArgumentException: Call return type must be parameterized as Call<Foo> or Call<? extends Foo>
                                                                                                    	at retrofit2.DefaultCallAdapterFactory.get(DefaultCallAdapterFactory.java:42)
                                                                                                    	at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:253)
                                                                                                    	at retrofit2.Retrofit.callAdapter(Retrofit.java:237)
                                                                                                    	at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:114)
                                                                                                    	... 23 more

minifyEnabled true로 바꾸자마자 발생하는 전형적인 Retrofit ProGuard/R8 오류이다.


에러 원인

R8/ProGuard가 Retrofit 인터페이스의 제네릭 타입을 난독화/제거해서 Call<String> 같은 타입이 Call로 바뀌어버림 → Retrofit이 인식 못 함.


해결하는 방법

proguard-rules.pro 파일에 이 코드

# Retrofit 보존 규칙 (이거 없으면 minifyEnabled true에서 무조건 죽음!)
-keepclassmembers class retrofit2.** { *; }
-keep interface retrofit2.** { *; }
-dontwarn retrofit2.**

# OkHttp
-keepclassmembers class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**

# Gson (JSON 파싱 사용시)
-keep class com.google.gson.** { *; }
-keep public class com.google.gson.** { public private protected *; }

# 당신 앱 모델 클래스 (PriceItem 등)
-keep class com.jspsoft.garakprice.model.** { *; }

# 일반적인 안전 규칙
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes InnerClasses
-keepattributes EnclosingMethod

build.gradle (app) 확인 (release 빌드 설정)

gradle

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false  // 디버그는 false 유지
    }
}

절차

  1. proguard-rules.pro 파일 열기 (없으면 새로 만들기)
  2. Retrofit + OkHttp + Gson 규칙 통째로 붙여넣기
  3. Clean Project → Rebuild Project → 릴리즈 빌드 테스트

보너스: 왜 이 규칙이 필요한가?

  • minifyEnabled true → R8이 클래스/메서드 이름 바꿈
  • Retrofit은 리플렉션으로 인터페이스 분석 → 제네릭 타입 사라지면 인식 못 함
  • 위 규칙으로 Retrofit 관련 클래스 보존 → 문제 해결

Hi, I’m 똘켓