android - 为什么我在运行我的 Android 项目时得到重复的类
问题描述
我正在向我的应用程序添加导航抽屉。我遇到了错误。应用程序 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)
分级文件
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'
}
解决方案
异常意味着,在 2 个或多个不同的依赖项中存在重复的类,编译器将无法区分应该使用哪些类run-time
并引发异常。
大多数情况下,当您尝试导入带有所需库的模块时,就会发生重复性。(传递依赖)
您必须exclude
从build.gradle
. 如 Log 所示,support-core-ui
模块support-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"
}
}
}
有时您不需要排除任何内容,只需将导入的模块更改为不带依赖项的模块即可。
导致重复类的其他情况是当您添加*.jar
到项目libs
目录时。因此,如果它们没有在项目中开始使用,您需要删除它们。
project->app->libs->*.jar
我看到使用这两行提到的一些解决方案可以解决问题但是如果您已经迁移到Androidx
它,它将默认启用。
android.useAndroidX=true
android.enableJetifier=true
喷射器是
Jetifier 工具将支持库依赖的库迁移为依赖等效的 AndroidX 包。该工具允许您直接迁移单个库,而不是使用与 Android Studio 捆绑的 Android gradle 插件。
有关更多信息,请查看排除传递依赖项
随着应用程序范围的扩大,它可以包含许多依赖项,包括直接依赖项和传递依赖项(应用程序导入的库所依赖的库)。要排除不再需要的传递依赖,可以使用
exclude
关键字
如果您在排除类时遇到问题,请查看此线程:我如何排除...
推荐阅读
- sql - Row_Number Sybase SQL Anywhere 在多个条件下更改
- python - 将布尔数组(即 True False)转换为实际值?
- bash - 如何使用awk在bash中的字符串中查找字符
- c - C中的Dijkstras算法实现给出错误(但几乎正确)的输出
- r - 匹配字符串在多列上循环
- mailchimp-api-v3.0 - Mailchimp API 合并字段 - 日期格式
- javascript - React 从子组件组合框中获取选定的值
- html - 在html中使两列响应
- linux - 如何处理 MV 命令中的空格
- c++ - '{':缺少函数头(旧式正式列表?)和“期望声明”