[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 유지
}
}
절차
- proguard-rules.pro 파일 열기 (없으면 새로 만들기)
- 위 Retrofit + OkHttp + Gson 규칙 통째로 붙여넣기
- Clean Project → Rebuild Project → 릴리즈 빌드 테스트
보너스: 왜 이 규칙이 필요한가?
- minifyEnabled true → R8이 클래스/메서드 이름 바꿈
- Retrofit은 리플렉션으로 인터페이스 분석 → 제네릭 타입 사라지면 인식 못 함
- 위 규칙으로 Retrofit 관련 클래스 보존 → 문제 해결



