Proguard 不再适用于 Retrofit

Posted

技术标签:

【中文标题】Proguard 不再适用于 Retrofit【英文标题】:Proguard no longer works with Retrofit 【发布时间】:2014-05-17 21:09:41 【问题描述】:

我发现了涉及同一主题的旧问题,但在最新版本中,没有一个可用的答案对我有用。

我在我的项目中使用 Retrofit。当我尝试组装时,出现以下错误:

警告:retrofit.client.OkClient:找不到引用的类 com.squareup.okhttp.OkHttpClient

我正在使用以下方法,但没有任何帮助:

-keepattributes Signature

-keep class retrofit.**  *; 
-keep class retrofit.http.**  *; 
-keep class retrofit.client.**  *; 
-keep class com.squareup.okhttp.**  *; 
-keep interface com.squareup.okhttp.**  *; 
-keep class com.google.gson.**  *; 
-keep class com.google.inject.*  *; 
-keep class org.apache.http.*  *; 
-keep class org.codehaus.mojo.**  *; 
-keep class org.apache.james.mime4j.*  *; 
-keep class javax.inject.*  *; 
-keep class sun.misc.Unsafe  *; 

-libraryjars libs/acra-4.5.0.jar
-libraryjars libs/radial-menu-v4.jar

-dontwarn javax.xml.stream.events.**
-dontwarn rx.**
-dontwarn org.apache.lang.**

# Application classes that will be serialized/deserialized over Gson
-keep class com.example.package.network.**  *; 

最近有人遇到过这个问题并解决了吗?

【问题讨论】:

【参考方案1】:
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.**  *; 
-keep interface com.squareup.okhttp.**  *; 
-dontwarn com.squareup.okhttp.**

-dontwarn rx.**
-dontwarn retrofit.**
-keep class retrofit.**  *; 
-keepclasseswithmembers class * 
    @retrofit.http.* <methods>;


-keep class sun.misc.Unsafe  *; 
#your package path where your gson models are stored  
-keep class com.example.models.**  *; 

我已将上述 proguard 文本用于使用 OKHTTP 进行改造。

编辑: 很好的回购参考许多流行的图书馆 https://github.com/krschultz/android-proguard-snippets

【讨论】:

嘿,你可以添加一些关于你的工作的描述。 对我来说,'-keepclasseswithmember' 很重要——在我添加它之前,我的 @Path 变量没有被替换。谢谢! :) 对我来说即使没有 -keep class com.squareup.okhttp.** ; -keep interface com.squareup.okhttp.* *; 虽然我也使用 okhttp 请您或其他人确认这将适用于 Retrofit 2 @Sniper:是的。你也可以检查一下github.com/krschultz/android-proguard-snippets/blob/master/…【参考方案2】:

可能看起来微不足道,但是您是否尝试过包含此行? (如果你不使用 okhttp 就是)。

-dontwarn com.squareup.okhttp.**

事情是 Square 内部不使用 Proguard,因此虽然他们的库可能会对正在使用的内容做出一些假设,但如果您的项目不使用它,您可以放心地忽略它。我对毕加索也有同样的问题,这为我解决了问题。

【讨论】:

这确实使它可以编译,但正如您所提到的,只有在您确定不使用该功能时才是安全的。我会标记这个答案,因为对于很多人来说它是正确的 别忘了保留模型类,这对我来说是个问题。【参考方案3】:

此配置适用于使用 gson 改造

#Using for retrofit & gson
-keep class com.google.gson.**  *; 
-keep class com.google.inject.**  *; 
-keep class org.apache.http.**  *; 
-keep class org.apache.james.mime4j.*  *; 
-keep class javax.inject.**  *; 
-keep class retrofit.**  *; 
-keep class sun.misc.Unsafe  *; 
-keep class com.google.gson.stream.**  *; 
-keepclassmembernames interface * 
    @retrofit.http.* <methods>;

-keep interface retrofit.**  *;
-keep interface com.squareup.**  *; 
-dontwarn rx.**
-dontwarn retrofit.**

另外,您需要添加与改造一起使用的所有 POJO 类,如下所示。

-keep class com.google.gson.examples.android.model.**  *; 
-keep class com.packagename.your.pojo.models.**  *; 

keepattributes 如下所示

-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes Deprecated
-keepattributes SourceFile
-keepattributes LineNumberTable
-keepattributes *Annotation*
-keepattributes EnclosingMethod

A nice discussion about proguard with retrofit goes here

【讨论】:

以上是关于Proguard 不再适用于 Retrofit的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS8 中: UIPopoverController presentPopoverFromRect 不再适用于 keyWindow

Laravel 新命令不再适用于 MAC

查询不再适用于 MySQL 5

geocoder.geocodeAddressString 今天不再适用于快速更新

UnsafePointer 不再适用于 swift 3

Gradle 3.0.0 的 Proguard 问题