87

I have downloaded some library sources and would like to export it as a Jar file using Android Studio. Is there a way to export to jar file using Android studio ?

edit:

The library I want to export as jar is an Android library. It's called "StandOut" and can be downloaded from GitHub. https://github.com/pingpongboss/StandOut

Sage Pourpre
  • 9,932
  • 3
  • 27
  • 39

7 Answers7

87

It is not possible to export an Android library as a jar file. It is possible, however, to export it as aar file. Aar files being the new binary format for Android libraries. There's info about them in Google I/O, the New Build System video.

First, build the library in Android Studio or from command line issuing gradle build from your library's root directory.

This will result in <yourlibroot>/libs/build/yourlib.aar file.

This aar file is a binary representation of your library and can be added to your project instead of the library as a dependency project.

To add aar file as a dependency you have to publish it to the maven central or to your local maven repository, and then refer the aar file in your project's gradle.build file.

However, this step is a bit convoluted. I've found a good explanation how to do so here:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds

StuStirling
  • 15,601
  • 23
  • 93
  • 150
Alexander Kulyakhtin
  • 47,782
  • 38
  • 107
  • 158
44

I was able to build a library source code to compiled .jar file, using approach from this solution: https://stackoverflow.com/a/19037807/1002054

Here is the breakdown of what I did:

1. Checkout library repository

In may case it was a Volley library

2. Import library in Android Studio.

I used Android Studio 0.3.7. I've encountered some issues during that step, namely I had to copy gradle folder from new android project before I was able to import Volley library source code, this may vary depending on source code you use.

3. Modify your build.gradle file

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

4. Run gradlew makeJar command from your project root.

I my case I had to copy gradlew.bat and gradle files from new android project into my library project root. You should find your compiled library file myCompiledLibrary.jar in build\libs directory.

I hope someone finds this useful.

Edit:

Caveat

Althought this works, you will encounter duplicate library exception while compiling a project with multiple modules, where more than one module (including application module) depends on the same jar file (eg. modules have own library directory, that is referenced in build.gradle of given module).

In case where you need to use single library in more then one module, I would recommend using this approach: Android gradle build and the support library

Community
  • 1
  • 1
7hny
  • 991
  • 1
  • 11
  • 9
38

Since Android Studio V1.0 the jar file is available inside the following project link:

debug ver: "your_app"\build\intermediates\bundles\debug\classes.jar

release ver: "your_app"\build\intermediates\bundles\release\classes.jar

The JAR file is created on the build procedure, In Android Studio GUI it's from Build->Make Project and from CMD line it's "gradlew build".

Avi Levin
  • 1,868
  • 23
  • 32
  • 3
    thou shall receive all my internets for this answer – m02ph3u5 Jun 02 '15 at 13:45
  • I do see the debug ver, but I don't see the release folder inside bundles, any ideas why? – Aparajith Sairam Jun 18 '15 at 19:24
  • 2
    Found it, in Build Variants, we have to choose Build Variant to be 'release'. But now the classes.jar is not present in the release folder! – Aparajith Sairam Jun 18 '15 at 19:34
  • 1
    @AparajithSairam how did you built your JAR, command line or gui ? – Avi Levin Jun 21 '15 at 21:21
  • Through GUI. But then I created one task makeJar as suggested in the other answers and used the command line and that worked. Is there any way to get it through GUI itself? Thanks. – Aparajith Sairam Jun 22 '15 at 14:24
  • 1
    @AparajithSairam, I found something in GUI but it relevant only for APK files builds. after selecting the relevant build variant press the green "play" icon. it will run a background assembly gradle command which will create the file. For a JAR file in CMD, you will have to run gradlew assembleDebug or Release or whatever flavor you have. After that the JAR would be available on the following location: your_app"\build\intermediates\bundles\"falvor"\classes.jar you can see all your assembly commands using "gradlew tasks" – Avi Levin Jun 27 '15 at 08:59
  • 1
    I upvoted another answer over a year ago. Screw that business. This is cake! Thanks!! – Kevin Dec 15 '15 at 23:42
  • hi, thank you, could you tell me which is the right one? When I should use debug or release jar? What are the differences? – user3290180 Feb 19 '16 at 11:04
  • @user3290180, both release and debug are build types represent the build packaging versions generated for each app package, you can edit them inside your gradle app script. By default, the debug and release build types are provided. for example in release you can add progroud or something else that you wouldn't add in your debug product. In addition to build types you can add product flavors for example "free" and "payed" versions. In this example, the product flavors and build types create the following build variants: freeDebug , freeRelease, payedDebug, payedRelease. – Avi Levin Feb 20 '16 at 14:21
  • @user3290180, In addition to what i wrote, basically if you didn't added any special script process for release in your gradle script there is no difference between release and debug versions and you can take one of the two jars.. – Avi Levin Feb 20 '16 at 18:08
  • Is this still available? I didn't see a jar file in that directory after trying this – Cullub Dec 27 '21 at 01:09
31

Include the following into 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'
    }
}

You can then execute gradle with: ./gradlew clean javadocRelease jarRelease which will build you your Jar and also a javadoc jar into the build/libs/ folder.

EDIT: With android gradle tools 1.10.+ getting the android SDK dir is different than before. You have to change the following (thanks Vishal!):

android.sdkDirectory 

instead of

android.plugin.sdkDirectory
Andrey
  • 830
  • 9
  • 12
  • Great answer, this worked perfectly for me. You can also add a gradle target in android studio to run the jarDebug task which will create the usable jar(I have tested this in an eclipse project and it also works fine). – Pellet May 27 '14 at 02:27
  • 8
    Why does the "new" Android build system make it this ugly :(. – Martin Konecny Aug 01 '14 at 04:56
  • Great solution to generate a JAR file! Is it possible to include the resources as well? – Gaëtan Dec 04 '14 at 16:07
13

I was able to export a jar file in Android Studio using this tutorial: https://www.youtube.com/watch?v=1i4I-Nph-Cw "How To Export Jar From Android Studio "

I updated my answer to include all the steps for exporting a JAR in Android Studio:

1) Create Android application project, go to app->build.gradle

2) Change the following in this file:

  • modify apply plugin: 'com.android.application' to apply plugin: 'com.android.library'

  • remove the following: applicationId, versionCode and versionName

  • Add the following code:

// Task to delete old jar
task deleteOldJar(type: Delete){
   delete 'release/AndroidPlugin2.jar'
}
// task to export contents as jar
task exportJar(type: Copy) {
    from ('build/intermediates/bundles/release/')
    into ('release/')
    include ('classes.jar')
    rename('classes.jar', 'AndroidPlugin2.jar')
}
exportJar.dependsOn(deleteOldJar, build)

3) Don't forget to click sync now in this file (top right or use sync button).

4) Click on Gradle tab (usually middle right) and scroll down to exportjar

5) Once you see the build successful message in the run window, using normal file explorer go to exported jar using the path: C:\Users\name\AndroidStudioProjects\ProjectName\app\release you should see in this directory your jar file.

Good Luck :)

RMDev
  • 163
  • 1
  • 11
9

Here's yet another, slightly different answer with a few enhancements.

This code takes the .jar right out of the .aar. Personally, that gives me a bit more confidence that the bits being shipped via .jar are the same as the ones shipped via .aar. This also means that if you're using ProGuard, the output jar will be obfuscated as desired.

I also added a super "makeJar" task, that makes jars for all build variants.

task(makeJar) << {
    // Empty. We'll add dependencies for this task below
}

// Generate jar creation tasks for all build variants
android.libraryVariants.all { variant ->
    String taskName = "makeJar${variant.name.capitalize()}"

    // Create a jar by extracting it from the assembled .aar
    // This ensures that products distributed via .aar and .jar exactly the same bits
    task (taskName, type: Copy) {
        String archiveName = "${project.name}-${variant.name}"
        String outputDir = "${buildDir.getPath()}/outputs"

        dependsOn "assemble${variant.name.capitalize()}"
        from(zipTree("${outputDir}/aar/${archiveName}.aar"))
        into("${outputDir}/jar/")
        include('classes.jar')
        rename ('classes.jar', "${archiveName}-${variant.mergedFlavor.versionName}.jar")
    }

    makeJar.dependsOn tasks[taskName]
}

For the curious reader, I struggled to determine the correct variables and parameters that the com.android.library plugin uses to name .aar files. I finally found them in the Android Open Source Project here.

David
  • 2,429
  • 24
  • 15
4

We can export a jar file for Android library project without resource files by Android studio. It is also requirement what I met recently.

1. Config your build.gradle file

    // Task to delete old jar

    task clearJar(type: Delete){
       delete 'release/lunademo.jar'
    }

    // task to export contents as jar
    task makeJar(type: Copy) {
       from ('build/intermediates/bundles/release/')
       into ('build/libs/')
       include ('classes.jar')
       rename('classes.jar', 'lunademo.jar')
    }
    makeJar.dependsOn(clearJar, build)

2. Run gradlew makeJar under your project root

You will see your libs under dir as build/libs/ if you are luckily.

============================================================

If you met issue as "Socket timeout exception" on command line as below,

enter image description here

You can follow this steps to open Gradle window in the right part and click "makeJar" on Android studio like this,

enter image description here

enter image description here

Then go to build/libs dir, you will see your jar file.

Hope that it is helpful for u.

Good Luck @.@

Luna

Luna Kong
  • 3,065
  • 25
  • 20