在 Android Studio 中处理相互依赖的模块之间的共同依赖关系
Handling common dependencies between interdependent modules in Android Studio
假设我的 Android Studio 项目中有 2 个模块:
---- :A
---- :B
其中:A 依赖于 B:
---- :A ---> + :B
---- :B
使事情复杂化的是 A 和 B 都需要库 L:
---- :A ---> + :B
+ :L
---- :B ---> + :L
最初包含模块的 gradle 个文件:
模块 A:
dependencies {
compile project(':B')
compile 'com.L:library:1.0.0'
}
模块 B:
dependencies {
compile 'com.L:library:1.0.0'
}
但这给出了一个错误,表明在 dex 文件的 inputList.txt 中提供了多个库:
Execution failed for task ':funtainment:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
C:\Development\Android\AndroidStudio\Sdk\build-tools.1.2\dx.bat --dex --no-optimize --output C:\Development\Workspace\Android\AndroidStudio\Funtainment\funtainment\build\intermediates\dex\debug --input-list=C:\Development\Workspace\Android\AndroidStudio\Funtainment\funtainment\build\intermediates\tmp\dex\debug\inputList.txt
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/nineoldandroids/animation/Animator$AnimatorListener;
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)
所以我尝试了一种在 Eclipse 上适用于我的类似情况的不同结构:简单地从模块 A 中删除库依赖性:
---- :A ---> + :B
---- :B ---> + :L
模块的 gradle 文件包含:
模块 A:
dependencies {
compile project(':B')
}
模块 B:
dependencies {
compile 'com.L:library:1.0.0'
}
但是我得到了和以前一样的错误!
其他相关信息:
- 整个过程中没有任何一点 java 编译错误(正如预期的那样)
- 错误仅在尝试部署时出现(特别是在
:A:dexDebug
)
- 上面的库'L'表示'com.nineoldandroids:library:2.4.0'
这是 Android Studio 错误还是这是预期的行为?
我如何允许这两个模块引用这个库而不导致多个库被添加到 dex 中并导致错误?
您可以使用exclude
compile ('great:library:1.0') {
exclude module: 'lib'
}
或
compile (project(':mymodule')) {
exclude module: 'lib'
}
假设我的 Android Studio 项目中有 2 个模块:
---- :A
---- :B
其中:A 依赖于 B:
---- :A ---> + :B
---- :B
使事情复杂化的是 A 和 B 都需要库 L:
---- :A ---> + :B
+ :L
---- :B ---> + :L
最初包含模块的 gradle 个文件:
模块 A:
dependencies {
compile project(':B')
compile 'com.L:library:1.0.0'
}
模块 B:
dependencies {
compile 'com.L:library:1.0.0'
}
但这给出了一个错误,表明在 dex 文件的 inputList.txt 中提供了多个库:
Execution failed for task ':funtainment:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
C:\Development\Android\AndroidStudio\Sdk\build-tools.1.2\dx.bat --dex --no-optimize --output C:\Development\Workspace\Android\AndroidStudio\Funtainment\funtainment\build\intermediates\dex\debug --input-list=C:\Development\Workspace\Android\AndroidStudio\Funtainment\funtainment\build\intermediates\tmp\dex\debug\inputList.txt
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/nineoldandroids/animation/Animator$AnimatorListener;
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)
所以我尝试了一种在 Eclipse 上适用于我的类似情况的不同结构:简单地从模块 A 中删除库依赖性:
---- :A ---> + :B
---- :B ---> + :L
模块的 gradle 文件包含:
模块 A:
dependencies {
compile project(':B')
}
模块 B:
dependencies {
compile 'com.L:library:1.0.0'
}
但是我得到了和以前一样的错误!
其他相关信息:
- 整个过程中没有任何一点 java 编译错误(正如预期的那样)
- 错误仅在尝试部署时出现(特别是在
:A:dexDebug
) - 上面的库'L'表示'com.nineoldandroids:library:2.4.0'
这是 Android Studio 错误还是这是预期的行为? 我如何允许这两个模块引用这个库而不导致多个库被添加到 dex 中并导致错误?
您可以使用exclude
compile ('great:library:1.0') {
exclude module: 'lib'
}
或
compile (project(':mymodule')) {
exclude module: 'lib'
}