web-dev-qa-db-fra.com

ProGuard: définition en double de la classe de bibliothèque?

Je lance mon ProGuard pour mon projet Android et reçois les avertissements suivants: 

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.

J'ai trouvé ici pour résoudre ce problème en l'ignorant avec: 

-keep class org.Apache.http.** { *; }
-dontwarn org.Apache.http.**
-keep class Android.net.http.** { *; }
-dontwarn Android.net.http.**

Je ne vois pas un moyen de supprimer les doublons des bibliothèques utilisées. Même après avoir utilisé dontwarn, les avertissements ne disparaissent pas.

Est-ce la bonne façon de gérer cet avertissement en l'ignorant ou est-ce que cela pourrait engendrer des problèmes? 

74
confile

Si vous ajoutez une option de proguard -printconfiguration config.txt, vous verrez que proguard ajoute 

-libraryjars 'D:\tools\Android\plates-formes\Android-23\Android.jar'

-libraryjars 'D:\tools\Android\plates-formes\Android-23\facultatif\org.Apache.http.legacy.jar'

vos classes dupliquées (par exemple, SslError) sont présentées à la fois dans Android.jar et dans org.Apache.http.legacy.jar

Proguard ajoute un deuxième fichier jar même si vous n'avez pas useLibrary 'org.Apache.http.legacy'Voici un open bug décrivant le problème.

Alors maintenant, nous ne pouvons rien faire avec le problème. N'y faites pas attention:

-dontnote Android.net.http.*
-dontnote org.Apache.commons.codec.**
-dontnote org.Apache.http.**

Il n'est pas nécessaire de conserver les classes tant qu'elles se trouvent dans la bibliothèque jar (la bibliothèque du téléphone en fait). dontwarn ne fonctionne pas car ce n'est pas un avertissement, c'est une note.

87
Flavio

Probablement, vous avez mentionné "-injars" et -libraryjars "dans votre fichier proguard-project.txt, étant donné que le dernier système de construction prend soin de les mentionner pour vous.

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

Je pense que ça aidera.:) 

6
Sankalp Pandya

Vous pouvez dire à gradle de ne pas autoriser les classes en double (prenez seulement la première) en ajoutant ce qui suit à votre build.gradle:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
0
voxoid