2015-10-09 11 views
60

Ich betreibe meine ProGuard für mein Android-Projekt und erhalten die folgenden Warnungen:ProGuard: doppelte Definition der Bibliotheksklasse?

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 here dies mit mit zu ignorieren, es zu beheben gefunden:

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

Ich habe keinen Weg sehen, die entfernen Duplikate aus den verwendeten Bibliotheken. Auch nach der Verwendung von dontwarn verschwinden die Warnungen nicht.

Ist dies der richtige Weg, um diese Warnung zu ignorieren, wenn man sie ignoriert oder könnte dies zu Problemen führen?

+0

es scheint, dass Sie einige Klassen aus mehrere Bibliothek importiert. Sie könnten Android-Bibliothek jar innerhalb von Proguard Config hinzufügen – Adem

+1

Könnten Sie bitte ein Beispiel dafür posten. Android plrguard def sagt, dass Sie nicht verwenden sollten: libraryjars. Siehe: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass – confile

+0

poste deine 'progaurd' Regeldatei –

Antwort

5

Wahrscheinlich, die Sie erwähnt haben „-injars“ und -libraryjars“in Ihrem proguard-project.txt, die neueste Build-System unter Berücksichtigung kümmert sie zu erwähnen für Sie ..so Sie brauchen nicht wieder, es zu erwähnen.

Quelle: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

denke ich, das wird helfen :)

+1

Nun, ich bin in einem ziemlich neuen Android Studio (1. Dezember 2015 Build) und niemand kümmert sich darum, sie für mich zu erwähnen. Fehle ich etwas Einfaches? – aasu

59

Wenn Sie -printconfiguration config.txt eine proguard Option hinzufügen, werden Sie proguard fügt

sehen.

Ihre duplizierten Klassen (z. SslError) wird sowohl in android.jar präsentiert und org.apache.http.legacy.jar

Proguard fügt zweites Glas, auch wenn Sie dies nicht tun useLibrary 'org.apache.http.legacy' Hier ein open bug ist, das Problem zu beschreiben.

So jetzt können wir nichts mit dem Problem tun. Einfach ignorieren:

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

Es gibt keine Notwendigkeit, die Klassen zu halten, solange sie in der Bibliothek jar (Telefon Bibliothek tatsächlich) befinden. dontwarn funktioniert nicht, weil es keine Warnung ist, es ist eine Notiz.

+4

Großartig! Vielen Dank. Diese Antworten sollten als richtig markiert werden! –

+0

Ich habe versucht, 'useLibrary 'org.apache.http.legacy' in * build zu platzieren.grelle * und lege deine '-dontnote' in die Proguard-Datei. Aber immer noch Probleme bekommen. Ich benutzte API 22, funktionierte gut. Jetzt upgrade ich auf 23, bekomme ich diese Fehler, wenn ich versuche, das Signierte zu erstellen. Manchmal funktioniert die Note für unbestimmt. Ich weiß nicht, was ich sonst tun soll. – wviana

-5

Sie können dies in Ihrem build.gradle für alles versuchen, das in den Protokollen doppelt angezeigt wird. Ich bin mir nicht sicher, ob das funktioniert, also probier es aus und informiere ob es funktioniert oder nicht.

packagingOptions { 
     exclude 'android.net.http.SslCertificate' 
    } 
+1

Lol, das wird nicht funktionieren Kumpel. –

1

Sie können gradle sagen keine doppelten Klassen zu ermöglichen (nur die ersten nehmen), indem Sie die folgenden in der build.gradle:

jar { 
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE 
} 
+0

Welcher Build.gradle? Projekt oder App? wenn App, unter welchem ​​Block platzierst du es? Ich habe versucht, es in meine App Build.gradle Android Block 'android {jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }' aber ich bekomme den Fehler ** Fehler: Gradle DSL-Methode nicht gefunden: 'jar() '** –

+0

'jar {' ist eine Aufgabe innerhalb des Java-Plugins von gradle. Wenn Sie also das Plugin' java' anwenden, sollten Sie diesen jar-Block verwenden können; es geht nicht in einen anderen Block; Es befindet sich auf der Stammebene von build.gradle. ([siehe dieses Dokument)] (https://docs.gradle.org/current/userguide/java_plugin.html#sec:jar)) Ich habe es in einer App verwendet, bin mir aber nicht sicher, ob das wichtig ist. – voxoid

+0

ok, ich habe jetzt verstanden –

Verwandte Themen