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 dontwarn
ostrzeż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?
progaurd
plik z regułamiOdpowiedzi:
Jeśli dodasz opcję proguard
-printconfiguration config.txt
, zobaczysz dodanie proguardTwoje 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:
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.
źródło
useLibrary 'org.apache.http.legacy'
w build.gradle i umieścić-dontnote
go 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ć.proguard option -printconfiguration config.txt
?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. :)
źródło
Możesz powiedzieć gradle, aby nie zezwalał na zduplikowane klasy (wybierz tylko pierwszą), dodając do pliku build.gradle:
źródło
android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }
alejar {
jest zadaniem we wtyczce java gradle, więc jeśliapply 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.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' }
źródło