ProGuard: дублированное определение класса библиотеки?
Я запускаю свой ProGuard для моего Android-проекта и получаю следующие предупреждения:
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 -printconfiguration config.txt
, вы увидите, что proguard добавляет
-libraryjars 'D:\tools\android\platform\android-23\android.jar'
-libraryjars 'D:\tools\android\platform\android-23\optional\org.apache.http.legacy.jar'
ваши дублированные классы (например, SslError) представлены как в android.jar, так и в org.apache.http.legacy.jar
Proguard добавляет вторую банку, даже если вы не useLibrary 'org.apache.http.legacy'
Ниже приведена ошибка , описывающая проблему.
Итак, теперь мы ничего не можем сделать с этой проблемой. Просто игнорируйте это:
-dontnote android.net.http.*
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**
Нет необходимости хранить классы до тех пор, пока они находятся в библиотечном банке (собственно, на телефоне).
dontwarn не работает, потому что это не предупреждение, это записка.
Ответ 2
Возможно, вы упоминали "-injars" и -libraryjars в вашем proguard-project.txt, учитывая, что последняя система сборки заботится о том, чтобы упомянуть их для вас. Так что вам не нужно упоминать об этом снова.
Источник:
http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass
Я думаю, это поможет.:)
Ответ 3
Вы можете сообщить gradle не допускать дублирование классов (возьмите только первое), добавив следующее к вашему build.gradle:
jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Ответ 4
Вы можете попробовать это в своем build.gradle для всего, что обозначено как дублирующее в журналах. Я не уверен, что это сработает, поэтому попробуйте и сообщите, работает ли оно или нет.
packagingOptions {
exclude 'android.net.http.SslCertificate'
}