在模块类中找到重复的类android.support.v4.app.INotificationSideChannel?


75

我正在开发新闻应用程序,但是从gradle控制台中收到以下错误

(androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub$Proxy found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub$Proxy found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$1 found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$MyResultReceiver found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$MyRunnable found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.core.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.core.internal.package-info found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.versionedparcelable.CustomVersionedParcelable found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.NonParcelField found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelField found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelImpl found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelImpl$1 found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelUtils found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel$1 found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel$ParcelException found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelParcel found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream$FieldBuffer found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream$InputBuffer found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelable found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelize found in modules class

在我的app.gradle下面

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    implementation 'com.github.bassaer:chatmessageview:2.0.1'
    implementation 'com.google.code.gson:gson:2.8.5'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}


您的项目(或其子项目之一)在末尾使用+加号来引用依赖项。检查任务':app:checkDebugDuplicateClasses'的执行答案是否失败(尽管该问题与Ionic有关,但答案应该可行)。
顶级

Answers:


153

您可以在gradle.properties文件中添加以下几行:

android.useAndroidX=true
android.enableJetifier=true

细节:

如果要androidx在新项目中使用-namespaced库,则需要将编译SDK设置为Android 9.0(API级别28)或更高版本,并将上述两个Android Gradle插件标志都设置为true

android.useAndroidX:当此标志设置true为时,Android插件将使用适当的AndroidX库而不是支持库。false如果未指定该标志,则默认为该标志。

android.enableJetifier:当此标记设置true为时,Android插件会通过重写二进制文件来自动迁移现有的第三方库以使用AndroidX依赖项。false如果未指定该标志,则默认为该标志。


3
您可以添加更多有关此功能的更多信息吗?
内森·F

3
@NathanF。这是因为混合了支持库。通过添加以下行作为选定的androidX支持库
Anice Jahanjoo,

3
这只会android.support.*androidx.*依赖关系强行替换任何依赖关系(但是对我来说,这只是导致编译错误,因为android.support在代码中使用了该错误),以防万一有人在寻求修复而非解决方法,请检查任务'执行失败的答案:app:checkDebugDuplicateClasses'(尽管该问题与Ionic有关,但答案应该有效)。
顶级

对我来说同样的错误。而且我没有使用androidX库,但默认情况下是在编译时添加的。请帮我。
Er.nishka '19

2
@nicej我能够通过从菜单栏中选择“重构”>“迁移到AndroidX”来解决此问题。谢谢。
Pablo Alfonso,

11

将这些行添加到gradle.properties文件中可解决“重复类”错误:

android.useAndroidX=true

android.enableJetifier=true

但是,这在我的项目中产生了新的错误:

“程序包android.support.annotation不存在”

“找不到符号类片段”

“程序包android.support.v4.content不存在”

“程序类型已经存在”

等等

但是,重构对我有用:

Migrate your project to AndroidX by selecting Refactor > 
"Migrate to AndroidX" from the menu bar.

Select Build > Clean project

Restore Android Studio

现在,我的项目(Match4app)可与AndroidX一起使用,并且可以在PlayStore中发布它而没有任何问题。

评论:此任务还使我能够升级所有其他依赖AndroidX的库(即com.firebaseui:firebase-ui-auth:6.0.2,com.google.android.gms:play-services-games:18.0.1, com.google.android.gms:play-services-auth:17.0.0,com.google.android.gms:play-services-ads:18.2.0等)。


11

我碰到这样的事情,下面是基于我的其他答案

您的项目(或其子项目之一)在末尾使用+加号来引用依赖项,例如com.google.firebase:firebase-auth:+,这意味着在可能的情况下使用任何更高版本,而较新的版本不再使用android.support库,而是使用androidx; 要解决此问题,请执行以下步骤。

脚步:

  1. 确保设置了ANDROID_HOME环境变量,然后打开控制台窗口(如git-bash,因为它保留了整个命令的输出),并cd进入项目的android目录(对于Ionic项目,应为platforms/android)。
  2. 首先,通过在git-bash中运行以下命令列出所有依赖项
    ./gradlew :app:dependencies
    
  3. 将结果复制到您首选的文本编辑器中,然后搜索androidx
  4. 如果发现有问题,请执行以下步骤,否则就完成了!(并且您无需重复这些步骤)。
  5. 向上滚动直到在任何行的末尾看到->,例如example16.0.8 -> 19.0.0+ -> 19.0.0,这都意味着该版本是自动解析的(由于+,其版本比您指定的要高)。
  6. 因此,手动设置版本:
    • 如果可能,在您的项目(或子项目)中查找+并将其替换为特定版本。
    • 或者,强制如下所述的依赖项的特定版本。
  7. 最后,重复上述步骤(而不是第一步,而是clear控制台)。

强制特定版本的依赖项,请在根build.gradle文件中添加如下所示的内容(这对我有用),但是请在下面进行编辑并添加您自己的规则(因为这些规则可能不适用于您的情况):

allprojects {
  // ...
  configurations.all {
    resolutionStrategy {
      force 'com.google.firebase:firebase-common:17.0.0'
      force 'com.google.android.gms:play-services-basement:16.2.0'
      force 'com.google.firebase:firebase-iid:16.0.0'
      force 'com.google.firebase:firebase-auth:17.0.0'
    }
  }
}

2

在此处输入图片说明

取自这里。AndroidX是Android团队用来在Jetpack中开发,测试,打包,版本和发布库的开源项目。


2

就像@Ahmed所说的那样,解决方案是实现AndroidX,它对我有用。但是,这不是一个简单的方法,需要一些耐心...这些是我做的步骤:

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

  • 您需要拥有Android Gradle插件版本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("$reportsDir/checkstyle/checkstyle.xml")
  • 如果使用Butterknife,请使用10.0.0版本

0

仅当您可以降级到特定版本时,顶级大师的答案才有效。就我而言,我有一个React Native应用程序,而我正在使用的库之一已迁移到AndroidX。先前的版本在iOS上存在问题,因此我必须使用最新的版本。我要做的是:

  1. 将Android项目迁移到AndroidX(重构>迁移到AndroidX)。
  2. 使用jetifynode_module依赖项转换为AndroidX。对于React Native 0.60及更高版本,jetify是自动运行的,因此您不必安装此库。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.