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

开启ProGuard后Retrofit2报@GET/@Url缺失异常求助

解决ProGuard混淆导致Retrofit @Url接口抛出IllegalArgumentException的问题

嘿,我之前也碰到过一模一样的问题!当你开启minifyEnabled true和shrinkResources true后,ProGuard会悄悄混淆或移除Retrofit接口里和@Url注解相关的关键元数据,导致Retrofit运行时认不出你定义的@Url参数,所以才会抛出那个Missing either @GET URL or @Url parameter异常。哪怕你加了常规的Retrofit规则,大概率是漏掉了Kotlin接口特有的参数元数据保留规则,或者RxJava相关的混淆配置。

直接能用的解决方案

你需要在proguard-rules.pro里补上这些完整的规则,确保Retrofit能正常识别你的接口:

1. 核心Retrofit与Kotlin参数保留规则

把下面这段复制到你的proguard-rules.pro里:

# 保留所有注解,Retrofit靠这个识别@Url之类的标记
-keepattributes *Annotation*

# 保留接口中所有带Retrofit注解的方法
-keepclassmembers,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

# 关键!保留Kotlin接口方法的参数名,Retrofit需要这个绑定@Url参数
-keepattributes MethodParameters
-keepclassmembers interface * {
    <methods>;
}

# 防止Retrofit核心类被混淆
-keep class retrofit2.** { *; }
-keep interface retrofit2.** { *; }

# 你用了Single,所以要保留RxJava的相关类,不然RxJava和Retrofit的结合会出问题
-keep class io.reactivex.rxjava3.** { *; }
-keep interface io.reactivex.rxjava3.** { *; }
-dontwarn io.reactivex.rxjava3.**

2. 保险起见,单独保留你的ContentService接口

如果上面的规则还没搞定,可以直接把你的接口排除在混淆之外,记得替换成你实际的包名:

-keep interface com.your.app.package.ContentService {
    public <methods>;
}

3. 验证规则是否生效

你可以去build/outputs/mapping/release/mapping.txt文件里查看ContentService的getCMSCon方法,检查@Url注解和url参数是不是没被混淆或删掉——要是能找到对应的未混淆条目,说明规则生效了。

为什么之前的规则没用?

  • 常规的Retrofit规则一般只保留核心类,但没考虑Kotlin接口的方法参数元数据,Retrofit处理@Url时必须依赖这些元数据来把参数和注解对应起来。
  • 你用了RxJava的Single,要是漏掉了RxJava的混淆规则,Retrofit和RxJava的适配层会被破坏,也会引发奇怪的异常。

最后测试验证

加完规则后重新打个release包,再发起请求试试。要是还不行,可以先把shrinkResources true关掉单独测试,排除资源收缩的影响——不过大概率是混淆的问题,按上面的规则来应该能解决。

内容的提问来源于stack exchange,提问作者Rafael Ruiz Muñoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:45:20