web-dev-qa-db-ja.com

Android gradle build and the support library

他のいくつかのライブラリプロジェクト(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')
}
34
Vitaly Babiy

サポートライブラリがリポジトリアーティファクトを持つまで、複数のライブラリプロジェクトに含めることはできません。サポートライブラリのみを含むライブラリプロジェクトを作成し、他のすべてのライブラリをそれに依存させることができます。

Updateこれは現在可能です

19
Xavier Ducrohet

これは、SDKマネージャーからAndroid Support Repositoryをダウンロードし、

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

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

これは、サポートライブラリを使用するすべてのプロジェクトで実行する必要があります。 Androidサポートリポジトリは、ビルドシステムによってリポジトリのリストに自動的に追加されます(どの部分に追加されるのか不明で、まだ十分なgradleがわからない)。

ソース

51
abhishekmukherg

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

    }
}

プロジェクトのsettings.gradleにこのプロジェクトを含めることを忘れないでください:

include  ':Android-support'

今ではなく、サポートライブラリを必要とするプロジェクトごとに、

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

次の行を使用します。

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

参考までに、これを追加して、gradleビルドでAndroid-support-v4.jarを除外する必要がありました。

コンパイルfileTree(dir: 'libs'、include: '* .jar'、exclude: 'Android-support-v4.jar')

EclipseのADTプラグインのプロジェクトエクスポート機能を使用してbuild.gradleを作成しました。

2
kenyee

Eclipseクラスパスに同じ名前/パッケージ/ jarのクラスが複数含まれている場合、ADTUNEXPECTED TOP-LEVEL EXCEPTIONなどの例外をスローします。この場合、LoaderManagerクラスの複数のインスタンスが発生しています。

解決策:同じjarライブラリが2回含まれています。アプリケーションと参照されているすべてのAndroidライブラリをチェックし、すべてのjarが1回だけ含まれていることを確認します。

1