ProGuard:库类的重复定义?

时间:2015-10-09 22:03:47

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

我为我的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之后,警告也不会消失。

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

4 个答案:

答案 0 :(得分:87)

如果你添加了一个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

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

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

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

只要它们位于库jar(实际上是电话库)中就没有必要保留这些类。 dontwarn不起作用,因为它不是警告,而是一张纸条。

答案 1 :(得分:6)

可能你提到过" -injars"和-libraryjars"在您的proguard-project.txt中,考虑到最新的构建系统需要为您提及它们。所以您不需要再次提及它。

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

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

答案 2 :(得分:0)

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

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

答案 3 :(得分:-6)

您可以在build.gradle中尝试使用日志中指示为重复的所有内容。我不确定这是否有效,所以试试看是否有效。

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