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

Issue with Multiple Dex: in Build Config Files

在项目中,有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.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)

主项目[settings.gradle]:

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

主项目[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 文件的重复。有什么办法可以解决这个问题?

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

resolution remove appcompat library from Gradle A.


依赖解析

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

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

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

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

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

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

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

查看 Android Dex: UNEXPECTED TOP-LEVEL EXCEPTION 了解更多信息。