应用发布至Play商店崩溃但Debug APK正常,调用Get API时出错
发布版APK调用Get API崩溃,Debug版正常问题解决
问题现象
安装发布版APK时,调用Get API接口时应用崩溃,Debug APK可正常运行。
环境配置
Gradle版本
id 'com.android.application' version '8.2.0' apply false id 'com.android.library' version '8.2.0' apply false
Retrofit版本
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.10'
错误日志
Exception java.lang.IllegalArgumentException: at retrofit2.Utils.methodError (Utils.java:1) at retrofit2.HttpServiceMethod.createCallAdapter (HttpServiceMethod.java:56) at retrofit2.HttpServiceMethod.parseAnnotations (HttpServiceMethod.java:56) at retrofit2.ServiceMethod.parseAnnotations (ServiceMethod.java:56) at retrofit2.Retrofit.loadServiceMethod (Retrofit.java:1) at retrofit2.Retrofit$1.invoke (Retrofit.java:40) at java.lang.reflect.Proxy.invoke (Proxy.java:1006) at $Proxy2.b at com.ezytracking.datasources.repo.LoginDataRepository.checkIsValidUser (LoginDataRepository.java:196) at com.ezytracking.ui.activities.LoginActivity$1.onClick (LoginActivity.java:196) at android.view.View.performClick (View.java:7792) at android.widget.TextView.performClick (TextView.java:16112) at android.view.View.performClickInternal (View.java:7769) at android.view.View.access$3800 (View.java:910) at android.view.View$PerformClick.run (View.java:30218) 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:8669) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135) Caused by java.lang.IllegalArgumentException: Call返回类型必须参数化为Call<Foo>或Call<? extends Foo> at retrofit2.DefaultCallAdapterFactory.get (DefaultCallAdapterFactory.java:45) at retrofit2.Retrofit.nextCallAdapter (Retrofit.java:33) at retrofit2.Retrofit.callAdapter (Retrofit.java:33) at retrofit2.HttpServiceMethod.createCallAdapter (HttpServiceMethod.java:45) at retrofit2.HttpServiceMethod.parseAnnotations (HttpServiceMethod.java:45) at retrofit2.ServiceMethod.parseAnnotations (ServiceMethod.java:45)
问题原因
- Retrofit接口定义不规范:API方法返回类型未正确参数化,使用了未指定泛型的
Call而非Call<具体实体类>。 - 发布版混淆导致泛型丢失:发布版开启混淆后,Retrofit的API接口或实体类被混淆,泛型信息被移除,导致Retrofit无法识别Call的参数类型,触发参数类型错误。
解决方案
1. 修正Retrofit接口定义
确保所有API方法的返回类型为参数化的Call,示例:
// 错误写法 @GET("user/check") Call checkIsValidUser(@Query("username") String username); // 正确写法 @GET("user/check") Call<ValidationResponse> checkIsValidUser(@Query("username") String username);
2. 添加混淆排除规则
在proguard-rules.pro文件中添加以下规则,避免接口和实体类被混淆:
# 保留Retrofit相关类及注解 -keepattributes Signature -keepattributes Exceptions -keepattributes *Annotation* -keep class retrofit2.** { *; } # 保留所有带有Retrofit注解的方法 -keepclasseswithmembers class * { @retrofit2.http.* <methods>; } # 保留你的API接口所在包下的所有类(替换为实际包名) -keep class com.ezytracking.api.** { *; } # 保留Gson解析所需的实体类(替换为实际包名) -keep class com.ezytracking.models.** { *; } -keepclassmembers class com.ezytracking.models.** { <fields>; }
3. 验证配置
重新打包发布版APK,测试API调用是否正常。若仍有问题,检查是否有其他混淆规则影响了Retrofit或实体类。
内容的提问来源于stack exchange,提问作者Nayank
相关产品推荐
相关产品推荐

