Android Studio :解决重复类

2guxujil  于 2022-12-21  发布在  Android
关注(0)|答案(8)|浏览(221)

当我尝试在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,只是为了运行(据我所知)。

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

但不幸的是,这并没有帮助的事情,我仍然得到同样的错误,我做错了什么?我应该做什么?

ndasle7k

ndasle7k1#

我将这一行添加到我的gradle.properties文件中,我的应用程序就可以工作了
android.enableJetifier=true

gz5pxeao

gz5pxeao2#

有时候,重复类异常意味着您的依赖项之一隐式使用了您在项目中也使用的某个库的较旧或较新(带+)版本,
要解决此问题,您可以添加这样的代码块(将您的库版本放在'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'
    }
}

已通过测试,可在Android Studio上运行Gradle插件版本3.4.2和Gradle版本5.4.1。感谢Gradle org讨论组的Dimitar Dimitrov和沙尔克Cronjé

trnvg8h3

trnvg8h33#

这是因为你已经在libs文件夹中添加了两次库,当你在libs文件夹中有同一个库的多个版本时,有时会发生这种情况。检查一下并删除任何重复的jar文件。
第二种选择是,您还可以在gradle.build中添加依赖项,并在libs文件夹中添加一个jar。
因此,请检查这两个位置并删除重复的条目,然后再次清理并构建APK

xwmevbvl

xwmevbvl4#

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

y53ybaqx

y53ybaqx5#

在我的例子中,我使用的是sensorocloud.jar和我的gradle中的compile 'com.loopj.android:android-async-http:1.4.9',这导致了与您相同的错误,因为sensoro云SDK使用了loopj的async-http
我设法解决它手动删除重复的.class文件在jar文件.(即.
1.将扩展名从jar更改为zip
1.提取它
1.删除com.loopj.android.class文件)
(P.S.我曾尝试在网上搜索,看看是否可以在Gradle中排除某个jar的某个类,但没有成功,例如,我引用了this SO post

p1iqtdky

p1iqtdky6#

检查您的项目是否为build.gradle。其中可能存在某些maven重复依赖项

k0pti3hp

k0pti3hp7#

此错误可能由以下几个原因引起:
1.错误配置的软件包名称
1.活动视图没有很好地绑定。-只需转到您的启动器活动视图并确保上下文定义良好,例如“com.yourdomain.package”
1.重新创建您的BuildConfig并对其进行良好设置。

koaltpgm

koaltpgm8#

在mergeDexClasses任务期间,还有一种可能导致重复类的情况,这可能会在更高版本的android gradle中发生。
如果您的build.gradle.kts脚本具有以下形式的依赖项:
实现(项目(“:mylib”,配置=“默认”))
这会导致类重复。更正很简单。只需将其更改为:
实现(项目(:mylib”))

以下是Android Studio团队的解释:

同时拥有项目(“:lib”)和项目(路径:“:lib”,配置:“default”)意味着AGP同时获得build/classes/java/main和build/libs/lib.jar(run ./gradlew:lib:outgoingVariants --所有这些都需要验证)。1个增量生成build/.transforms下的每个类的dex(一个处理目录),另一个生成单个dex(一个处理jar)。稍后在合并过程中,这会导致失败。AGP从不发布到默认配置,事实上,Java库插件这样做只是为了不破坏旧的构建脚本。不建议在依赖项声明中使用显式配置名称,而应使用Gradle属性。

在一个旧版本的AGP中,我遇到了一个问题,添加配置值“default”修复了我遇到的一些问题。嗯,那不再起作用了,添加“default”配置会得到重复的类。

相关问题