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. 

我发现这里用以下方法来解决这个问题:

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

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

这是正确的方式来处理这个警告只是忽略它,或者这可能导致问题?

如果你添加一个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即使不使用useLibrary 'org.apache.http.legacy'也会添加第二个jar这里是描述这个问题的一个开放的bug 。

所以现在我们不能对这个问题做任何事情。 只要忽略它:

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

只要它们位于库jar(实际上是电话的库)中,就不需要保存这些类。 dontwarn不工作,因为这不是一个警告,这是一个说明。

大概你在proguard-project.txt里提到了“-injars”和-libraryjars,考虑到最新的构build系统会为你提供这些系统,所以你不必再提及它。

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

我认为这将有助于。:)

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

 jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } 

你可以在build.gradle中试试这个在日志中表示为重复的东西。 我不确定这是否会起作用,所以试试看,如果它工作或没有通知。

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