最新版本Android Studio编写Task打包Jar文件以及依赖

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"//拷贝到某个目录
           }
    }
}

代码如下 :

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文件

翻了很久很久的官网文档才找到这个

      最开始找到的是 ${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合并到一起

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目录下
        }
    }
}

 目前我们已经成功一大半了,只需要吧这个文件夹的东西打包成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} 

 

 

你可能感兴趣的:(android)