我正在使用'com.android.tools.build:gradle:0.6.+'来构建我的Android应用程序。
众所周知,Android dex不能包含相同库的不同版本。但是,当你想要使用Maven依赖时,如何处理情况需要一些你已经使用的库,但只是不同的版本。 例。 在build.gradle文件中有以下内容:
dependencies {
compile 'com.android.support:appcompat-v7:+'
compile 'com.github.chrisbanes.bitmapcache:library:2.3'
}
产生错误:
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/FragmentManager$OnBackStackChangedListener;
at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
at com.android.dx.dex.file.DexFile.add(DexFile.java:163)...
发生此错误的原因如下: http://search.maven.org/remotecontent?filepath=com/github/chrisbanes/bitmapcache/library/2.3/library-2.3.pom需要com.google.android:support-v4
com.android.support:appcompat-v7:+已经包含com.google.android:support-v4,这导致双重包含相同的类文件。
我现在正在寻找以下答案: 使用Ant 将所有依赖项下载到“libs”文件夹并使用编译文件('...') 等
更改包含顺序并没有帮助。
我正在寻找强大而方便的解决方案。如何使用maven依赖关系,仍然没有上述异常?想法?成熟的Android开发人员如何管理这个?
答案 0 :(得分:11)
你可以exclude transitive dependencies:
dependencies {
compile 'com.android.support:appcompat-v7:19.0.0'
compile ("com.github.chrisbanes.bitmapcache:library:2.3"){
exclude group: 'com.google.android', module: 'support-v4'
}
}
它是开源库,因此您应该通知作者有关此问题或创建拉取请求。
答案 1 :(得分:2)
问题是bitmapcache特别需要支持库的r7,而不是允许支持库的任何r7 +版本。因此,appcompat试图引入与bitmapcache所需的r7冲突的最新版本(r19)。
例如,ActionBarSherlock没有根据its pom file指定支持库的版本,允许您将其与任何版本的支持库一起使用。
最简单的解决方案是更新bitmapcache以允许更高版本的支持库。否则,您需要在本地下载和管理依赖项作为项目中的附加模块。