Ich führe meinen ProGuard für mein Android-Projekt aus und erhalte die folgenden Warnungen:
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.
Ich habe hier gefunden , um dies zu beheben, indem ich es ignoriere mit:
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-keep class android.net.http.** { *; }
-dontwarn android.net.http.**
Ich sehe keine Möglichkeit, die Duplikate aus den verwendeten Bibliotheken zu entfernen. Auch nach Gebrauch dontwarn
der Warnungen nicht verschwinden.
Ist dies der richtige Weg, um mit dieser Warnung umzugehen, indem Sie sie einfach ignorieren, oder könnte dies zu Problemen führen?
progaurd
RegeldateiAntworten:
Wenn Sie eine Proguard-Option hinzufügen, werden Proguard-Optionen
-printconfiguration config.txt
angezeigtIhre duplizierten Klassen (z. B. SslError) werden sowohl in android.jar als auch in org.apache.http.legacy.jar dargestellt
Proguard fügt ein zweites Glas hinzu, auch wenn Sie dies nicht tun.
useLibrary 'org.apache.http.legacy'
Hier ist ein offener Fehler , der das Problem beschreibt.Jetzt können wir mit dem Problem nichts mehr anfangen. Ignoriere es einfach:
Es ist nicht erforderlich, die Klassen zu behalten, solange sie sich im Bibliotheksglas befinden (tatsächlich in der Telefonbibliothek). dontwarn funktioniert nicht, weil es keine Warnung ist, sondern eine Notiz.
quelle
useLibrary 'org.apache.http.legacy'
in build.gradle zu platzieren und Ihre-dontnote
in die Proguard-Datei zu platzieren. Aber immer noch Probleme. Ich habe API 22 verwendet, hat gut funktioniert. Jetzt aktualisiere ich auf 23 und erhalte diese Fehler, wenn ich versuche, das signierte zu erstellen. Manchmal funktioniert die Note auf unbestimmte Zeit. Ich weiß nicht, was ich sonst tun soll.proguard option -printconfiguration config.txt
?Wahrscheinlich haben Sie "-injars" und -libraryjars "in Ihrer proguard-project.txt erwähnt, da das neueste Build-System dafür sorgt, dass sie für Sie erwähnt werden. Sie müssen es also nicht noch einmal erwähnen.
Quelle: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass
Ich denke das wird helfen. :)
quelle
Sie können gradle anweisen, keine doppelten Klassen zuzulassen (nehmen Sie nur die erste), indem Sie Ihrem build.gradle Folgendes hinzufügen:
quelle
android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }
aber ich erhalte den Fehler Fehler: Gradle DSL-Methode nicht gefunden: 'jar ()'jar {
ist eine Aufgabe innerhalb des Gradle-Java-Plugins. Wenn Sie dies tun,apply plugin: 'java'
sollten Sie in der Lage sein, diesen JAR-Block zu verwenden. es geht nicht in einen anderen Block; Es befindet sich auf der Stammebene des build.gradle. ( siehe dieses Gradle-Dokument ) Ich habe es in einer App verwendet, bin mir aber nicht sicher, ob das wichtig ist.Sie können dies in Ihrem build.gradle für alles versuchen, was in den Protokollen als doppelt angegeben ist. Ich bin mir nicht sicher, ob dies funktionieren wird. Probieren Sie es aus und informieren Sie, ob es funktioniert oder nicht.
packagingOptions { exclude 'android.net.http.SslCertificate' }
quelle