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

这是处理此警告的正确方法,只是忽略它还是可能导致问题?


答案 1

如果您添加 proguard 选项,您将看到 proguard 添加-printconfiguration config.txt

-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不起作用,因为它不是警告,而是注释。


答案 2

可能,您在proguard项目中提到了“-injars”和-libraryjars.txt,考虑到最新的构建系统会为您提及它们。所以你不需要再提一次。

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

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


推荐