程序类型已存在:android.support.v4.app.BackStackRecord

时间:2018-04-15 00:08:45

标签: android build.gradle

我升级了我的Android Studio,在最新版本中发现了很多问题。

虽然存在许多类似的问题,但我检查了所有答案,但没有一个对我有效!

以下是编译代码时遇到的错误:

  

已存在的程序类型:   android.support.v4.app.BackStackRecord $欧普           消息{kind = ERROR,text =程序类型已存在:           android.support.v4.app.BackStackRecord $ Op,sources = [未知源文件],工具       名称= Optional.of(D8)}

这是我的gradle文件:

项目

// Top-level build file where you can add configuration options common to 

all sub-projects/modules.

buildscript {

repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.1.0'


    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
    }
 }

 allprojects {
 repositories {
    google()
    jcenter()
    maven {
        url "https://jitpack.io"
          }
     }
}

task clean(type: Delete) {
delete rootProject.buildDir
}

应用

apply plugin: 'com.android.application'

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

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso- 
    core:3.0.1'
    implementation 'com.github.ViksaaSkool:AwesomeSplash:v1.0.0'
}

您可以告诉我是否还有其他内容可以添加,以了解我正在做什么或我错在哪里。

10 个答案:

答案 0 :(得分:81)

  

已存在的程序类型:   android.support.v4.app.BackStackRecord $欧普           消息{kind = ERROR,text =程序类型已存在:           android.support.v4.app.BackStackRecord $ Op,sources = [未知源文件],工具       名称= Optional.of(D8)}

由于重复的支持库,问题发生了。这种依赖:

implementation 'com.github.ViksaaSkool:AwesomeSplash:v1.0.0'

正在使用旧版本的支持库。如果已经使用支持库,请尝试排除支持库:

// support libraries we want to use
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'

// we already have the specific support libraries. So, exclude it
implementation ('com.github.ViksaaSkool:AwesomeSplash:v1.0.0') {    
    exclude group: 'com.android.support'
    exclude module: 'appcompat-v7'
    exclude module: 'support-v4'
}

您需要使用以下命令检查您的依赖项:

./gradlew app:dependencies

或者,您可以通过将冲突的库添加到您想要的确切版本来覆盖支持库版本。

更新

Add build dependencies文档中修复依赖项解析错误有一个完整的步骤。摘录如下:

修复依赖项解析错误

当您向应用项目添加多个依赖项时,这些直接和传递依赖项可能会相互冲突。 Android Gradle插件尝试优雅地解决这些冲突,但是一些冲突可能导致编译时或运行时错误。

为了帮助您调查哪些依赖项导致错误,inspect your app's dependency tree并查找出现多次或版本冲突的依赖项。

如果您无法轻松识别重复的依赖关系,请尝试使用Android Studio的UI搜索包含重复类的依赖关系,如下所示:

  1. 选择导航>菜单栏中的
  2. 在弹出式搜索对话框中,确保选中包含非项目项旁边的框。
  3. 键入构建错误中显示的类的名称。
  4. 检查包含该类的依赖项的结果。
  5. 以下部分介绍了您可能遇到的不同类型的依赖项解析错误以及如何解决这些错误。

    修复重复的类错误

    如果类在运行时类路径中出现多次,则会出现类似于以下内容的错误:

    Program type already present com.example.MyClass
    

    由于下列情况之一,通常会发生此错误:

    • 二进制依赖项包括您的应用程序还包含的库作为直接依赖项。例如,您的应用程序声明对库A和库B的直接依赖,但库A已在其二进制文件中包含库B.

      • 要解决此问题,请删除库B作为直接依赖项。
    • 您的应用在同一个库中具有本地二进制相关性和远程二进制相关性。

      • 要解决此问题,请删除其中一个二进制依赖项。

    修复类路径之间的冲突

    当Gradle解析编译类路径时,它首先解析运行时类路径,并使用结果确定应将哪些版本的依赖项添加到编译类路径中。换句话说,运行时类路径确定下游类路径上相同依赖项所需的版本号。

    您的应用程序的运行时类路径还确定了Gradle在应用程序测试APK的运行时类路径中匹配依赖项所需的版本号。类路径的层次结构如下图所示:

    enter image description here

    例如,当您的应用程序包含使用implementation dependency configuration的依赖项版本且库模块包含不同版本时,会出现多个类路径中出现相同依赖关系的不同版本的冲突使用runtimeOnly配置的依赖版本。

    在解析运行时和编译时类路径的依赖关系时,Android Gradle插件3.3.0及更高版本会尝试自动修复某些下游版本冲突。例如,如果运行时类路径包含库A版本2.0并且编译类路径包含库A版本1.0,则插件会自动将编译类路径的依赖性更新为库A版本2.0以避免错误。

    但是,如果运行时类路径包含库A版本1.0且编译类路径包含库A版本2.0,则插件不会将编译类路径上的依赖项降级为库A版本1.0,并且仍会出现类似于以下内容:

    Conflict with dependency 'com.example.library:some-lib:2.0' in project 'my-library'.
    Resolved versions for runtime classpath (1.0) and compile classpath (2.0) differ.
    

    要解决此问题,请执行以下操作之一:

    • 将所需的依赖项版本作为api依赖项包含在库模块中。也就是说,只有你的库模块声明了依赖关系,但app模块也可以传递访问它的API。
    • 或者,您可以在两个模块中声明依赖项,但应确保每个模块使用相同版本的依赖项。考虑configuring project-wide properties以确保每个依赖项的版本在整个项目中保持一致。

答案 1 :(得分:35)

将此添加到您的 App 模块build.gradle中:

implementation 'com.android.support:support-v4:27.1.1'

答案 2 :(得分:10)

接受答案的另一种方法是告诉gradle强制推出更新的版本:

final SUPPORT_LIB_VER = '27.1.1'

configurations.all {
    resolutionStrategy { 
        force "com.android.support:appcompat-v7:${SUPPORT_LIB_VER}"
        force "com.android.support:support-v4:${SUPPORT_LIB_VER}"
    }
}

当你有很多依赖项时,这会更方便。

另见:Answer to "How can I force Gradle to set the same version for two dependencies?"

答案 3 :(得分:9)

在gradle文件的“依赖项”部分添加此行代码

implementation 'com.android.support:support-v4:28.0.0'

答案 4 :(得分:3)

根据您的"SdkVersion",将此代码添加到gradle中:

implementation 'com.android.support:support-v4:28.0.0'

例如,我的SDKVersion是28,那么我使用以下代码:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'

答案 5 :(得分:2)

还要检查您的 libs 文件夹,因为:

implementation fileTree(dir: 'libs', include: ['*.jar'])

也将从那里拾取所有罐子。您可能会有jar互相复制,或者是您的下层实现。

我的库中有重复项,并且遇到了这个问题。

答案 6 :(得分:1)

就我而言,我将一个非常老的Eclipse项目转换为Android Studio。 因此,使用了自动迁移:

dependencies {
    compile files('libs/android-support-v13.jar')
}

只需删除或注释此库中的行即可。

我发表评论时,Gradle脚本正确执行。

答案 7 :(得分:0)

  

用它替换依赖项。

implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-alpha1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

答案 8 :(得分:0)

multiDexEnabled是 在gradle-app中的android块中添加上面的行,对我来说工作...

答案 9 :(得分:0)

enter image description here 我尝试过那些:

  • 清理/重建
  • 使现金无效并重新启动
  • 从我的app.gradle中的库中排除依赖项(见下文)

实现(project(':libxmiimp')){排除组:'com.android.support',模块:'support-v4'}

  • 使用gradle设置进行播放(诸如multiDex之类的功能可启用true和其他功能)

但是我的问题是Android-support-v4.jar不知何故进入了我本地的android库的lib文件夹。 删除它可以解决我的问题