He descargado algunas fuentes de la biblioteca y me gustaría exportarlo como un archivo Jar utilizando Android Studio. Hay una manera de exportar a un archivo jar usando Android Studio?
editar:
La librería que quiero exportar como jar es una librería de Android. Se llama "StandOut" y se puede descargar desde GitHub. https://github.com/pingpongboss/StandOut
No es posible exportar una biblioteca de Android como un archivo jar. Es posible, sin embargo, exportarla como archivo aar
. Los archivos Aar
son el nuevo formato binario para las librerías Android. Hay información sobre ellos en Google I/O, el New Build System video.
En primer lugar, construye la librería en Android Studio o desde la línea de comandos emitiendo gradle build
desde el directorio raíz de tu librería.
Esto resultará en el archivo <yourlibroot>/libs/build/yourlib.aar
.
Este archivo aar es una representación binaria de su biblioteca y se puede añadir a su proyecto en lugar de la biblioteca como un proyecto de dependencia.
Para añadir el archivo aar como una dependencia tienes que publicarlo en la central de maven o en tu repositorio local de maven, y luego hacer referencia al archivo aar en el archivo gradle.build
de tu proyecto.
Sin embargo, este paso es un poco enrevesado. He encontrado una buena explicación de cómo hacerlo aquí:
http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds
Yo era capaz de construir una biblioteca de código fuente para compilar .jar
archivo, utilizando el enfoque de esta solución:
https://stackoverflow.com/a/19037807/1002054
Aquí está el desglose de lo que hice:
En este caso era una librería Volley
He utilizado Android Studio 0.3.7. Me he encontrado con algunos problemas durante ese paso, en concreto tuve que copiar la carpeta gradle
del nuevo proyecto android antes de poder importar el código fuente de la librería Volley, esto puede variar dependiendo del código fuente que utilices.
// If your module is a library project, this is needed
//to properly recognize 'android-library' plugin
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.3'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 17
buildToolsVersion = 17
sourceSets {
main {
// Here is the path to your source code
java {
srcDir 'src'
}
}
}
}
// This is the actual solution, as in https://stackoverflow.com/a/19037807/1002054
task clearJar(type: Delete) {
delete 'build/libs/myCompiledLibrary.jar'
}
task makeJar(type: Copy) {
from('build/bundles/release/')
into('build/libs/')
include('classes.jar')
rename ('classes.jar', 'myCompiledLibrary.jar')
}
makeJar.dependsOn(clearJar, build)
gradlew makeJar
desde la raíz de tu proyecto.En mi caso tuve que copiar los archivos gradlew.bat
y gradle
del nuevo proyecto android a la raíz de mi proyecto de librería.
Deberías encontrar tu archivo compilado myCompiledLibrary.jar
en el directorio build\libs
.
Espero que alguien encuentre esto útil.
Edit:
A pesar de que esto funciona, se encontrará con la excepción de la biblioteca duplicada al compilar un proyecto con varios módulos, donde más de un módulo (incluyendo el módulo de aplicación) depende del mismo archivo jar
(por ejemplo, los módulos tienen su propio directorio de bibliotecas, que se hace referencia en build.gradle
del módulo dado).
En caso de que necesites utilizar una única librería en más de un módulo, te recomiendo que utilices este método: https://stackoverflow.com/questions/16746558/android-gradle-build-and-the-support-library/17153240#17153240
Incluya lo siguiente en build.gradle:
android.libraryVariants.all { variant ->
task("generate${variant.name}Javadoc", type: Javadoc) {
description "Generates Javadoc for $variant.name."
source = variant.javaCompile.source
ext.androidJar = "${android.plugin.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
}
task("javadoc${variant.name}", type: Jar) {
classifier = "javadoc"
description "Bundles Javadoc into a JAR file for $variant.name."
from tasks["generate${variant.name}Javadoc"]
}
task("jar${variant.name}", type: Jar) {
description "Bundles compiled .class files into a JAR file for $variant.name."
dependsOn variant.javaCompile
from variant.javaCompile.destinationDir
exclude '**/R.class', '**/R$*.class', '**/R.html', '**/R.*.html'
}
}
A continuación, puede ejecutar gradle con: ./gradlew clean javadocRelease jarRelease
que te construirá tu Jar y también un jar javadoc en la carpeta build/libs/
.
EDIT: Con android gradle tools 1.10.+ obtener el directorio del SDK de android es diferente que antes. Tienes que cambiar lo siguiente (¡gracias Vishal!):
android.sdkDirectory
en lugar de
android.plugin.sdkDirectory