Android gradle构build和支持库

我有一个项目,使用一些其他库项目(SlidingMenu,ActionbarSherlock),这些都使用Android支持库,build设时,我得到以下几点:

UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/LoaderManager; at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) at com.android.dx.dex.file.DexFile.add(DexFile.java:163) at com.android.dx.command.dexer.Main.processClass(Main.java:490) at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459) at com.android.dx.command.dexer.Main.access$400(Main.java:67) at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398) at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245) at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131) at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) at com.android.dx.command.dexer.Main.processOne(Main.java:422) at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333) at com.android.dx.command.dexer.Main.run(Main.java:209) at com.android.dx.command.dexer.Main.main(Main.java:174) at com.android.dx.command.Main.main(Main.java:91) 

这两个库项目都依赖于支持lib:

 dependencies { compile files('libs/android-support-v4.jar') } 

直到我们有支持库有一个存储库工件,您不能将其包含在多个库项目中。 您可以创build一个只包含支持库的库项目,并让所有其他库依赖它。

更新 : 这是现在可能的 。

现在可以通过从SDK Manager下载Android Support Repository进行replace

 compile files("libs/android-support-v4.jar") 

 compile 'com.android.support:support-v4:13.0.0' 

所有使用支持库的项目都必须完成这个工作。 Android Support Repository通过构build系统自动添加到您的存储列表(不确定哪个部分添加了它,还没有足够的gradle)。

资源

根据Xav的回答,如果你有其他依赖于android-support-v4.jar的模块,创build一个包含android-support-v4.jar的库项目,并引用这个项目,而不是jar文件。

例如:

添加一个这样的结构的项目:

 - android-support - libs - android-support-v4.jar - AndroidManifest.xml - build.gradle 

AndroidManifest.xml中:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.example.support.lib"> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7"/> <application /> </manifest> 

的build.gradle:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' } } apply plugin: 'android-library' dependencies { compile files ("libs/android-support-v4.jar") } android { compileSdkVersion 17 buildToolsVersion "17" defaultConfig { minSdkVersion 7 targetSdkVersion 7 } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' } } } 

记得在你的项目settings.gradle中包含这个项目:

 include ':android-support' 

现在,每个需要支持库的项目,而不是

 compile files ("libs/android-support-v4.jar") 

使用以下行:

 compile project (':android-support') 

仅供参考,我不得不添加这个来排除我的gradle版本中的android-support-v4.jar,因为我将其添加为工件:

编译fileTree(dir:'libs',include:'* .jar',排除:'android-support-v4.jar')

我使用Eclipse的ADT插件中的项目导出function创build了build.gradle。

如果您的Eclipse类path包含多个具有相同名称/包/jar的类,则ADT将抛出一个exception,例如UNEXPECTED TOP-LEVEL EXCEPTIONexception( UNEXPECTED TOP-LEVEL EXCEPTION 。 在这种情况下,它遇到了LoaderManager类的多个实例。

解决scheme:您有两次包含相同的jar库。 检查你的应用程序和所有引用的Android库,并确保你所有的jar只包含一次。