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' }