Внешние проекты библиотеки Android с Gradle

Я пытаюсь создать проект Android с Gradle и Android Gradle плагином. Я хотел бы зависеть от библиотечных проектов, найденных во внешних (maven) репозиториях, например. ActionBarSherlock.

Это возможно в соответствии с официальным сайтом :

Использование библиотеки выполняется одним из следующих способов:

Настройка нескольких проектов. Читайте здесь: http://www.gradle.org/docs/current/userguide/multi_project_builds.html

Зависимости через репо, такие как maven или плющ.

Текущее содержимое моего build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.2'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.actionbarsherlock:library:4.2.0'
}

android {
    target = 'android-16'
    sourceSets {
        main {
            manifest {
                srcFile 'AndroidManifest.xml'
            }
            java {
                srcDir 'src'
            }
            res {
                srcDir 'res'
            }
            assets {
                srcDir 'assets'
            }
            resources {
                srcDir 'src'
            }
        }
    }
}

Я использую Gradle 1.2. Когда я пытаюсь построить с помощью gradle assemble, я получаю следующую ошибку:

Error: duplicate files during packaging of APK /[path to project]/build/apk/[project name]-debug-unaligned.apk
    Path in archive: AndroidManifest.xml
    Origin 1: /[path to project]/build/libs/[apk name]-debug.ap_
    Origin 2: /[home directory]/.gradle/caches/artifacts-14/filestore/com.actionbarsherlock/actionbarsherlock/4.2.0/apklib/dd63451a922558005d8c10be1085b488ed731d19/actionbarsherlock-4.2.0.apklib
:packageDebug FAILED

Кажется, он пытается включить AndroidManifest.xml из проекта библиотеки и моего проекта. Если я удалю спецификацию manifest в sourceSets, я все равно получаю ту же ошибку.

Сайт упоминает использование apply plugin: 'android-library' для проектов библиотеки; Я предполагаю, что это только при создании реальной библиотеки (с многопроектной настройкой), так как при этом не создается APK.

Как я могу заставить внешние проекты библиотеки Android работать?

Ответ 1

Хотя можно получить зависимости через репозиторий Maven или Ivy, они не упакованы в стандартный архив Jar. Существует новый формат, разработанный специально для этой системы сборки. Тип "aar"

Текущие библиотеки Android, доступные на Maven Central, были созданы с использованием плагина Maven, в котором используется другой формат архива (apklib), поэтому они несовместимы.

Если вы посмотрите на com.actionbarsherlock: actionbacksherlock (который является новым расположением этой библиотеки), вы увидите, что его формат является apklib. http://search.maven.org/#artifactdetails%7Ccom.actionbarsherlock%7Cactionbarsherlock%7C4.2.0%7Capklib

Рассматривая исходный код, мы проверяем упаковку "aar" и возвращаем для обработки всех остальных как "jar", что, очевидно, является проблемой здесь. Мы должны обнаружить apklib и обеспечить лучшее сообщение об ошибке.

Ответ 2

Теперь вы можете интегрировать ActionBarSherlock как aar.

Просто добавьте это в определение своей зависимости в файле build.gradle:

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile 'com.actionbarsherlock:actionbarsherlock:[email protected]'

Джейк Уортон опубликовал проект , в котором показано, как использовать ActionBarSherlock с Gradle

Ответ 3

Вы используете более старую версию плагина android gradle.
В последней версии 0.3 в этой области было значительно улучшено.

Я бы посоветовал вам перейти к версии 0.3 этого плагина. Также имейте в виду, что вам нужно использовать более новую версию gradle (1.3 или 1.4).

Дополнительная информация о том, как внешние библиотеки можно использовать с этим плагином.