简体   繁体   中英

External Android library projects with Gradle

I am trying to build an Android project with Gradle and the Android Gradle plugin . I would like to depend on library projects found in external (maven) repositories, eg ActionBarSherlock.

This seems possible according to the official site :

Using a library is done one of the following way:

Multi-project setup. Read here: http://www.gradle.org/docs/current/userguide/multi_project_builds.html

Dependencies through a repo such as maven or ivy.

The current contents of my 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'
            }
        }
    }
}

I am using Gradle 1.2. When I try to build with gradle assemble , I get the following error:

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

It seems like it is trying to include the AndroidManifest.xml from both the library project and my project. If I remove the manifest specification in sourceSets , I still get the same error.

The site mentions using apply plugin: 'android-library' for library projects; I am guessing this is only when building the actual library (with a multi-project setup) since doing so does not produce an APK.

How can I get external Android library project dependencies to work?

While it is possible to get dependencies through a Maven or Ivy repository, those are not packaged in a standard Jar archive. There is a new format designed specifically for this build system. The type is 'aar'

Current Android Libraries available on Maven Central were created using the Maven plugin which use a different archive format ('apklib') so they are not compatible.

If you look at com.actionbarsherlock:actionbacksherlock (which is the new location of that library), you'll see its format is apklib. http://search.maven.org/#artifactdetails%7Ccom.actionbarsherlock%7Cactionbarsherlock%7C4.2.0%7Capklib

Looking at the source code, we check for 'aar' packaging and revert to processing all others as 'jar' which is obviously a problem here. We should detect apklib and provide a better error message.

You can integrate the ActionBarSherlock as an aar now.

Just add this to your dependency definition in your build.gradle file:

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

Jake Wharton published an example project that shows how to use ActionBarSherlock with Gradle

You are using an older version of the android gradle plugin.
In the latest version 0.3 a lot has been improved in this area.

I would advise you to upstep to version 0.3 of this plugin. Be also aware that you then have to use a more recent version of gradle (1.3 or 1.4).

More information about how external libraries can be used in with this plugin.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM