Подтвердить что ты не робот

Android gradle build и библиотека поддержки

У меня есть проект, который использует несколько других проектов библиотеки (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')
}
4b9b3361

Ответ 1

До тех пор, пока у библиотеки поддержки не будет артефакт репозитория, вы не сможете включить его в более чем один проект библиотеки. Вы можете создать проект библиотеки, который содержит только библиотеку поддержки, и все остальные библиотеки зависят от нее.

Обновить: теперь возможно.

Ответ 2

Теперь это возможно, загрузив Android Support Repository из диспетчера SDK и заменив

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

с

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

Это нужно сделать для всех проектов, которые используют библиотеку поддержки. Репозиторий поддержки Android автоматически добавляется в ваш список репозиториев системой сборки (Unsure of which part добавляет его, пока не знает достаточно gradle).

Источник

Ответ 3

Основываясь на ответе от 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>

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

Ответ 4

FYI, мне пришлось добавить это, чтобы исключить поддержку android-support-v4.jar в моей сборке gradle, потому что я добавил ее как артефакт:

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

Я создал build.gradle, используя функцию экспорта проекта в плагин Eclipse ADT.

Ответ 5

ADT генерирует исключение, подобное UNEXPECTED TOP-LEVEL EXCEPTION, если ваш путь к классу Eclipse содержит более одного класса с тем же именем /package/jars. В этом случае он встречает более одного экземпляра класса LoaderManager.

Решение: У вас есть одна и та же библиотека баннеров, которая включена дважды. Проверьте приложение и все упомянутые библиотеки Android и убедитесь, что все банки включены ровно один раз.