ProGuard:库类的重复定义?


83

我为我的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.

我发现这里通过忽略它来解决此问题:

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

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

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


看来您从多个库中导入了一些类。您可以在proguard配置内添加android库jar
Adem

1
您能否为此举个例子。Android plrguard def表示您不应使用:libraryjars。请参阅:proguard.sourceforge.net/manual/…–
提交

发布您的progaurd规则文件
NJ

@confile您解决了您的问题吗?
NickUnuchek '16

我通过从项目中删除apache库并替换为自己的代码来解决此问题。
ban-geoengineering,2016年

Answers:


96

如果添加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' 这是一个描述问题的公开错误

所以现在我们无法解决这个问题。只是忽略它:

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

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


6
大!谢谢。此答案应标记为正确答案!
Radim Vaculik

只是尝试将其放置useLibrary 'org.apache.http.legacy'build.gradle中,然后将其-dontnote放入proguard文件中。但是仍然遇到问题。我正在使用API​​ 22,工作正常。现在我升级到23,尝试构建签名时出现这些错误。有时,成绩不确定。不知道该怎么办。
wviana

我在哪里添加此选项proguard option -printconfiguration config.txt
MML

在命令行中运行proguard。config.txt将在当前文件夹中创建
Flavio


1

您可以通过在build.gradle中添加以下内容来告诉gradle不允许重复的类(仅使用第一个):

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
哪个build.gradle?项目或应用程序?如果是应用程序,您将其放置在哪个块下?我试图将其放在应用程序的build.gradle android块中,android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }但出现错误Error:Gradle DSL method not found:'jar()'
Edijae Crusar

jar {是gradle java插件中的一项任务,因此,如果您这样,apply plugin: 'java'则应该可以使用该jar块;它不会进入另一个块内;它在build.gradle的根目录下。(请参阅此gradle文档)我在应用程序中使用了它,但不确定是否重要。
voxoid

-7

您可以在build.gradle中尝试此操作,以查看日志中指示为重复的所有内容。我不确定这是否行得通,所以请尝试一下并告知是否行得通。

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.