多个 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 了解更多信息。
在项目中,有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 了解更多信息。