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

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

Это кажется возможным, согласно официальному сайту:

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

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

Зависимости через репо, такие как Maven или Ivy.

Текущее содержимое моего 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 для работы?

3 ответа

Решение

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

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

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

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

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

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

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'

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

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

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

Больше информации о том, как внешние библиотеки могут быть использованы с этим плагином.

Другие вопросы по тегам