ProGuard: повторяющееся определение класса библиотеки?


84

Я запускаю 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предупреждения не исчезают.

Это правильный способ обработки этого предупреждения, просто игнорируя его, или это может привести к проблемам?


кажется, вы импортировали некоторые классы из нескольких библиотек. вы можете добавить jar библиотеки Android в конфигурацию proguard
Адем,

1
Не могли бы вы опубликовать пример для этого. Android plrguard def говорит, что вы не должны использовать: libraryjars. См .: proguard.sourceforge.net/manual/…
confile

опубликуйте свой progaurdфайл правил
Нью-Джерси,

@confile вы решили свою проблему?
NickUnuchek

Я решил эту проблему, убрав библиотеку apache из своего проекта и заменив ее собственным кодом.
бан-геоинжиниринг

Ответы:


96

Если вы добавите опцию 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.**

Нет необходимости хранить классы, пока они находятся в библиотеке jar (фактически, в библиотеке телефона). dontwarn не работает, потому что это не предупреждение, а примечание.


6
Большой! Благодарю. Этот ответ должен быть отмечен как правильный!
Radim Vaculik

Просто пробовал поместить useLibrary 'org.apache.http.legacy'в build.gradle и поместить -dontnoteв файл proguard. Но все равно возникают проблемы. Я использовал api 22, работал нормально. Сейчас я обновляюсь до 23, я получаю эти ошибки при попытке собрать подписанный. Иногда оценка работает на неопределенный срок. Не знаю, что еще делать.
wviana

Куда добавить эту опцию proguard option -printconfiguration config.txt?
MML

В командной строке был запущен прогард. Config.txt будет создан в текущей папке
Flavio

6

Вероятно, вы упомянули «-injars» и -libraryjars в вашем proguard-project.txt, учитывая, что последняя система сборки позаботится об их упоминании за вас ... так что вам не нужно упоминать это снова.

источник: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

Думаю, это поможет. :)


1
Что ж, я использую довольно новую Android Studio (сборка от 1 декабря 2015 г.), и никто не упоминает их за меня. Я что-то упустил?
aasu 09

1

Вы можете указать gradle не допускать дублирования классов (взять только первый), добавив в свой build.gradle следующее:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
Какой build.gradle? проект или приложение? если приложение, под каким блоком вы его разместите? Я попытался поместить его в свой блок android build.gradle своего приложения, android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }но получаю сообщение об ошибке Ошибка: метод Gradle DSL не найден: 'jar ()'
Edijae Crusar

jar {- это задача в java-плагине gradle, поэтому, если вы, apply plugin: 'java'то сможете использовать этот блок jar; он не попадает внутрь другого блока; он находится на корневом уровне build.gradle. ( см. этот документ Gradle ) Я использовал его в приложении, но не уверен, что это имеет значение.
voxoid

-7

Вы можете попробовать это в своем build.gradle для всего, что указано в журналах как дубликаты. Я не уверен, что это сработает, поэтому попробуйте и сообщите, работает он или нет.

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.