如何在不公开展示源代码的情况下使用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 makeJar
在build/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" />