为什么我在运行我的 Android 项目时得到重复的类

mia*_*ech 14 android android-gradle-plugin

我正在向我的应用程序添加导航抽屉。我收到错误。应用程序 gradle 同步得很好。但是当我运行应用程序时,我收到了一堆重复的类错误。我认为这可能是因为我添加了相互冲突的依赖项,并且我使用的是 v7 28.0.0 并且一些错误提到了 app: v4。我在网上看到的所有示例都使用 v7 28.0.0,尽管我在使用 v4 的 main_activity.xml 中有这个。不知道是否与错误有关。android.support.v4.widget.DrawerLayout

Caused by: com.android.ide.common.workers.WorkerExecutorException: 1 exception was raised by workers:
java.lang.RuntimeException: java.lang.RuntimeException: Duplicate class android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat found in modules classes.jar (com.android.support:support-compat:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActionBarDrawerToggle found in modules classes.jar (com.android.support:support-core-ui:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActionBarDrawerToggle$Delegate found in modules classes.jar (com.android.support:support-core-ui:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActionBarDrawerToggle$DelegateProvider found in modules classes.jar (com.android.support:support-core-ui:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActionBarDrawerToggle$SlideDrawable found in modules classes.jar (com.android.support:support-core-ui:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActivityCompat found in modules classes.jar (com.android.support:support-compat:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActivityCompat$1 found in modules classes.jar (com.android.support:support-compat:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Duplicate class android.support.v4.app.ActivityCompat$OnRequestPermissionsResultCallback found in modules classes.jar (com.android.support:support-compat:28.0.0) and classes.jar (com.android.support:support-v4:24.0.0)
Run Code Online (Sandbox Code Playgroud)

gradle 文件

apply plugin: 'com.android.application'

android {    
    
    compileSdkVersion 28
    defaultConfig {
        applicationId "org.pctechtips.netdroid"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 8
        versionName "1.7"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled = false
        signingConfig signingConfigs.config
    }
    buildTypes {
        release {
            shrinkResources false
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            debuggable false

        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    /*androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
                        exclude group: 'com.android.support', module: 'support-annotations'
                        firebase
                        implementation 'com.google.firebase:firebase-core:10.2.1'
                    })*/
    //    compile 'com.android.support:appcompat-v7:25.3.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    /*google play plugin for adMob*/
    implementation 'com.google.android.gms:play-services:10.2.1'
    implementation 'commons-net:commons-net:3.6'
    implementation 'org.samba.jcifs:jcifs:1.3.3'
}
Run Code Online (Sandbox Code Playgroud)

Mr.*_*.AF 21

异常意味着,在 2 个或更多不同的依赖项中有重复的类,编译器将无法区分应该使用它们中的哪一个run-time并抛出异常。

大多数情况下,当您尝试导入带有所需库的模块时,就会发生重复性。(传递依赖)

您必须excludebuild.gradle. 作为记录显示,support-core-uisupport-compat模块有重复的课程。

apply plugin: 'com.android.application'

android {
    ...
    defaultConfig {
        ...
    }
    buildTypes {
        ...
    }
    configurations {
        all { // You should exclude one of them not both of them 
            exclude group: "com.android.support", module: "support-core-ui"
            exclude group: "com.android.support", module: "support-compat"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有时你不需要排除任何东西,你只需要将导入的模块更改为不带依赖项的模块

导致重复类的其他情况是当您添加*.jar到项目libs目录时。因此,如果在项目中没有开始使用它们,则需要将它们删除。

project->app->libs->*.jar
Run Code Online (Sandbox Code Playgroud)

我看到使用这两行提到的一些解决方案可以解决问题但是如果您已迁移到Androidx它,则默认情况下将启用它。

android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)

Jetifier 是

Jetifier 工具将依赖于支持库的库迁移到依赖等效的 AndroidX 包。该工具可让您直接迁移单个库,而不是使用与 Android Studio 捆绑的 Android gradle 插件。

有关更多信息,请查看排除传递依赖项

随着应用范围的扩大,它可以包含许多依赖项,包括直接依赖项和传递依赖项(应用程序导入的库所依赖的库)。要排除不再需要的传递依赖项,可以使用exclude 关键字

如果您在排除类时遇到问题,请查看此线程:如何排除...


小智 11

查看添加此依赖项是否有效:

implementation 'com.android.support:support-v4:28.0.0'
Run Code Online (Sandbox Code Playgroud)


Aja*_*jay 8

转到 gradle.properties 并编写这两行代码:

android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)