如何在不公开展示源代码的情况下使用Gradle创buildAndroid库Jar?

我想从一个Android库项目中创build一个Jar。 它被设置如下:

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

我希望所有这些都被打包在一个Jar中,但是不会暴露PackageSDK.java的源代码。

我build立了我的build.gradle文件,如下所示:

 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 } 

当我在项目目录中运行gradlew clean jar时,在ProjectName\build\libs创build了一个名为ProjectName.jar的Jar文件。 它的结构如下:

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

在执行jar任务时,我想要包含已编译的PackageSDK.class而不是PackageSDK.java文件。 我可以改变什么来达到这个目的?

编辑:

根据Ben Manes的build议,我将sourceSets的configuration更改为以下内容:

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

jar任务如下:

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

Gradle现在给我这个输出:

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

注意:答案已经被编辑。 请参阅下面的07/28/2014更新。

这是我最终提出的解决scheme。 可能有更好的方法,但我还没有find它。

 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) 

运行gradlew makeJarbuild/libs目录中创build一个ProjectName.jar 。 这个jar子的结构如下:

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

这是我需要的确切结果。 我现在可以在其他项目中成功使用ProjectName.jar

编辑:虽然我能够在Android Studio中的项目中使用生成的jar,但是我不能在ADT中创build的项目中这样做,因为有关本机代码存在于jar文件中的警告。 假设有一个标志来closures这个检查设置,但它不能正常工作。 因此,如果要创build使用本机代码的库,那么使用ADT的库将不得不手动将armeabi目录复制到libs /中。

07/28/2014更新:

从Android Studio 0.8.0开始,Gradle输出目录已被更改,上述configuration将不起作用。 我已将configuration更改为以下内容:

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

重要提示:请注意, ProjectName.jar现在被放置到build/outputs/而不是放到build/libs/

只是为@ BVB的答案添加一个轻微的替代(虽然很大程度上基于它),这是我必须做的,以输出一个jar myapp-api.jar这是一个Java处理剩余API交互的项目。 它依赖于Android.jar,因此需要使用apply plugin: 'com.android.application'而不是只apply plugin: 'java'

从myJavaAPIProject调用./gradlew build jar来构build和生成.jar到myJavaAPIProject/build/libs/myapp-api.jar

的build.gradle

 //Even though this is a Java project, we need to apply the android plugin otherwise it cannot find the SDK/android.jar and so cannot compile apply plugin: 'com.android.application' dependencies { //this ensures we have gson.jar and anything else in the /lib folder compile fileTree(dir: 'lib', include: '*.jar') } repositories { mavenCentral() } android{ compileSdkVersion 21 buildToolsVersion "21.0.1" defaultConfig { minSdkVersion 10 targetSdkVersion 21 } sourceSets { main { java { //points to an empty manifest, needed just to get the build to work manifest.srcFile 'AndroidManifest.xml' //defined our src dir as it's not the default dir gradle looks for java.srcDirs = ['src'] } } } //enforce java 7 compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } //Actually created the .jar file task jar(type: Jar) { //from android.sourceSets.main.java from 'build/intermediates/classes/release/' archiveName 'myapp-api.jar' } 

AndroidManifest.xml中

 <?xml version="1.0" encoding="utf-8"?> <!-- this is a dummy file needed to ensure gradle validates and builds ok --> <manifest package="com.myapp.android" />