web-dev-qa-db-fra.com

Android build gradle et la bibliothèque de support

J'ai un projet qui utilise quelques autres projets de bibliothèque (SlidingMenu, ActionbarSherlock) et les deux utilisent la bibliothèque de support Android Android, lors de la construction, j'obtiens ce qui suit:

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)

Les deux projets de bibliothèque dépendent d'une bibliothèque de support:

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

Tant que la bibliothèque de support ne dispose pas d'un artefact de référentiel, vous ne pouvez pas l'inclure dans plusieurs projets de bibliothèque. Vous pouvez créer un projet de bibliothèque qui ne contient que la bibliothèque de support et faire en sorte que toutes les autres bibliothèques en dépendent.

Mise à jour : c'est maintenant possible .

19
Xavier Ducrohet

C'est désormais possible en téléchargeant Android Support Repository à partir du SDK Manager et remplacement

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

avec

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

Cela doit être fait pour tous les projets qui utilisent la bibliothèque de support. Le Android Support Repository est automatiquement ajouté à votre liste de référentiels par le système de construction (vous ne savez pas quelle partie l'ajoute, je ne connais pas encore assez de gradle).

Source

51
abhishekmukherg

Basé sur la réponse de Xav, si vous avez d'autres modules qui dépendent d'Android-support-v4.jar, créez un projet de bibliothèque qui contient Android-support-v4.jar et référencez ce projet à la place le fichier jar.

Par exemple.:

Ajoutez un projet avec cette structure:

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

    }
}

n'oubliez pas d'inclure ce projet dans vos projets settings.gradle:

include  ':Android-support'

maintenant, pour chaque projet qui nécessite la bibliothèque de support, au lieu de

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

utilisez la ligne suivante:

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

Pour info, j'ai dû ajouter ceci pour exclure Android-support-v4.jar dans ma version Gradle car je l'ai ajouté comme un artefact:

compiler fileTree (dir: 'libs', inclure: '* .jar', exclure: 'Android-support-v4.jar')

J'ai créé le build.gradle en utilisant la fonction d'exportation de projet dans le plugin ADT d'Eclipse.

2
kenyee

ADT lèvera une exception comme UNEXPECTED TOP-LEVEL EXCEPTION si votre chemin de classe Eclipse contient plusieurs classes du même nom/package/jars. Dans ce cas, il rencontre plusieurs instances de la classe LoaderManager.

Solution: Vous avez la même bibliothèque de pots incluse deux fois. Vérifiez votre application et toutes les bibliothèques Android Android référencées et assurez-vous que tous les pots sont inclus une seule fois).

1
Bhavesh Patadiya