Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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'
    }