在项目中,有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文件的重复。什么可以解决这个问题?
答案 0 :(得分:3)
支持库被多次包含(可能是因为你正在使用的几个库声明为依赖),在构建脚本中查找它。
解决方案从Gradle A中删除
appcompat
库。
当项目引用两个都需要相同jar文件的Library项目时,构建系统必须检测并解决重复。
完整依赖系统会将每个jar文件与完全限定名称和版本号相关联,以确定要使用的版本。
不幸的是,Android构建系统还没有完整的依赖关系解析系统。与此同时,我们实施了一个遵循以下规则的非常基本的系统:
Jar文件严格按文件名标识。
这意味着mylib.jar与mylib-v2.jar不同,两者都将被打包,如果它们实际上是不同版本中的同一个库,则可能导致“已添加”dx错误。
对于具有相同文件名的jar,“相同版本”表示相同的文件。
目前我们的检测非常基础,只检查文件的大小和sha1是否相同。 如果两个库在libs文件夹中都包含一个名为mylib.jar的文件,但这两个文件不同,则构建系统将失败,表明存在依赖性错误。