使用 Proguard 进行改造警告

Posted

技术标签:

【中文标题】使用 Proguard 进行改造警告【英文标题】:Retrofit warning with Proguard 【发布时间】:2017-10-27 01:51:53 【问题描述】:

我在我的 android 项目中打开了 proguard 并收到以下警告。在谷歌上搜索,但找不到太多信息。

警告:retrofit.Platform$Java8:找不到引用的类 org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

我已经在我的项目中加入了 retrofit2 proguard 规则。

-dontwarn retrofit2.**
-keep class retrofit2.**  *; 
-keepattributes Signature
-keepattributes Exceptions

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

【问题讨论】:

【参考方案1】:

对 Retrofit 2.3.0 和 okhttp 3.8.0 使用以下 proguard 规则

-dontnote retrofit2.Platform
-dontwarn retrofit2.Platform$Java8adapters.
-keepattributes Signature
-keepattributes Exceptions
-dontwarn org.xmlpull.v1.**
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**

【讨论】:

改造主页上的官方规则,加上-dontwarn javax.annotation.**是我的必填项【参考方案2】:

改成这样:

-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8

在 Java 8 VM 上运行时,Retrofit 页面已注意到此 proguard 版本:

为什么会这样?

原因是: 编译器尝试引用 Java 8 类,当你通过 Proguard 不提及时,明确提及后,Java 8 类将不会被使用。 例如 Java 8 的 java.nio.* 包在 Android 上不可用,并且永远不会被调用

【讨论】:

以上是关于使用 Proguard 进行改造警告的主要内容,如果未能解决你的问题,请参考以下文章

改造和 Proguard 错误

DexGuard/Proguard 混淆注释值

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

proguard 是不是将所有枚举转换为 int 或需要为此配置

为啥 proguard 不混淆方法体?

使 Proguard 完全忽略包