Retrofit2 - 缺少 @GET URL 或 @Url 参数 - Proguard

Posted

技术标签:

【中文标题】Retrofit2 - 缺少 @GET URL 或 @Url 参数 - Proguard【英文标题】:Retrofit2 - Missing either @GET URL or @Url parameter - Proguard 【发布时间】:2018-06-19 20:29:36 【问题描述】:

我在我的应用程序中做 ProGuard:

        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

当我尝试使用 Retrofit2 进行 http 调用时,我得到了异常:

java.lang.IllegalArgumentException:缺少@GET URL 或@Url 参数。

Service 是:

interface ContentService 

    @GET
    fun getCMSCon(@Url url: String): Single<CMSCon>


minifyEnabled falseshrinkResources false 时不会发生这种情况

我在互联网上进行了研究,最终将proguard-rules.pro修改为:

# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.**  *; 
-keepattributes Signature
-keepattributes Exceptions
-keepattributes *Annotation*

-keepattributes RuntimeVisibleAnnotations
-keepattributes RuntimeInvisibleAnnotations
-keepattributes RuntimeVisibleParameterAnnotations
-keepattributes RuntimeInvisibleParameterAnnotations

-keepattributes EnclosingMethod

-keepclasseswithmembers class * 
    @retrofit2.* <methods>;


-keepclasseswithmembers interface * 
    @retrofit2.* <methods>;

但没有任何改变。

@Url 是从 res 和文字传递的,以检查 Flavors 是否存在问题。

【问题讨论】:

您是否尝试添加具有这些方法调用 post 或 get 的接口。我认为您也可以尝试在规则中添加它们。因为它可能也会缩小它们。 这是真的@vikaskumar,它就是这样工作的。就没有别的办法了吗? 试试这个#-keep class com.your.package.webinterface.; 【参考方案1】:

解决方案将在任何interface 中描述的任何调用中应用@Keep 作为服务:

@Keep
@GET
fun getCMSConfig(@Url url: String): Single<CMSConfig>

【讨论】:

以上是关于Retrofit2 - 缺少 @GET URL 或 @Url 参数 - Proguard的主要内容,如果未能解决你的问题,请参考以下文章

Retrofit2 和 OkHttp3 仅在发生错误时使用缓存,例如网络错误或达到配额限制

改造 2 - 动态 URL

使用Retrofit2调用GET时获取Null对象作为响应

启用 ProGuard 时改造 2 不发送数据

如何区分不存在的服务或缺少记录?

从retrofit2和rxjava中的错误获取url