Android Studio:解决重复的类

时间:2016-05-02 19:21:54

标签: android gradle android-gradle build.gradle loopj

当我在Android设备上尝试run我的Android应用程序时,gradle控制台会报告以下错误:

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

当我搜索“AsyncHttpClient”类时,我发现它确实存在于两个不同的位置:

/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

第一条路径似乎暗示它是一个“缓存”文件...所以我尝试了invalidating & restarting my cache,但是在重建gradle之后这两个文件仍然存在,我尝试run应用。我已经在备用posts中读到它可以通过删除其中一个文件来解决...所以我去了缓存位置并删除了在“1.4.9”文件夹中找到的所有文件...不幸重新打开Android Studio后,会创建一个新的缓存文件,我会收到同样的错误。

其他帖子(herehereherehere)建议如果我将“./gradlew clean”添加到根目录,它会重建gradle再次只是为了运行(据我所知)。所以我也尝试过这样做:

enter image description here

这使我的应用程序的文件夹看起来像这样:

enter image description here

但不幸的是,这对我仍然得到同样错误的事情没有帮助。我究竟做错了什么?我该怎么办?

7 个答案:

答案 0 :(得分:1)

因为你在libs文件夹中添加了两次库,所以当libs文件夹中有相同库的多个版本时,有时会发生这种情况。检查并删除任何重复的jar文件。

和第二个选项可能是您还在gradle.build中添加了依赖项,并且在libs文件夹中也有jar。

因此请检查这两个位置并删除重复的条目,然后再清除并再次构建APK

希望有所帮助

答案 1 :(得分:1)

删除libs文件夹中具有重复jar扩展名的文件。但是,如果没有重复文件并且仍然存在"Duplicate classes"错误,请在错误部分的“重复类....”子句的其余部分中查找名称。例如,"duplicated classes 'dagger' bla bla"。从'dagger'文件夹中删除名为libs的文件。 (请注意不要通过shift删除它。)

答案 2 :(得分:0)

在我的情况下,我在我的gradle中使用了sensorocloud.jarcompile 'com.loopj.android:android-async-http:1.4.9',这导致了与您相同的错误。因为sensoro cloud SDK使用了loopj' s async-http

我设法通过手动删除jar文件中的重复.class文件来解决它。 (即

  1. 将扩展名从jar更改为zip
  2. 提取它
  3. 删除com.loopj.android .class个文件)
  4. (P.S。我试图通过网络搜索,看看我是否可以在gradle中排除某个类的jar,但没有成功,例如我引用了this SO post

答案 3 :(得分:0)

有时重复类异常意味着您的一个依赖项隐式使用了您还在项目中使用的某些库的旧版本或更新版本(带有+),

要解决此问题,您可以将以下代码块(在'force'之后放入库版本)添加到build.gradle文件(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'
      }
   }
}

您还可以从依赖项中排除某些组。 对于单个依赖项,您可以这样写:

dependencies {

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

经过测试,可以在具有Gradle插件版本3.4.2和Gradle版本5.4.1的Android Studio上使用。 感谢gradle org讨论组的Dimitar Dimitrov和SchalkCronjé

答案 4 :(得分:0)

检查您的项目是否 build.gradle。可能有一些 Maven 重复依赖

答案 5 :(得分:0)

此错误可能由多种原因引起;

  1. 错误配置的包名称
  2. 没有很好绑定的活动视图。 - 只需转到您的启动器活动视图并确保上下文定义良好,例如“com.yourdomain.package”
  3. 重新创建您的 BuildConfig 并进行良好设置。

答案 6 :(得分:0)

我将此行添加到我的 gradle.properties 文件并且我的应用程序运行了

android.enableJetifier=true