How to create an Android Library Jar with gradle without publicly revealing source code?

BVB

I would like to create a Jar out of an Android library project. It is set up the following way:

ProjectName
    \- lib
    |   \- lib
    |       \- armeabi
    |           \- libNativeFirst.so
    |           \- libNativeSecond.so
    \- src
        \- main
            \- java
                \- com.package.sdk
                    \- PackageSDK.java

I would like for all of this to be packaged in a Jar, but without revealing the source code present in PackageSDK.java.

I set up my build.gradle file like so:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }

    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            resources {
                srcDir 'src/../lib'
            }
        }
    }
}

task jar(type: Jar) {
    from android.sourceSets.main.allSource
}

When I run gradlew clean jar in the project's directory, a Jar file is created in ProjectName\build\libs called ProjectName.jar. It's structure is as follows:

ProjectName.jar
    \- lib
    |   \- armeabi
    |       \- libNativeFirst.so
    |       \- libNativeSecond.so
    \- com
        \- package
            \- sdk
                \- PackageSDK.java

I would like for the compiled PackageSDK.class to be included instead of the PackageSDK.java file when executing the jar task. What can I change to achieve this?

Edit:

Per Ben Manes's suggestion, I changed the configuration of the sourceSets to the following:

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
        }
        resources {
            srcDir 'src/../lib'
        }
        output {
            classesDir 'build/classes'
            resourcesDir 'build/javaResources'
        }
    }
}

And the jar task to the following:

task jar(type: Jar) {
    from android.sourceSets.main.output
}

Gradle is now giving me this output:

Could not find method output() for arguments [build_25r1m0a3etn5cudtt5odlegprd$_run_closure2_closure9_closure10_closure13@138532dc] on source set main.

BVB

Note: The answer has been edited. Please see the 07/28/2014 update below.

Here is a solution I ended up coming up with. There may be a better way available, but I have not found it yet.

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }

    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            resources {
                srcDir 'src/../lib'
            }
        }
    }
}

task clearJar(type: Delete) {
    delete 'build/libs/ProjectName.jar'
}

task makeJar(type: Copy) {
    from('build/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'ProjectName.jar')
}

makeJar.dependsOn(clearJar, build)

Running gradlew makeJar creates a ProjectName.jar in the build/libs directory. The structure of this jar is as follows:

ProjectName.jar
    \- lib
    |   \- armeabi
    |       \- libNativeFirst.so
    |       \- libNativeSecond.so
    \- com
        \- package
            \- sdk
                \- PackageSDK.class

This is the exact result I needed. I am now able to use ProjectName.jar successfully in other projects.

EDIT: While I am able to use the resulting jar in projects within Android Studio, I cannot do so in projects created in ADT due to a warning about native code being present inside a jar file. Supposedly there is a flag to turn off this check in settings, but it does not function correctly. Thus, if you want to create a library that uses native code, those using ADT will have to manually copy the armeabi directory into libs/.

07/28/2014 Update:

As of Android Studio 0.8.0, Gradle output directories have been changed and the configuration outlined above will not work. I have changed my configuration to the following:

task clearJar(type: Delete) {
    delete 'build/outputs/ProjectName.jar'
}

task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('build/outputs/')
    include('classes.jar')
    rename ('classes.jar', 'ProjectName.jar')
}

IMPORTANT: Please note that ProjectName.jar will now be placed into build/outputs/ and NOT into build/libs/.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Android - Need a way to create the library(.aar file) without source code

From Java

How to create jar for Android Library Project

From Dev

how to create library ( jar ) in android studio ?

From Dev

Android Library Gradle release JAR

From Dev

How to download Source code from Android Google Source With Gradle files

From Dev

Create zip of the source code in gradle

From Dev

Create zip of the source code in gradle

From Dev

how to create a java jar file with source code (.java files)?

From Dev

How to distribute Swift Library without exposing the source code?

From Dev

How to create a static library with a Makefile from C source code

From Dev

How to create Jar file from android library project with resources?

From Dev

Gradle: How to create multiple jar?

From Dev

How to create executable JAR with Gradle?

From Dev

How to create a library on Github and use it through gradle dependencies in Android Studio

From Dev

Create Jar Library Without a Main Class

From Dev

Publish an Android library to Maven with aar and source jar

From Dev

Adding source to a jar library in Android Studio project

From Dev

How to generate on the fly Java source code to build with Gradle in Android Studio?

From Dev

Gradle. How to generate source code before compilation in android app

From Dev

Android ProGuard how to hide/obfuscate source code of exported library

From Dev

How to use and modify the source code from simplexml library in Android?

From Dev

Build a closed source Android library based on Gradle

From Dev

How to run a gradle JUnit test job without source files but with a fat jar?

From Dev

Is it possible to modify library file's source code in Android Studio from Gradle dependency

From Dev

How to create source JAR with Gradle from project files (*.java, *.js, *,xml, etc.)?

From Dev

android studio 0.4.2 + gradle + Android Source code

From Dev

Create android module library from existing source

From Dev

Obfuscating Android Library Project source code with ProGuard

From Dev

Distribute an Android library hidding the source code

Related Related

  1. 1

    Android - Need a way to create the library(.aar file) without source code

  2. 2

    How to create jar for Android Library Project

  3. 3

    how to create library ( jar ) in android studio ?

  4. 4

    Android Library Gradle release JAR

  5. 5

    How to download Source code from Android Google Source With Gradle files

  6. 6

    Create zip of the source code in gradle

  7. 7

    Create zip of the source code in gradle

  8. 8

    how to create a java jar file with source code (.java files)?

  9. 9

    How to distribute Swift Library without exposing the source code?

  10. 10

    How to create a static library with a Makefile from C source code

  11. 11

    How to create Jar file from android library project with resources?

  12. 12

    Gradle: How to create multiple jar?

  13. 13

    How to create executable JAR with Gradle?

  14. 14

    How to create a library on Github and use it through gradle dependencies in Android Studio

  15. 15

    Create Jar Library Without a Main Class

  16. 16

    Publish an Android library to Maven with aar and source jar

  17. 17

    Adding source to a jar library in Android Studio project

  18. 18

    How to generate on the fly Java source code to build with Gradle in Android Studio?

  19. 19

    Gradle. How to generate source code before compilation in android app

  20. 20

    Android ProGuard how to hide/obfuscate source code of exported library

  21. 21

    How to use and modify the source code from simplexml library in Android?

  22. 22

    Build a closed source Android library based on Gradle

  23. 23

    How to run a gradle JUnit test job without source files but with a fat jar?

  24. 24

    Is it possible to modify library file's source code in Android Studio from Gradle dependency

  25. 25

    How to create source JAR with Gradle from project files (*.java, *.js, *,xml, etc.)?

  26. 26

    android studio 0.4.2 + gradle + Android Source code

  27. 27

    Create android module library from existing source

  28. 28

    Obfuscating Android Library Project source code with ProGuard

  29. 29

    Distribute an Android library hidding the source code

HotTag

Archive