Android Studio 打包JAR文件 包含依赖库
前提概要:
解决问题: 打包一个jar给另外的项目使用.但是打包的jar不包含引用的库的jar
使用Android Studio 为3.5 (3.4也行)
gradle插件版本3.2+
基于 gradle-5.1.1
参考官方文档 : https://docs.gradle.org/current/userguide/getting_started.html
编写的task存放于主Module的build.gradle下
TASK思路:
再项目build文件夹下找到想要打包的class文件copy到指定目录并且打包
TASK基础用法:
task buildTest( dependsOn: 'build') //表示在build task执行后完成执行
{
doLast {//表示在build方法执行完成后再执行
copy {//拷贝文本简单用法
from ("FilePath", "FileTree","File")// 在什么目录开始拷贝
exclude('kotlin-stdlib*')//过滤某个文件或者某些文件
include("**/*")//导入某些文件
into "FilePath"//拷贝到某个目录
}
}
}
代码如下 :
针对自己的Android Studio 版本自己调整文件夹路径
//class 目录文件
def classPath = "${project.buildDir}/intermediates/javac/release/compileReleaseJavaWithJavac/classes/"
//aidl文件
def aidlPath = "${project.buildDir}/intermediates/aidl_parcelable/release/compileReleaseAidl/out/"
//其他资源文件
def sourcePath = "${project.buildDir}/intermediates/sourceFolderJavaResources/release/"
//定义拷贝jar里面的class 以及要打包的非class的文件
def jarClass = "${project.buildDir}/jarClass"
//定义拷贝jar的目录
def allJar = "${project.buildDir}/buildJars"
//是否打包其他资源文件到jar比如在你项目源码位置有使用其他的非java的文件
def source = false
//定义打包的名称
def buildName = "test.jar"
翻了很久很久的官网文档才找到这个
最开始找到的是 ${project.buildDir}/intermediates/packaged-classes/release
这个目录下的jar但是这个jar吧jar里面的资源全删掉了
如果使用smack的库就会出错找不到里面的配置文件
//开始拷贝jar文件
task copyAllLib(dependsOn: ['assembleRelease']) {
configurations.implementation.setCanBeConsumed(true)
configurations.implementation.setCanBeResolved(true)
doLast {
delete(allJar)
copy {//拷贝jar到其他目录
from configurations.implementation
exclude('annotations*')//这个是多出来我不需要的jar
exclude('kotlin-stdlib*')//这个也是
include("**/*")
into allJar
}
}
}
执行上面的方法就会在 allJar看到需要打包的jar文件以及aar文件,由于打包jar文件所以aar里面的资源文件全废弃掉了
现在jar拷贝好了就需要打包项目源码以及吧这些jar和aar合并到一起
//开始拷贝allJars里面的jar包含的class文件以及其他文件
task copyAllLibClass(dependsOn: ['copyAllLib']) {
doLast {
delete jarClass
copy {//下面代码看得懂就看吧
File libFiles = new File(allJar)
libFiles.listFiles().each { file ->
if (file.getName().endsWith(".jar")) {
from(project.zipTree(file.getAbsolutePath()))
println("合并 jar >>>> " + file.getAbsolutePath())
exclude('META-INF/')
include("**/*")
//如果是aar就单独获取里面包含的 jar文件 这里不代表我这里完全正确,根据情况自己调整
} else if (file.getName().endsWith(".aar")) {
project.zipTree(file.getAbsolutePath()).each { aarFile ->
if (aarFile.name.endsWith(".jar")) {
from(project.zipTree(aarFile))
println("合并 aar >>>> " + aarFile.getAbsolutePath())
exclude('META-INF/')
include("**/*")
}
}
}
}
//吧源码拷贝到指定目录
from(classPath)
exclude('**/R.class')//去掉R文件
exclude('**/R\$*.class')
exclude('META-INF/')
include("**/*")//导入全部文件
//判断是否拷贝项目里面非java的和非Aidl的文件
if (source) {
from(sourcePath)
include("**/*")
}
//开始拷贝一些aidl文件aidl看情况拷贝吧,实际上是可以不用拷贝的
from(aidlPath)
include("**/*")
into(jarClass)//导入到jarClass目录下
}
}
}
目前我们已经成功一大半了,只需要吧这个文件夹的东西打包成jar就可以了
4. 打包jar
/**
* 打包资源到 jar包里面
*/
task makeJar(type: Jar, dependsOn: ['copyAllLibClass']) {
archiveName buildName//设置jar名称(官方好像不推荐)有好方法可以在下面评论
entryCompression ZipEntryCompression.STORED//设置压缩方法为不压缩,应该也可以压缩的
from(jarClass)//从上一个方法生成的文件夹打包jar文件
include("**/*")
}
目前我们已经吧Task全部编写完成了
5.运行MakeJar
点击makeJar前面的小三角形完成运行
运行makeJar就完成打包了 , 运行完成后文件就生成了 ${project.buildDir}/libs/${buildName}