Android Library Gradle release JAR Android Library Gradle release JAR android android

Android Library Gradle release JAR


While I haven't tried uploading the artifacts with a deployment to Sonatype (or even a local repo), here's what I managed to come up with a few weeks ago when trying to tackle the same problem.

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);}

Then run the following:

./gradlew jarRelease


Another way to generate a jar from a library project through gradle is as follows:

In your library's build.gradle:

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)

What we are doing here is just copying the classes.jar generated by the Android Gradle plugin. Be sure to look into your build directory for this file and see if its contents are in the way you want.

Then run the makeJar task and the resulting jar will be in library/build/libs/${jarName}.jar

The will have the class files according to your configuration for release. If you are obfuscating it, then the files in the jar will be obfuscated.


Just because the previous answers were not fitting my needs, I share my tricky version to generate a jar with the project classes and the aar/jar dependencies.

// 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' )}

This does NOT manage the build types / flavours but can be adapted (it's just ok to build on build-type release without flavour).

If ever you've a smarter or more elegant solution, please share!