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, e.g. 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?
To use your Android library's code in another app module, proceed as follows: Navigate to File > Project Structure > Dependencies. In the Declared Dependencies tab, click and select Library Dependency in the dropdown. In the Add Library Dependency dialog, use the search box to find the library to add.
The difference between JAR and AARJAR is just a Java library containing java class files and nothing more. AAR is a format for android libraries which contains a JAR file, android resource file (like layout XML, attribute XML, etc..) and an android manifest file.
We can add a Maven repository to our project by using its url address or its location by adding that particular code snippet in our Gradle build script. To add a Maven repository by using its url, add the following code snippet to the 'build. gradle' file: repositories {
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With