来自androidx和com.android.support的重复类

92

最近我更新了我的Android Studio(以及我相信是Gradle版本),现在在尝试编译我的项目时出现了大量错误。下面是当前困扰我的一个错误信息:

Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:26.1.0)

这之后会有很多类似的内容。

我尝试删除所有使用com.android.support的地方,改成androidx(参见此处以了解我要替换的内容),但是就算我删除了库,com.android.support库仍然在使用,当我再次尝试编译时它们会被重新生成。

这里是我得到的完整错误链接。


你是否清除了缓存并重新启动?另外,你可能需要查看XML文件,并确保支持库控件已被替换为AndroidX控件。 - karan
我也遇到了同样的错误,唯一不同的是,我正在尝试添加第三方依赖项。现在我已经尝试使用配置来排除重复的类,但没有任何改变。 - Kashif K.
@KaranMer 我还没有使缓存失效,但我已经尝试了多次清理、重建和重新启动。我现在正在尝试hannes ach的答案,如果那行不通,我会尝试你建议的方法。你能解释一下最后一部分吗?你所说的“控件”是什么意思?我对这种东西还比较新。 - TheKingElessar
@TheKingElessar,你解决了这个问题吗?我也遇到了同样的问题。如果你有什么建议,请告诉我。 - Vishwa Pratap
如何在Androidx Security中使用旧的Android支持库? - Ashish M
显示剩余2条评论
6个回答

181

将以下代码添加到您的gradle.properties文件中:

android.useAndroidX=true
android.enableJetifier=true

如果缺少gradle.properties文件,请在您的项目根目录中创建该文件。
看起来您的依赖关系中存在一些support遗物,可能来自某个库?要调查并查看依赖关系树,请运行以下命令:
./gradlew :yourApp:dependencies

然后你看它来自哪里。


3
哇,成功了!我猜测 android.useAndroidX=true 完全阻止了任何 com.android.support 的使用,这样我就可以找到它的使用位置(因为新错误提示)!我的应用程序仍然会崩溃,但至少现在可以编译了! :D - TheKingElessar
4
如果在根项目目录中找不到gradle.properties文件,只需创建一个名为"gradle.properties"的文件,然后在其中添加"android.useAndroidX=true android.enableJetifier=true"。这个方法解决了我的问题。 - Hitesh Bisht
1
我正在使用React Native,并且启用Jetifier会产生更多的错误。只是为了让任何访问者知道:这对于某些项目依赖于支持库的React Native项目不起作用。 - Can Poyrazoğlu
2
我不想迁移androidX,是吗? - Prince Dholakiya
@Prince 除非你指的是 Can Poyrazoglu 所说的内容,否则你可能确实需要进行迁移。 - TheKingElessar
@DitaAjiPratama请阅读第一行,“我希望你的gradle.properties文件中有这两行代码:” - hannes ach

11
在您的应用程序 build.gradle 中,您使用了旧的支持库和新的支持库构件的混合。从您的 build.gradle 中删除其中一个以解决此问题。
旧的构件: com.android.support:support-compat 相应的新构件: androidx.core:core:1.0.0 请参阅此页面以获取有关迁移到 AndroidX 的更多信息

7

就像其他人所说的那样,解决方案是迁移到AndroidX,对我有效。但是这并不容易,并且需要一些耐心...以下是我所做的步骤:

  • 首先,非常重要的是你要在不同的分支中进行所有这些更改,或者备份你的项目。

  • 您需要具有Android Gradle Plugin Version 3.5.1。因此,在build.gradle中设置:

dependencies {
    classpath 'com.android.tools.build:gradle:3.5.1'
}
  • 使用Android Studio工具迁移到AndroidX:重构-->迁移到AndroidX...
  • 迁移完成后,已经完成了所有相关修改,但是可能会因为出现错误而无法正确部署项目。以下是我发现的问题及解决方案:

  • 如果你使用Kotlin,则需要在build.gradle中设置:

buildscript {
    ext.kotlin_version = '1.3.10'
}

并且
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
  • 如果您使用destination方法,请添加"file"参数:destination file("$reportsDir/checkstyle/checkstyle.xml")
  • 如果您使用Butterknife,请使用10.0.0版本
  • 最后,执行Build --> Clean ProjectBuild --> Rebuild Project

3
如果您在使用Facebook Mediation和Google广告库后遇到重复类的问题,请按照以下步骤操作: 1- 在build.gradle(Module)文件的顶部添加以下内容:
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.gms.google-services'

2- 将以下代码添加到 build.gradle(Module) -> android 中:

 packagingOptions {
        exclude "META-INF/DEPENDENCIES"
    }

3- 在build.gradle(Module)中添加以下内容 -> dependencies

    //firebase bom
    implementation platform('com.google.firebase:firebase-bom:29.2.0')
    implementation 'com.google.firebase:firebase-crashlytics'
    implementation 'com.google.firebase:firebase-analytics'
    implementation 'com.google.firebase:firebase-messaging:23.0.1'

    //ADS
    def ads_version = "20.6.0"
    implementation "com.google.android.gms:play-services-ads:$ads_version"

    //facebook ads
    implementation 'com.google.ads.mediation:facebook:6.8.0.0'

4- 在 build.gradle(Project ) -> buildscript -> dependencies 中添加以下内容

classpath "com.android.tools.build:gradle:7.0.4"
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'

5- 将以下内容添加到 gradle.wrapper.propertise 文件中

#Wed Dec 16 15:32:03 PKT 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-7.0.2-bin.zip

3

我认为这个解决方案最适合我。 迁移到androidX

https://developer.android.com/jetpack/androidx/migrate

使用Android Studio 3.2及更高版本,您可以通过从菜单栏中选择“重构”>“迁移到AndroidX”来将现有项目迁移到AndroidX。

重构命令使用了两个标志。 默认情况下,这两个标志在gradle.properties文件中都设置为true:

android.useAndroidX=true Android插件使用适当的AndroidX库,而不是支持库。 android.enableJetifier=true Android插件通过重写其二进制文件自动迁移现有的第三方库以使用AndroidX。


0

我在我的 Ionic 项目中遇到了同样的问题,在卸载 android.support.v4 后,构建应用程序可以正常工作,没有任何问题。

除此之外,在你的 gradle 中还要有以下属性:

android.useAndroidX=true android.enableJetifier=true

如果您想迁移到AndroidX,也可以从重构 -> 迁移到AndroidX进行操作。

以便成功构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接