获取"未解决的参考文献"和"找不到超类"来自Proguard的警告

时间:2016-04-14 03:20:02

标签: android build proguard minify android-proguard

我已将一些第三方来源集成到我的Android项目中,并且我无法在启用proguard的情况下进行构建。构建失败了:

Warning: there were 123 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Warning: there were 201 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile the code.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.

:app:transformClassesAndResourcesWithProguardForRelease FAILED

FAILURE: Build failed with an exception.

有很多笔记和警告要排序,我无法做出正面或反面。我已经尝试为似乎引起警告的所有内容添加--keep class example.package.** { *; },但它仍然失败。任何人都可以建议一个处理这样的问题的策略吗?例如,如果我看到这个:

Warning: info.guardianproject.netcipher.client.MyDefaultClientConnectionOperator: can't find superclass or interface ch.boye.httpclientandroidlib.impl.conn.DefaultClientConnectionOperator

我该怎么办呢?

2 个答案:

答案 0 :(得分:4)

将以下内容添加到proguard文件中将解决编译问题:

-dontwarn info.guardianproject.netcipher.**

那就是说,你应该读一下随之而来的任何后果。 Proguard通常会给出警告。

答案 1 :(得分:3)

你得到这些警告的原因是监护人项目搞砸了依赖关系。正如您所看到的,here NetCipher没有任何依赖关系。而且httpclientandroidlib显然是一个outern项目。在Netcipher内,他们构建了.jar library,而不是将其打包到他们的库中。遗憾的是,jcenter依赖无法使用httpclientandroidlib

有两种解决方案:

  1. @Tommie提议:添加

    -dontwarn info.guardianproject.netcipher.**
    
    如果没有必要,请向您proguard-rules.pro提交{p>。你只是摆脱警告,有时它是一个好方法。但通常不起作用。然后转到第二步

  2. 您需要手动将httpclientandroidlib添加到项目中。

    1. github下载项目为.zip

    2. Add new module到您的项目,将其命名为httpclientandroidlib(名称是任意的。我将其命名为仅供参考)

    3. 将文件夹结构ch.boye.httpclientandroidlib复制到新模块的src文件夹

    4. 将模块的AndroidManifest替换为httpclientandroidlib库中的模块。

    5. 为您的主要模块添加依赖性:

      compile project(':httpclientandroidlib')
      
  3. 然后你就可以开始使用这个项目了。