我为我的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
之后,警告也不会消失。
这是处理此警告的正确方法,只是忽略它或者这会导致问题吗?
答案 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'
}