Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则

Posted

技术标签:

【中文标题】Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则【英文标题】:Proguard causes 100 "can't find referenced class" warnings, ignores keep rules for springframework and jackson 【发布时间】:2017-06-05 02:34:40 【问题描述】:

我的代码在调试模式下编译并运行良好,但是一旦我使用带有 minifyEnabled true 的构建配置,我就会收到这些阻止编译的警告:

警告:有 100 个未解析的类或接口引用。

警告:有 2 个对程序类成员的未解析引用。

为了便于阅读,我将在底部包含完整的输出。 有两个库导致了这些警告,springframework 和 jackson。这些库通过 gradle 包含在我的项目中,如下所示:

compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.5'
compile 'com.fasterxml.jackson.core:jackson-core:2.8.5'
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.5'

apt "org.androidannotations:rest-spring:$AAVersion"
compile "org.androidannotations:rest-spring-api:$AAVersion"     
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M3'

如果我对这两个库都使用 -dontwarn,就像许多人针对这些类型的问题所建议的那样,应用程序会编译,但在启动期间会因混淆的崩溃日志而崩溃 - 我尝试使用映射文件重新跟踪它,但这也不起作用- 我有理由确定应用程序在初始化杰克逊映射类时由于自动生成(通过android注释)类RestClient_而崩溃,异常如​​下:

java.lang.NoSuchFieldError:没有类型的静态字段 PUBLIC_ONLY Lcom/myapp/app/mv$a;在 Lcom/myapp/app/mv$a 类中;或其超类 (“com.myapp.app.mv$a”的声明出现在 /data/app/com.myapp.app-1/base.apk)

虽然在不同的手机上,异常没有消息。很明显这是proguard的结果。

我的完整 proguard 文件可以在这里找到 https://gist.github.com/Syzygy2048/02a44032611d40720bad36b5e3b37db6


这是我已经尝试过的几件事(我尝试了更多,但我只是在一段时间后才开始写下来)。尝试的重点是首先修复 springframework。 (不得不把它放在一个要点中,因为***不会让我发布其他内容)

https://gist.github.com/Syzygy2048/f1bdabc9f2ea091aa8faec67c62dd8bb


完整的错误日志:

信息:Gradle 任务 [:myappApp:assembleMyappPublicRelease] 警告:org.springframework.core.convert.support.ConvertingPropertyEditorAdapter:找不到超类或接口 java.beans.PropertyEditorSupport 警告:com.fasterxml.jackson.databind.ext.DOMSerializer:找不到引用的类 org.w3c.dom.bootstrap.DOMImplementationRegistry 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.Transient 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.ConstructorProperties 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.nio.file.Path 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.Transient 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.ConstructorProperties 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.Transient 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.ConstructorProperties 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.Transient 警告:com.fasterxml.jackson.databind.ext.Java7SupportImpl:找不到引用的类 java.beans.ConstructorProperties 警告:com.fasterxml.jackson.databind.ext.NioPathDeserializer:找不到引用的类 java.nio.file.Path 警告:com.fasterxml.jackson.databind.ext.NioPathDeserializer:找不到引用的类 java.nio.file.Paths 警告:com.fasterxml.jackson.databind.ext.NioPathDeserializer:找不到引用的类 java.nio.file.Path 警告:com.fasterxml.jackson.databind.ext.NioPathSerializer:找不到引用的类 java.nio.file.Path 警告:org.springframework.core.convert.support.ConvertingPropertyEditorAdapter:找不到引用的类 java.beans.PropertyEditorSupport 警告:org.springframework.core.convert.support.ConvertingPropertyEditorAdapter:在程序类 org.springframework.core.convert.support.ConvertingPropertyEditorAdapter 中找不到引用的方法 'void setValue(java.lang.Object)' 警告:org.springframework.core.convert.support.ConvertingPropertyEditorAdapter:在程序类 org.springframework.core.convert.support.ConvertingPropertyEditorAdapter 中找不到引用的方法“java.lang.Object getValue()” 警告:org.springframework.core.convert.support.ConvertingPropertyEditorAdapter:找不到引用的类 java.beans.PropertyEditorSupport 警告:org.springframework.http.client.HttpComponentsClientHttpRequest:找不到引用的类 org.apache.http.entity.ByteArrayEntityHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequest:找不到引用的类 org.apache.http.impl.client.CloseableHttpClient 警告:org.springframework.http.client.HttpComponentsClientHttpRequest:找不到引用的类 org.apache.http.client.methods.CloseableHttpResponse 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.impl.client.HttpClients 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.impl.client.CloseableHttpClient 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.protocol.HttpClientContext 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.Configurable 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig$Builder 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpGetHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpDeleteHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpHeadHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpOptionsHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpPostHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpPutHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpTraceHC4 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.methods.HttpPatch 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.impl.client.CloseableHttpClient 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.impl.client.HttpClients 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.protocol.HttpClientContext 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig$Builder 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.impl.client.CloseableHttpClient 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.client.config.RequestConfig 警告:org.springframework.http.client.HttpComponentsClientHttpRequestFactory:找不到引用的类 org.apache.http.impl.client.CloseableHttpClient 警告:org.springframework.http.client.HttpComponentsClientHttpResponse:找不到引用的类 org.apache.http.client.methods.CloseableHttpResponse 警告:org.springframework.http.client.HttpComponentsClientHttpResponse:找不到引用的类 org.apache.http.util.EntityUtilsHC4 警告:org.springframework.http.client.HttpComponentsClientHttpResponse:找不到引用的类 org.apache.http.client.methods.CloseableHttpResponse 警告:org.springframework.http.client.HttpComponentsClientHttpResponse:找不到引用的类 org.apache.http.util.EntityUtilsHC4 警告:org.springframework.http.client.HttpComponentsClientHttpResponse:找不到引用的类 org.apache.http.client.methods.CloseableHttpResponse 警告:org.springframework.http.client.HttpComponentsStreamingClientHttpRequest:找不到引用的类 org.apache.http.impl.client.CloseableHttpClient 警告:org.springframework.http.client.HttpComponentsStreamingClientHttpRequest:找不到引用的类 org.apache.http.client.methods.CloseableHttpResponse 警告:org.springframework.http.converter.xml.SimpleXmlHttpMessageConverter:找不到引用的类 org.simpleframework.xml.core.Persister 警告:org.springframework.http.converter.xml.SimpleXmlHttpMessageConverter:找不到引用的类 org.simpleframework.xml.Root 警告:org.springframework.http.converter.xml.SimpleXmlHttpMessageConverter:找不到引用的类 org.simpleframework.xml.Serializer 警告:有 100 个未解析的类或接口引用。 警告:对程序类成员有 2 个未解决的引用。 警告:处理任务时出现异常 java.io.IOException:请先更正上述警告。 错误:任务“:myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease”执行失败。 作业失败,查看日志了解详情 信息:构建失败 信息:总时间:23.68 秒 信息:1个错误 信息:59 个警告 信息:在控制台中查看完整的输出

【问题讨论】:

【参考方案1】:

事实证明,将其添加到我的 proguard 文件中解决了我的问题。

-keepclassmembers 类 com.myapp.models.** *;

-keep class com.fasterxml.jackson.annotation.** *;

-dontwarn com.fasterxml.jackson.databind.**

-dontwarn org.springframework.**

所以最后我可以忽略大部分警告。正如我所说,简单地忽略它们会导致崩溃,这可以通过不混淆杰克逊注释和不混淆我的模型类来解决,这似乎是需要的,以便可以发生 json pojo 转换。

【讨论】:

以上是关于Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则的主要内容,如果未能解决你的问题,请参考以下文章

ProGuard:找不到引用的类(到 R.java)

ADT R22 - Proguard - 找不到引用的类

Proguard 警告:找不到引用的类 scala。*

Proguard 和 Kotlin 的“找不到引用的类”

Android ProGuard警告 - 找不到引用的类“com.zhihu.matisse.R $ plurals”

找不到引用的类/找不到引用的方法