web-dev-qa-db-fra.com

Android Studio: résolution des classes en double

Lorsque j'essaie de run mon Android sur un appareil Android, la console Gradle signale l'erreur suivante:

Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.Android.build.api.transform.TransformException: Java.util.Zip.ZipException: duplicate entry: com/loopj/Android/http/AsyncHttpClient$1.class

Lorsque je recherche la classe "AsyncHttpClient", je constate qu'elle se trouve effectivement dans deux emplacements distincts:

/Users/Afflatus/.gradle/caches/modules-2/files-2.1/com.loopj.Android/android-async-http/1.4.9/5d171c3cd5343e5997f974561abed21442273fd1/Android-async-http-1.4.9-sources.jar!/com/loopj/Android/http/AsyncHttpClient.Java

/Users/Afflatus/.ideaLibSources/Android-async-http-1.4.9-sources.jar!/com/loopj/Android/http/AsyncHttpClient.Java

Le premier chemin semble suggérer qu'il s'agit d'un fichier "cache" ... j'ai donc essayé invalidating & restarting my cache, mais les deux fichiers sont toujours là après la reconstruction du gradle et j'essaie de run l'application. J'ai lu dans un autre posts qu'il peut être résolu en supprimant l'un des fichiers ... Je suis donc allé à l'emplacement du cache et j'ai supprimé tous les fichiers trouvés dans le dossier "1.4.9". .. malheureusement après la réouverture Android Studio, un nouveau fichier cache est créé et j'obtiens la même erreur.

D'autres articles ( ici , ici , ici et ici ) suggèrent si j'ajoute "./gradlew clean" dans le répertoire racine, il reconstruirait à nouveau le gradle juste pour la course (pour autant que je sache). J'ai donc essayé de faire ça aussi:

enter image description here

Ce qui faisait que le dossier de mon application ressemblait à ceci:

enter image description here

Mais malheureusement, cela n'a pas aidé les choses, je reçois toujours la même erreur. Qu'est-ce que je fais mal? Que dois-je faire?

9
Afflatus

c'est parce que vous avez ajouté deux fois la bibliothèque dans le dossier libs, cela peut parfois arriver lorsque vous avez plusieurs versions de la même bibliothèque dans le dossier libs. Vérifiez-le et supprimez tout fichier jar en double.

et la deuxième option pourrait être que vous avez également ajouté la dépendance dans gradle.build et ont également jar dans le dossier libs.

Vérifiez donc les deux emplacements et supprimez les entrées en double et nettoyez et générez à nouveau APK.

J'espère que ça aide

5
Max

Dans mon cas, j'utilise sensorocloud.jar Et le compile 'com.loopj.Android:android-async-http:1.4.9' Dans mon gradle, ce qui a causé la même erreur que la vôtre. Parce que le SDK cloud sensoro a utilisé le async-http De loopj.

J'ai réussi à le résoudre en supprimant manuellement les fichiers .class En double dans le fichier jar. (c'est à dire.

  1. changer l'extension de jar en Zip
  2. l'extraire
  3. supprimer les fichiers com.loopj.Android.class)

(PS, j'ai essayé de chercher sur le Web pour voir si je pouvais exclure certaines classes d'un pot en gradle, mais sans succès, par exemple j'ai référencé this SO post )

0
David Cheung

Supprimez les fichiers avec des extensions jar en double dans le dossier libs. Cependant, s'il n'y a pas de fichiers en double et qu'il y a toujours un "Duplicate classes" error, recherchez le nom dans le reste de la clause "Duplicate classes ...." dans la section error. Par exemple, "duplicated classes 'dagger' bla bla". Supprimez le fichier nommé 'dagger' du dossier libs. (Attention à ne pas le supprimer avec shift.)

0
Geylani ARCA

Parfois, l'exception de classes en double signifie que l'une de vos dépendances utilise implicitement la version plus ancienne ou plus récente (avec +) d'une bibliothèque que vous utilisez également dans votre projet,

Pour résoudre ce problème, vous pouvez ajouter un tel bloc de code (mettez la version de votre bibliothèque après 'force') à ton build.gradle fichier (Module: app):

configurations {
   all {
      resolutionStrategy {
          // do not upgrade above 3.12.0 to support API < 21 while server uses
          // COMPATIBLE_TLS, or okhttp3 is used in project
          force 'com.squareup.okhttp3:okhttp:3.12.0'
          force 'com.squareup.okhttp3:logging-interceptor:3.12.0'
      }
   }
}

Vous pouvez également exclure un groupe de vos dépendances. Pour une seule dépendance, vous écrivez:

dependencies {

    // example
    implementation('log4j:log4j:1.2.15') {
        exclude group: 'javax.jms', module: 'jms'
    }
}

Testé pour fonctionner sur Android Studio avec Gradle Plugin version 3.4.2 et version Gradle 5.4.1. Les crédits vont à Dimitar Dimitrov et Schalk Cronjé du groupe de discussion Gradle org

0
Denis Dmitrienko