Intereting Posts
Очистить данные пользователя приложения Android Могу ли я подслушивать события Android touch? Можем ли мы удалить SMS на Android до того, как оно поступит в папку «Входящие»? Удалить будильник из AlarmManager с помощью функции cancel () – Android Подключение android с MS SQL SERVER 2008 Службы Google Play устарели. Требуется 9256000, но найдено 9080470 Как применить прослушиватель событий click к изображению в android Как обновить содержимое фрагмента из активности (viewpager)? Можно ли изменить контекст приложения во время жизненного цикла приложения? Почему google map v2 внезапно разбился на java.lang.NullPointerException: Попытка получить длину нулевого массива? Как читать текстовый файл в Android? React Native и Twilio на Android Android: запрос журнала вызовов после того, как он был обновлен после завершения вызова Как создать навигационный ящик без поддержки библиотеки Можем ли мы увеличить коэффициент усиления микрофона телефона Android?

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

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

Solutions Collecting From Web of "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 не работает, потому что это не предупреждение, это записка.

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

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

Я думаю, это поможет. 🙂

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

 jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } 

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

 packagingOptions { exclude 'android.net.http.SslCertificate' }