34

我有一个使用其他一些库项目(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)

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

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

5 回答 5

51

现在可以通过Android Support Repository从 SDK 管理器下载并替换

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

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

所有使用支持库的项目都必须这样做。Android Support Repository 会由构建系统自动添加到您的存储库列表中(不确定添加它的部分,还不知道足够的 gradle)。

资源

于 2013-06-28T23:31:05.750 回答
19

在我们拥有支持库之前,您不能将它包含在一个以上的库项目中。您可以创建一个仅包含支持库的库项目,并让所有其他库依赖它。

更新这现在是可能的

于 2013-05-25T05:20:33.783 回答
13

根据 Xav 的回答,如果您有其他依赖于 android-support-v4.jar 的模块,请创建一个包含 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>

构建.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')
于 2013-06-17T17:21:22.570 回答
2

仅供参考,我必须添加它以在我的 gradle 构建中排除 android-support-v4.jar,因为我将它添加为工件:

编译文件树(目录:'libs',包括:'*.jar',排除:'android-support-v4.jar')

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

于 2013-12-02T22:24:25.260 回答
1

如果您的 Eclipse 类路径包含多个同名/包/jar 类,则会ADT抛出异常。UNEXPECTED TOP-LEVEL EXCEPTION在这种情况下,它遇到了多个LoaderManager类的实例。

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

于 2013-05-25T05:09:28.690 回答