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