2015-10-09 15 views
60

ho eseguito il mio ProGuard per il mio progetto Android e ottenere i seguenti avvisi:ProGuard: definizione duplicata della classe della libreria?

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. 

ho trovato here di risolvere questo problema con ignorando con:

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

Non vedo un modo per rimuovere il duplicati dalle librerie utilizzate. Anche dopo aver usato dontwarn gli avvisi non scompaiono.

È questo il modo corretto di gestire questo avviso semplicemente ignorandolo o questo potrebbe causare problemi?

+0

sembra è stata importata alcune classi dalla libreria multipla. è possibile aggiungere un contenitore di libreria Android all'interno di proguard config – Adem

+1

Potrebbe per piacere pubblicare un esempio per questo. Android plrguard def dice che non dovresti usare: libraryjars. Vedi: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass – confile

+0

pubblica il tuo file di regole 'progaurd' –

risposta

5

Probabilmente, hai citato "-injars" e -libraryjars" nel vostro Proguard-project.txt, considerando l'ultimo sistema di compilazione si prende cura di loro citare per voi ..quindi non avete bisogno di parlare di nuovo.

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

credo che questo aiuterà :)

+1

Beh, sono su Android Studio abbastanza nuovo (costruzione 1 dicembre 2015) e nessuno si occupa di menzionarli per me. Mi sto perdendo qualcosa di semplice? – aasu

59

Se si aggiunge l'opzione Proguard -printconfiguration config.txt vedrete Proguard aggiunge

.

le tue classi duplicate (ad es. SslError) sono presentati in entrambi android.jar e org.apache.http.legacy.jar

Proguard aggiunge secondo vaso, anche se non useLibrary 'org.apache.http.legacy' Ecco un open bug che descrive il problema.

Quindi ora non possiamo fare nulla con il problema. Basta ignorarlo:

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

v'è alcuna necessità di mantenere le classi fino a quando si trovano in vaso biblioteca (biblioteca del telefono in realtà). dontwarn non funziona perché non è un avvertimento, è una nota.

+4

Ottimo! Grazie. Queste risposte dovrebbero essere contrassegnate come corrette! –

+0

Ho appena provato a inserire 'useLibrary 'org.apache.http.legacy'' in * build.gradle * e posiziona il tuo '-dontnote' nel file proguard. Ma ancora problemi. Stavo usando l'API 22, stava funzionando bene. Ora eseguo l'upgrade in 23, ricevo questi errori durante il tentativo di creare il firmato. Alcune volte il grado funziona a tempo indeterminato. Non so cos'altro fare. – wviana

-5

Puoi provare questo nel tuo build.gradle per tutto ciò che è indicato come duplicato nei registri. Non sono sicuro che funzioni, quindi provalo e informa se funziona o meno.

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

Lol, questo non funzionerà. –

1

Si può dire Gradle di non consentire le classi duplicate (prendono solo il primo) aggiungendo quanto segue al build.gradle:

jar { 
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE 
} 
+0

Quale build.gradle? progetto o app? se l'app, sotto quale blocco la metti? ho provato a metterlo nel blocco android build.gradle della mia app 'android {jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }' ma ottengo l'errore ** Errore: metodo Gradle DSL non trovato: 'jar() '** –

+0

'jar {' è un'attività all'interno del plugin java gradle, quindi se si applica plugin:' java'', si dovrebbe essere in grado di utilizzare quel blocco jar; non va dentro un altro blocco; è al livello principale di build.gradle. ([vedi questo gradle doc] (https://docs.gradle.org/current/userguide/java_plugin.html#sec:jar)) L'ho usato in un'app, ma non sono sicuro che sia importante. – voxoid

+0

ok, ora capisco –

Problemi correlati