解决AS项目打架包无法打入在线引用的三方库的问题

近期项目中需要写一个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打包

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值