You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用发布至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)

问题原因

  1. Retrofit接口定义不规范:API方法返回类型未正确参数化,使用了未指定泛型的Call而非Call<具体实体类>。
  2. 发布版混淆导致泛型丢失:发布版开启混淆后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:36:02