【问题标题】:ProGuard: duplicate definition of library class?ProGuard:库类的重复定义?
【发布时间】:2016-01-07 23:10:18
【问题描述】:

我为我的 Android 项目运行 ProGuard 并收到以下警告:

Note: duplicate definition of library class [org.apache.http.conn.scheme.HostNameResolver]
Note: duplicate definition of library class [org.apache.http.conn.scheme.SocketFactory]
Note: duplicate definition of library class [org.apache.http.conn.ConnectTimeoutException]
Note: duplicate definition of library class [org.apache.http.params.HttpParams]
Note: duplicate definition of library class [android.net.http.SslCertificate$DName]
Note: duplicate definition of library class [android.net.http.SslError]
Note: duplicate definition of library class [android.net.http.SslCertificate]

Note: there were 7 duplicate class definitions.

我发现here 可以通过忽略它来解决这个问题:

-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-keep class android.net.http.** { *; }
-dontwarn android.net.http.**

我看不到从使用过的库中删除重复项的方法。即使在使用dontwarn 之后,警告也不会消失。

这是处理此警告的正确方法,只是忽略它还是会导致问题?

【问题讨论】:

  • 您似乎从多个库中导入了一些类。你可以在 proguard config 中添加 android library jar
  • 您能否为此发布一个示例。 Android plrguard def 说你不应该使用:libraryjars。见:proguard.sourceforge.net/manual/…
  • 发布您的progaurd 规则文件
  • @confile 你的问题解决了吗?
  • 我通过从我的项目中删除 apache 库并替换为我自己的代码解决了这个问题。

标签: java android android-studio proguard android-proguard


【解决方案1】:

如果你添加一个 proguard 选项 -printconfiguration config.txt 你会看到 proguard 添加

-libraryjars 'D:\tools\android\platforms\android-23\android.jar'

-libraryjars 'D:\tools\android\platforms\android-23\optional\org.apache.http.legacy.jar'

您的重复类(例如 SslError)同时出现在 android.jar 和 org.apache.http.legacy.jar 中

Proguard 会添加第二个 jar,即使您没有 useLibrary 'org.apache.http.legacy' 这是描述问题的open bug

所以现在我们对这个问题无能为力。忽略它:

-dontnote android.net.http.*
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**

只要类位于库 jar(实际上是手机的库)中,就无需保留这些类。 dontwarn 不起作用,因为它不是警告,而是注释。

【讨论】:

  • 太棒了!谢谢。此答案应标记为正确答案!
  • 刚刚尝试将 useLibrary 'org.apache.http.legacy' 放入 build.gradle 并将您的 -dontnote 放入 proguard 文件中。但仍然遇到问题。我使用的是 api 22,工作正常。现在我升级到 23,尝试构建签名时遇到这些错误。有时等级可以无限期使用。不知道还能做什么。
  • 我在哪里添加这个选项proguard option -printconfiguration config.txt
  • 在命令行中运行 proguard。 config.txt 将在当前文件夹中创建
【解决方案2】:

可能,您在 proguard-project.txt 中提到了“-injars”和 -libraryjars,考虑到最新的构建系统会为您提及它们..所以您无需再次提及。

来源: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

我认为这会有所帮助。:)

【讨论】:

  • 好吧,我正在使用一个非常新的 Android Studio(2015 年 12 月 1 日版本),没有人愿意为我提及它们。我错过了一些简单的东西吗?
【解决方案3】:

您可以通过将以下内容添加到您的 build.gradle 来告诉 gradle 不允许重复的类(只取第一个):

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

【讨论】:

  • 哪个 build.gradle?项目或应用程序?如果是应用程序,您将它放在哪个块下?我试图把它放在我的应用程序的 build.gradle android 块 android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } } 但我收到错误 Error:Gradle DSL method not found: 'jar()'
  • jar { 是 gradle java 插件中的一个任务,所以如果你 apply plugin: 'java' 那么你应该能够使用那个 jar 块;它不会进入另一个街区;它位于 build.gradle 的根级别。 (see this gradle doc) 我在应用程序中使用过它,但不确定这是否重要。
【解决方案4】:

您可以在您的 build.gradle 中尝试对日志中指示为重复的所有内容进行此操作。我不确定这是否可行,因此请尝试并告知它是否可行。

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 2012-01-14
    • 2012-10-31
    • 2012-02-07
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多