ProGuard: zduplikowana definicja klasy biblioteki?


84

Uruchamiam ProGuard dla mojego projektu Android i otrzymuję następujące ostrzeżenia:

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.

Znalazłem tutaj, aby to naprawić, ignorując to za pomocą:

-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-keep class android.net.http.** { *; }
-dontwarn android.net.http.**

Nie widzę sposobu na usunięcie duplikatów z używanych bibliotek. Nawet po użyciu dontwarnostrzeżenia nie znikają.

Czy to właściwy sposób postępowania z tym ostrzeżeniem, po prostu je ignorując, czy może to prowadzić do problemów?


wygląda na to, że zaimportowałeś niektóre klasy z wielu bibliotek. możesz dodać plik biblioteki Androida do konfiguracji programu proguard
Adem

1
Czy mógłbyś zamieścić na to przykład. Android plrguard def mówi, że nie powinieneś używać: libraryjars. Zobacz: proguard.sourceforge.net/manual/…
confile

opublikuj swój progaurdplik z regułami
NJ

@confile czy rozwiązałeś swój problem?
NickUnuchek,

Rozwiązałem to, porzucając bibliotekę Apache z mojego projektu i zastępując ją własnym kodem.
zakaz geoinżynierii

Odpowiedzi:


96

Jeśli dodasz opcję proguard -printconfiguration config.txt, zobaczysz dodanie proguard

-libraryjars 'D: \ tools \ android \ platform \ android-23 \ android.jar'

-libraryjars 'D: \ tools \ android \ platform \ android-23 \ optional \ org.apache.http.legacy.jar'

Twoje zduplikowane klasy (np. SslError) są prezentowane zarówno w android.jar, jak i org.apache.http.legacy.jar

Proguard dodaje drugi słoik, nawet jeśli tego nie robisz. useLibrary 'org.apache.http.legacy' Oto otwarty błąd opisujący problem.

Więc teraz nie możemy nic zrobić z tym problemem. Po prostu to zignoruj:

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

Nie ma potrzeby przechowywania zajęć, o ile znajdują się one w słoiku bibliotecznym (właściwie w bibliotece telefonu). dontwarn nie działa, ponieważ to nie jest ostrzeżenie, to uwaga.


6
Świetny! Dzięki. Te odpowiedzi należy oznaczyć jako poprawne!
Radim Vaculik

Właśnie próbowałem umieścić go useLibrary 'org.apache.http.legacy'w build.gradle i umieścić -dontnotego w pliku proguard. Ale wciąż pojawiają się problemy. Używałem API 22, działało dobrze. Teraz przechodzę na 23 i otrzymuję te błędy, kiedy próbuję zbudować podpisany plik. Czasami ocena działa na czas nieokreślony. Nie wiem, co jeszcze mogę zrobić.
wviana

Gdzie dodam tę opcję proguard option -printconfiguration config.txt?
MML

W wierszu poleceń uruchomiono program proguard. Plik config.txt zostanie utworzony w bieżącym folderze
Flavio

6

Prawdopodobnie wspomniałeś o "-injars" i -libraryjars "w swoim proguard-project.txt, biorąc pod uwagę, że najnowszy system kompilacji zadba o to, aby wspomnieć o nich za Ciebie ... więc nie musisz o tym wspominać ponownie.

źródło: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

Myślę, że to pomoże. :)


1
Cóż, jestem na całkiem nowym Android Studio (kompilacja z 1 grudnia 2015 r.) I nikt nie dba o to, żeby mi o nich wspominać. Czy brakuje mi czegoś prostego?
aasu

1

Możesz powiedzieć gradle, aby nie zezwalał na zduplikowane klasy (wybierz tylko pierwszą), dodając do pliku build.gradle:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
Który build.gradle? projekt czy aplikacja? jeśli aplikacja, pod którym blokiem ją umieszczasz? Próbowałem umieścić go w bloku androida build.gradle mojej aplikacji, android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }ale
pojawia

jar {jest zadaniem we wtyczce java gradle, więc jeśli apply plugin: 'java'powinieneś być w stanie użyć tego bloku jar; nie wchodzi do innego bloku; znajduje się na poziomie głównym pliku build.gradle. ( zobacz ten dokument dotyczący gradle ) Użyłem go w aplikacji, ale nie jestem pewien, czy to ma znaczenie.
voxoid

-7

Możesz to wypróbować w pliku build.gradle dla wszystkiego, co jest oznaczone jako duplikat w dziennikach. Nie jestem pewien, czy to zadziała, więc wypróbuj i poinformuj, czy zadziała, czy nie.

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.