近期项目中需要写一个sdk,已jar架包的形式给第三方使用,同时在架包里在线引用了一些其他的三方库;在打成jar架包后,发现引用的三方库无法达到架包里;经过多方查询和研究(其实就是百度),终于找到了一个可实行的方案,先记录一下,防止忘记的同时,也希望可以帮助到其他遇到此类问题的同学;
一、常用打包方式
task makeJar(type: org.gradle.api.tasks.Copy){ //删除build/libs下的test.jar目录 // delete 'build/libs/jsonsdk_v1.2.jar' //生成目录下的classes.jar导入到build/libs/目录下 from('build/intermediates/packaged-classes/release') into('build/libs/') include('classes.jar') //重新命名 rename('classes.jar','xxx_v1.0.0.jar') } makeJar.dependsOn(build)
这是比较常用的项目中打jar架包的方式,也是百度搜索最常见的;一般情况下使用此种打包没有任何问题,但是不会将三方引用的架包打进去;
二、可以将引用库打进架包的方式
此种方式比较复杂,我们按步骤一一执行;以下代码写在对应module的build.gradle文件中;
1. 先定义一些常量
针对自己的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"
2、开始拷贝jar文件
//开始拷贝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
}
}
}
3. 合并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目录下
}
}
}
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}
写的不好,引用出自以下链接,有需要可以自行查看:
Android Studio (Gradle)编写Task打包Jar文件以及依赖_涵的博客-CSDN博客_gradle task打包