管理Android Gradle依赖项的最佳方式

时间:2013-11-15 18:56:55

标签: java android gradle android-gradle

我正在使用'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开发人员如何管理这个?

2 个答案:

答案 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以允许更高版本的支持库。否则,您需要在本地下载和管理依赖项作为项目中的附加模块。