Proguard引发100条“找不到引用的类”警告,忽略了springframework和jackson的保留规则

Syz*_*ygy 2 spring android proguard jackson android-proguard

我的代码可以编译并且可以在调试模式下正常运行,但是一旦我使用了带有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'
Run Code Online (Sandbox Code Playgroud)

如果我对这两个库都使用-dontwarn,就像许多人对这类问题的建议那样,则该应用程序可以编译,但在启动过程中会由于混淆的崩溃日志而崩溃-我尝试使用映射文件对其进行跟踪,但这都不起作用-我为了合理地确定应用程序在初始化杰克逊映射类时由于自动生成的(通过android注释)类RestClient_而崩溃,例外情况如下:

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

尽管在其他电话上,该异常没有消息。很明显,这是proguard的结果。

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


这是我已经尝试过的几件事(我尝试了更多,但过一会儿才开始写下来)。尝试着重于首先固定弹簧框架。(必须将其概括为要点,因为stackoverflow不会让我发帖)

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


完整的错误日志:

simpleframework.xml.Serializer警告:有100个未解决的对类或接口的引用。警告:有2个未解决的对程序类成员的引用。警告:处理任务java.io.IOException时发生异常:请首先更正以上警告。错误:任务':myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease'的执行失败。作业失败,请参阅日志以获取详细信息信息:构建失败信息:总时间:23.68秒信息:1错误信息:59警告信息:请参阅控制台中的完整输出 请首先更正以上警告。错误:任务':myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease'的执行失败。作业失败,请参阅日志以获取详细信息信息:构建失败信息:总时间:23.68秒信息:1错误信息:59警告信息:请参阅控制台中的完整输出 请首先更正以上警告。错误:任务':myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease'的执行失败。作业失败,请参阅日志以获取详细信息信息:构建失败信息:总时间:23.68秒信息:1错误信息:59警告信息:请参阅控制台中的完整输出

Syz*_*ygy 5

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

-keepclassmembers类com.myapp.models。** {*;}

-保持类com.fasterxml.jackson.annotation。** {*; }

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

-dontwarn org.springframework。**

因此,最终我还是可以忽略大多数警告。正如我说的那样,简单地忽略它们会导致崩溃,这是通过不混淆jackson批注和不混淆我的模型类而解决的,这些类似乎是必需的,以便可以进行json <-> pojo转换。