Android Studio (Gradle)编写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} 

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Android Studio打包jar文件,可以按照以下步骤操作: 1. 在项目的build.gradle文件中添加以下代码: ``` android { ... } // 添加以下代码 task createJar(type: Copy) { from('build/intermediates/bundles/release/') into('release/') include('classes.jar') rename('classes.jar', 'your_jar_name.jar') } // 添加以下代码 artifacts { archives createJar } ``` 2. 点击菜单栏中的Build -> Make Project,等待编译完成。 3. 在项目根目录下会生成一个release文件夹,里面含了生成的jar文件。 4. 如果想要修改生成的jar文件名字,可以在build.gradle文件中修改rename('classes.jar', 'your_jar_name.jar')中的your_jar_name为自己想要的名字。 希望对你有帮助! ### 回答2: Android Studio 是一款非常流行的 Android 应用程序开发工具,其内置了许多有用的工具和功能,其中打包 JAR 文件的功能。下面是打包 JAR 的详细步骤。 步骤 1:创建 Java Library Module 在 Android Studio 中创建一个新项目或打开现有项目并使用以下步骤创建一个 Java Library Module: 1. 选择 File -> New -> New Module。 2. 在弹出窗口中,选择 Java Library,并单击 Next。 3. 输入模块名称,例如 mylibrary,并单击 Finish。 这将创建一个名为 mylibrary 的新 Java Library Module。 步骤 2:编写 Java 代码 在 mylibrary 模块中编写您的 Java 代码。请确保类和方法公开,以便使用该库时可以从您的应用程序中调用。 步骤 3:配置 Gradle 1. 在 Project 面板中,打开 build.gradle(Module: mylibrary)文件。 2. 将以下代码添加到文件的末尾: ``` task createJar(type: Jar) { from('build/classes/main/') archiveName = "mylibrary.jar" } ``` 此代码指定 Gradle 任务,该任务将创建名为 mylibrary.jarJAR 文件,并将其保存在 build/libs 目录下。 3. 在菜单栏中,选择 Build -> Build Module 'mylibrary'以将项目编译为 JAR 文件。 步骤 4:使用您的 JAR 文件 1. 打开您的 Android 应用程序项目。 2. 将生成的 mylibrary.jar 文件复制到您的应用程序项目的 libs 目录中。 3. 在 Project 面板中,右键单击您的应用程序项目,并选择 Open Module Settings。 4. 在左侧面板中,选择您的应用程序模块。 5. 在右侧面板中,选择 Dependencies 标签。 6. 单击加号图标,然后选择 File dependency。 7. 选择您刚刚复制到 libs 目录的 mylibrary.jar 文件,并单击 OK。 8. 现在,您可以使用您的 JAR 文件中定义的任何类和方法来开发您的 Android 应用程序了。 总结 使用 Android Studio 打包 JAR 文件非常简单,只需要创建一个 Java Library Module、编写您的 Java 代码、配置 Gradle 和使用您的 JAR 文件。遵循上面的步骤,您可以轻松地将自己的库添加到 Android 应用程序中。 ### 回答3: Android Studio 是一个基于 IntelliJ IDEA 的 Android 应用程序开发工具,它提供了一系列的工具,用于方便应用程序的开发、测试和部署。Android Studio 可以打包.jar 文件打包.jar 是为了把编写的 Java 代码作为一个独立并可重用的代码库发布并运行在不同的平台上。而jar具有高的可重用性和可扩展性,会出现在很多项目中。下面介绍如何在 Android Studio打包.jar: 第一步,配置 build.gradle。在 app 目录下,打开 build.gradle 文件,配置以下代码: ``` apply plugin: 'com.android.library' android { compileSdkVersion 26 defaultConfig { minSdkVersion 17 targetSdkVersion 26 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) } task deleteOldJar(type: Delete) { delete 'libs/your_project.jar' } task exportJar(type: Exec) { workingDir "${project.buildDir}/intermediates/classes/release/"//.class 文件所在目录 def jarName = "your_project.jar" // Jar 名称 commandLine 'jar', 'cvf', "../../../../../libs/'$jarName'", "."//manifest 和 class 所在目录,"."意为当前目录 } exportJar.dependsOn(deleteOldJar, build) ``` 其中, apply plugin: 'com.android.library' 这句话意味着当前工程看做一个 library,而不是一个 application。 dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) } 这句话意味着查找 libs 文件夹中的所有.jar 文件,并引用其中的类。 task deleteOldJar(type: Delete) { delete 'libs/your_project.jar' } 这里的任务名叫做 deleteOldJar,它的作用是在执行 exportJar 任务之前,删除之前的 Jar ,避免重复。 task exportJar(type: Exec) { workingDir "${project.buildDir}/intermediates/classes/release/" def jarName = "your_project.jar" commandLine 'jar', 'cvf', "../../../../../libs/'$jarName'", "." } 这里的任务名叫做 exportJar,它的作用是在将编译后的.class 文件打包Jar ,具体实现关键在于 commandLine、workingDir 和 jarName。其中: commandLine 表示之后要执行的命令,'jar' 表示要打包Jar ,'cvf' 表示创建新文件、给文件注释、打成压缩的格式。 workingDir 表示在执行命令之前,切换到的目录。这里是指切换到编译好的.class 文件所在的目录。 jarName 表示要生成的 Jar 文件名称。 第二步,执行任务。这时,在 Android Studio 中,打开 Terminal(快捷键为 Alt + F12),然后执行以下命令: ``` ./gradlew exportJar ``` 运行完成后,在 app 目录下的 libs 文件夹中,就可以看到生成的.jar 文件。 总结一下,以上就是在 Android Studio打包.jar 的全部步骤,如需更多细节请阅读 Configuring Gradle Builds 文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值