ProGuard: дублікат визначення бібліотечного класу?


83

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

Чи це правильний спосіб обробки цього попередження, просто ігноруючи його, чи це може призвести до проблем?


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

1
Не могли б ви опублікувати приклад для цього. Android plrguard def каже, що ви не повинні використовувати: libraryjars. Див .: proguard.sourceforge.net/manual/…
конфіл

опублікуйте свій progaurdфайл правил
NJ

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

Я вирішив це, вилучивши бібліотеку apache зі свого проекту та замінивши власним кодом.
заборона геоінженерії

Відповіді:


96

Якщо ви додасте параметр proguard, -printconfiguration config.txtви побачите додавання proguard

-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 додає другу банку, навіть якщо ви цього не зробите. useLibrary 'org.apache.http.legacy' Ось відкрита помилка, що описує проблему.

Тож ми зараз нічого не можемо зробити з цим питанням. Просто ігноруйте це:

-dontnote android.net.http.*
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**

Немає необхідності тримати класи, поки вони знаходяться в банку бібліотеки (насправді бібліотека телефону). dontwarn не працює, оскільки це не попередження, це примітка.


6
Чудово! Дякую. Ці відповіді слід позначити як правильні!
Радім Вакулік

Просто спробував розмістити useLibrary 'org.apache.http.legacy'у build.gradle та розмістити -dontnoteу файлі proguard. Але все одно виникають проблеми. Я використовував api 22, працював нормально. Зараз я переходжу на 23, я отримую ці помилки при спробі побудувати підписаний. Інколи оцінка працює на невизначений термін. Не знаю, що ще робити.
wviana

Куди я додаю цю опцію proguard option -printconfiguration config.txt?
MML

У командному рядку ви запускали proguard. Файл config.txt буде створений у поточній папці
Флавіо,

6

Можливо, ви згадали "-injars" та -libraryjars "у своєму proguard-project.txt, враховуючи, що найновіша система збірки подбає про те, щоб згадувати їх для вас .. тому вам не потрібно згадувати про це ще раз.

джерело: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

Думаю, це допоможе. :)


1
Що ж, я працюю на досить новій Android Studio (збірка 1 грудня 2015 року), і ніхто не дбає про те, щоб згадувати їх для мене. Мені чогось простого не вистачає?
aasu

1

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

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

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

jar {є завданням у плагіні gradle java, тому якщо ви 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.