ProGuard: doppelte Definition der Bibliotheksklasse?

83

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 dontwarnder 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?

konfile
quelle
Anscheinend haben Sie einige Klassen aus mehreren Bibliotheken importiert. Sie können Android Library Jar innerhalb der Proguard-Konfiguration hinzufügen
Adem
1
Könnten Sie bitte ein Beispiel dafür posten. Android plrguard def sagt, dass Sie nicht verwenden sollten: libraryjars. Siehe: proguard.sourceforge.net/manual/…
Confile
Veröffentlichen Sie Ihre progaurdRegeldatei
NJ
@confile hast du dein Problem gelöst?
NickUnuchek
Ich habe dieses Problem gelöst, indem ich die Apache-Bibliothek aus meinem Projekt entfernt und durch meinen eigenen Code ersetzt habe.
Ban-Geoengineering

Antworten:

96

Wenn Sie eine Proguard-Option hinzufügen, werden Proguard-Optionen -printconfiguration config.txtangezeigt

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

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

Ihre 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:

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

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.

Flavio
quelle
6
Toll! Vielen Dank. Diese Antwort sollte als die richtige markiert werden!
Radim Vaculik
Ich habe gerade versucht, useLibrary 'org.apache.http.legacy'in build.gradle zu platzieren und Ihre -dontnotein 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.
Wviana
Wo füge ich diese Option hinzu proguard option -printconfiguration config.txt?
MML
In der Kommandozeile haben Sie Proguard ausgeführt. Die config.txt wird im aktuellen Ordner erstellt
Flavio
6

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. :)

Sankalp Pandya
quelle
1
Nun, ich bin in einem ziemlich neuen Android Studio (Build vom 1. Dezember 2015) und niemand kümmert sich darum, sie für mich zu erwähnen. Vermisse ich etwas Einfaches?
Aasu
1

Sie können gradle anweisen, keine doppelten Klassen zuzulassen (nehmen Sie nur die erste), indem Sie Ihrem build.gradle Folgendes hinzufügen:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Voxoid
quelle
1
Welches build.gradle? Projekt oder App? Wenn App, unter welchen Block stellen Sie es? Ich habe versucht, es in den Build.gradle-Android-Block meiner App zu setzen, android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }aber ich erhalte den Fehler Fehler: Gradle DSL-Methode nicht gefunden: 'jar ()'
Edijae Crusar
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.
Voxoid
-7

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'
    }
Amit Tiwari
quelle