usar una studio proyecto own libreria library incluir how generate generar for create crear aƱadir java android jar gradle aar

java - una - Android Library Gradle release JAR



incluir jar en proyecto android (3)

¿Cómo puedo lanzar el paquete Jar del proyecto android-library ?
He encontrado que classes.jar se encuentra en build/bundles/release/classes.jar y supongo que este es el paquete jar correcto (contiene archivos *.class ).

¿Hay alguna forma oficial de liberar la biblioteca como JAR en lugar de AAR?

Editar
Utilizo Gradle para liberar los artefactos de Maven, y me gustaría lanzar JAR junto con el paquete de AAR. Entonces JAR con firma, md5, manifiesto, ...
basado en https://chris.banes.me/2013/08/27/pushing-aars-to-maven-central/

apply plugin: ''maven'' apply plugin: ''signing'' configurations { archives { extendsFrom configurations.default } } def sonatypeRepositoryUrl if (isReleaseBuild()) { println ''RELEASE BUILD'' sonatypeRepositoryUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" } else { println ''DEBUG BUILD'' sonatypeRepositoryUrl = "https://oss.sonatype.org/content/repositories/snapshots/" } if(!hasProperty(''nexusPassword'')) { ext.set(''nexusPassword'', System.console().readPassword("/n/$ Type in password for Sonatype nexus account " + nexusUsername + ": ")) } if(!signing.hasProperty(''password'')) { ext.set(''signing.password'', System.console().readPassword("/n/$ Type in GPG key password: ")) } afterEvaluate { project -> uploadArchives { repositories { mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } pom.artifactId = POM_ARTIFACT_ID repository(url: sonatypeRepositoryUrl) { authentication(userName: nexusUsername, password: nexusPassword) } pom.project { name POM_NAME packaging POM_PACKAGING description POM_DESCRIPTION url POM_URL scm { url POM_SCM_URL connection POM_SCM_CONNECTION developerConnection POM_SCM_DEV_CONNECTION } licenses { license { name POM_LICENCE_NAME url POM_LICENCE_URL distribution POM_LICENCE_DIST } } developers { developer { id "loopj" name "James Smith" } developer { id "smarek" name "Marek Sebera" } } } } } } signing { required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } sign configurations.archives } task androidJavadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs } task androidJavadocsJar(type: Jar) { classifier = ''javadoc'' from androidJavadocs.destinationDir } task androidSourcesJar(type: Jar) { classifier = ''sources'' from android.sourceSets.main.java.srcDirs } artifacts { archives androidSourcesJar archives androidJavadocsJar } }

utilizando

task androidJar(type: Jar) { from android.sourceSets.main.java.srcDirs }

empaquetará solo los archivos java, no compilados y vinculados con sdk de Android


Otra forma de generar un jar desde un proyecto de biblioteca a través de gradle es la siguiente:

En build.gradle de tu biblioteca:

def jarName = ''someJarName.jar'' task clearJar(type: Delete) { delete "${project.buildDir}/libs/" + jarName } task makeJar(type: Copy) { from("${project.buildDir}/intermediates/bundles/release/") into("${project.buildDir}/libs/") include(''classes.jar'') rename(''classes.jar'', jarName) } makeJar.dependsOn(clearJar, build)

Lo que estamos haciendo aquí es simplemente copiar las clases.jar generadas por el complemento Android Gradle. Asegúrese de buscar en su directorio de compilación para este archivo y ver si su contenido está en la forma que desea.

A continuación, ejecute la tarea makeJar y el jar resultante estará en library / build / libs / ${jarName} .jar

El tendrá los archivos de clase según su configuración para el lanzamiento. Si lo está ofuscando, los archivos en el contenedor se ofuscarán.


Si bien no he intentado subir los artefactos con una implementación a Sonatype (o incluso un repositorio local), esto es lo que logré idear hace unas semanas cuando intentaba abordar el mismo problema.

android.libraryVariants.all { variant -> def name = variant.buildType.name if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) { return; // Skip debug builds. } def task = project.tasks.create "jar${name.capitalize()}", Jar task.dependsOn variant.javaCompile task.from variant.javaCompile.destinationDir artifacts.add(''archives'', task); }

Luego ejecuta lo siguiente:

./gradlew jarRelease


Solo porque las respuestas anteriores no se ajustaban a mis necesidades, comparto mi versión engañosa para generar un jar con las clases de proyecto y las dependencias aar / jar.

// A tricky jar operation, we want to generate a jar files that contains only the required classes used. // Dependencies are in jar and aar, so we need to open the aar to extract the classes and put all at the same level // (aar is a zip that contains classes.jar, the latter is a zip that contains .class files) task jar(type: Jar) { from { List<File> allFiles = new ArrayList<>(); configurations.compile.collect { for (File f : zipTree(it).getFiles()) { if (f.getName().equals("classes.jar")) { allFiles.addAll(zipTree(f).getAt("asFileTrees").get(0).getDir()) } } } allFiles.add(new File(''build/intermediates/classes/release'')) allFiles // To return the result inside a lambda } archiveName( project.ext.appName + ''.jar'' ) }

Esto NO maneja los tipos / sabores de compilación, pero se puede adaptar (está bien construir sobre la versión de compilación sin sabor).

Si alguna vez tiene una solución más inteligente o más elegante, ¡por favor comparta!