多个Dex的问题:在构建配置文件中

时间:2015-03-03 06:25:17

标签: android android-studio android-gradle

在项目中,有3个模块,A,B,C。 A具有B的依赖性,B具有C的依赖性。

错误输出:

Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\user\AppData\Local\Android\sdk\build-tools\21.1.2\dx.bat --dex --no-optimize --output C:\Testing\MyApplication\app\build\intermediates\dex\debug --input-list=C:\Testing\MyApplication\a\build\intermediates\tmp\dex\debug\inputList.txt
Error Code:
    2
Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Lcom/test/test2/BuildConfig;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)

MainProject [settings.gradle]:

include ':A', ':B', ':C'

MainProject [build.gradle]:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

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

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

allprojects {
    repositories {
        jcenter()
    }
}

A.gradle:

apply plugin: 'com.android.application'

dependencies {

    compile 'com.google.android.gms:play-services:6.5.87'
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile project(':B')
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    /*defaultConfig {
        minSdkVersion 9
        targetSdkVersion 21
    }*/

    lintOptions {
        abortOnError false
    }
}

B.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile('de.keyboardsurfer.android.widget:crouton:1.8.5') {
        exclude group: 'com.android.support', module: 'support-v4'
    }
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'de.greenrobot:eventbus:2.2.1'
    compile 'com.mobsandgeeks:android-saripaar:1.0.3'
    compile 'com.loopj.android:android-async-http:1.4.6'
    compile project(':C')
    compile 'com.android.support:appcompat-v7:21.0.3'
}

C.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 21
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile files('libs/classes.jar')
}

如果我在A和模块B中删除了appcpmpat-v7的重复,那么我就会收到错误。

模块C包含已编译的.class文件。

我无法理解build.config文件的重复。什么可以解决这个问题?

1 个答案:

答案 0 :(得分:3)

支持库被多次包含(可能是因为你正在使用的几个库声明为依赖),在构建脚本中查找它。

  

解决方案从Gradle A中删除appcompat库。


依赖性解决方案

当项目引用两个都需要相同jar文件的Library项目时,构建系统必须检测并解决重复。

完整依赖系统会将每个jar文件与完全限定名称和版本号相关联,以确定要使用的版本。

不幸的是,Android构建系统还没有完整的依赖关系解析系统。与此同时,我们实施了一个遵循以下规则的非常基本的系统:

Jar文件严格按文件名标识。

这意味着mylib.jar与mylib-v2.jar不同,两者都将被打包,如果它们实际上是不同版本中的同一个库,则可能导致“已添加”dx错误。

对于具有相同文件名的jar,“相同版本”表示相同的文件。

目前我们的检测非常基础,只检查文件的大小和sha1是否相同。 如果两个库在libs文件夹中都包含一个名为mylib.jar的文件,但这两个文件不同,则构建系统将失败,表明存在依赖性错误。

查看Android Dex: UNEXPECTED TOP-LEVEL EXCEPTION了解详情。