it-swarm.com.de

Android gradle build und die Supportbibliothek

Ich habe ein Projekt, in dem einige andere Bibliotheksprojekte (SlidingMenu, ActionbarSherlock) verwendet werden. Beide verwenden die Unterstützungsbibliothek Android=). Beim Erstellen erhalte ich Folgendes:

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)

Beide Bibliotheksprojekte sind abhängig von der support lib:

dependencies {
    compile files('libs/Android-support-v4.jar')
}
34
Vitaly Babiy

Bis die Support-Bibliothek ein Repository-Artefakt hat, können Sie es nicht in mehr als ein Bibliotheksprojekt aufnehmen. Sie können ein Bibliotheksprojekt erstellen, das nur die Unterstützungsbibliothek enthält und von dem alle anderen Bibliotheken abhängen.

Update : dies ist jetzt möglich .

19
Xavier Ducrohet

Dies ist jetzt möglich, indem Sie Android Support Repository Vom SDK-Manager herunterladen und ersetzen

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

mit

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

Dies muss für alle Projekte durchgeführt werden, die die Unterstützungsbibliothek verwenden. Das Android Support-Repository wird vom Build-System automatisch zu Ihrer Repository-Liste hinzugefügt. (Welches Teil es hinzufügt, weiß noch nicht genug über Gradle.).

Quelle

51
abhishekmukherg

Wenn Sie andere Module haben, die von Android-support-v4.jar abhängen, erstellen Sie basierend auf der Antwort von Xav ein Bibliotheksprojekt, das die Android-support-v4.jar enthält, und verweisen Sie stattdessen auf dieses Projekt die JAR-Datei.

Z.B.:

Fügen Sie ein Projekt mit dieser Struktur hinzu:

- 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'
        }

    }
}

denken Sie daran, dieses Projekt in Ihre Projekteinstellungen aufzunehmen.

include  ':Android-support'

jetzt für jedes Projekt, für das die Supportbibliothek erforderlich ist, anstatt

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

benutze die folgende Zeile:

compile project (':Android-support')
13
rafaello

Zu Ihrer Information, ich musste dies hinzufügen, um Android-support-v4.jar in meinem Gradle-Build auszuschließen, da ich es als Artefakt hinzugefügt habe:

compile fileTree (dir: 'libs', include: '* .jar', exclude: 'Android-support-v4.jar')

Ich habe das build.gradle mit der Projektexportfunktion im ADT-Plugin von Eclipse erstellt.

2
kenyee

Das ADT löst eine Ausnahme wie UNEXPECTED TOP-LEVEL EXCEPTION wenn Ihr Eclipse-Klassenpfad mehr als eine Klasse desselben Namens/Pakets/Jars enthält. In diesem Fall trifft es auf mehr als eine Instanz der Klasse LoaderManager.

Lösung: Sie haben die gleiche Glasbibliothek zweimal enthalten. Überprüfen Sie Ihre Anwendung und alle referenzierten Android Bibliotheken und stellen Sie sicher, dass alle Gläser genau einmal enthalten sind.

1