我有一个项目使用了一些其他的库项目(SlidingMenu,ActionbarSherlock),这两个项目都使用了android支持库,在构建时我得到了以下内容:
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')
}
答案 0 :(得分:51)
现在可以从SDK Manager下载Android Support Repository
并替换
compile files("libs/android-support-v4.jar")
与
compile 'com.android.support:support-v4:13.0.0'
必须对使用支持库的所有项目执行此操作。 Android支持存储库会自动添加到构建系统的存储库列表中(不确定哪个部分添加了它,还不知道足够的gradle)。
答案 1 :(得分:19)
在支持库具有存储库工件之前,您不能将其包含在多个库项目中。 您可以创建一个仅包含支持库的库项目,并让所有其他库依赖它。
答案 2 :(得分:13)
基于Xav的答案,如果你有其他模块依赖于android-support-v4.jar, 创建一个包含android-support-v4.jar的库项目,并引用该项目而不是jar文件。
E.g:
添加具有以下结构的项目:
- 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'
}
}
}
请记住在项目设置中包含此项目.gradle:
include ':android-support'
现在,对于需要支持库的每个项目,而不是
compile files ("libs/android-support-v4.jar")
使用以下行:
compile project (':android-support')
答案 3 :(得分:2)
仅供参考,我必须添加它以在我的gradle构建中排除android-support-v4.jar,因为我将其添加为工件:
编译fileTree(dir:'libs',include:'* .jar',exclude:'android-support-v4.jar')
我使用Eclipse的ADT插件中的项目导出功能创建了build.gradle。
答案 4 :(得分:1)
如果您的Eclipse类路径包含多个同名/ package / jars的类,ADT
将抛出类似UNEXPECTED TOP-LEVEL EXCEPTION
的异常。在这种情况下,它遇到LoaderManager
类的多个实例。
解决方案: 你有两次相同的jar库。检查您的应用程序和所有引用的Android库,并确保所有罐子都包含一次。