Android studio将Module打包成Jar的方法

作者:Now,DayBreak 时间:2021-12-15 20:59:21 

整理记录 AndroidStudio 把一个 module 项目打包成 jar 包。

一、默认自动生成的 jar 包

众所周知 android studio 会在library所依赖的 app运行 或 build 之后自动生成 jar 包,路径为 Module根目录/build/intermediates/bundles/debug or release/classes.jar,这样生成的jar是可以用的,但不是我们可以控制的,所以我们需要通过其他方式来解决这个问题。

注意:

若发现 Android Studio 项目 bundle 文件夹下没有 release目录,可能是没有将 module 添加到主 module 依赖中。

方式1:主module右键 --> 倒数第二个Open Module Setting--> 上面最后一个选项Dependencies-->右边绿色加号-->Module dependency......然后确定

方式2:主Module的gradle的dependencies(平时添加第三方库的地方)中加上 compile project(':lib-zxing')

二、自定义生成 jar 包

首先,需要将待打包 module 项目中的 build.gradld 文件进行修改,如下图:

Android studio将Module打包成Jar的方法

其次,在 build.gradle 文件中加入如下代码:

方式一:


def _BASENAME = "TestJar";
def _VERSION = "_V1.0";
def _DestinationPath = "build"; //生成jar包的位置
def zipFile = file('build/intermediates/bundles/default/classes.jar'); //待打包文件位置

task deleteBuild(type:Delete){
 delete _DestinationPath + _BASENAME + _VERSION + ".jar"
}

task makeJar(type:Jar){
 from zipTree(zipFile)
 from fileTree(dir:'src/main',includes:['assets/**']) //将assets目录打入jar包
 baseName = _BASENAME + _VERSION
 destinationDir = file(_DestinationPath)
}

makeJar.dependsOn(deleteBuild, build)

方式二:打包的 jar 只有源代码的.class 文件,不包含资源文件


task makeJar(type: Copy) {
 delete 'build/TestJar_V1.0.jar' //删除之前的旧jar包
 from('build/intermediates/bundles/default/') //从这个目录下取出默认jar包
 into('build/') //将jar包输出到指定目录下
 include('classes.jar')
 rename('classes.jar', 'TestJar_V1.0.jar') //自定义jar包的名字
}
makeJar.dependsOn(build)

方式三:


task clearJar(type: Delete) {
 delete 'build/TestJar_V1.0.jar' //jar包的名字,随便命名
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
 //指定生成的jar名
 baseName 'TestJar_V1.0'
 //从哪里打包class文件
 from('build/intermediates/bundles/default/')
 //打包到jar后的目录结构
 into('build/')
 //去掉不需要打包的目录和文件
 exclude('test/', 'BuildConfig.class', 'R.class')
 //去掉R开头的文件
 exclude{it.name.startsWith('R');}
}
makeJar.dependsOn(clearJar, build)

注意:

以上配置信息要与 android {…….} 配置的脚本成平级关系。

其中 _BASENAME = "TestJar"; _VERSION = "_V1.0"; 是定义生成 jar 包的名字为TestJar_V1.0.jar。

配置好以后就可以编译jar包了,有两种方式:

方式 A :点击 Android Studio 右侧(一般在这个位置)的 Gradle 面板,在项目或者该类库的目录中找到 Tasks -> other -> makeJar 命令,双击这个makeJar之后等一会就会编译好jar包。

Android studio将Module打包成Jar的方法

打包成功后:在配置的指定目录下生成jar包

Android studio将Module打包成Jar的方法

方式 B :通过 cmd 命令行,在项目根目录下,执行 gradlew makeJar 命令,看到编译完成的信息以后就OK了,也能生成一样的jar包,和直接使用①中的方式是等价的。

注意:使用此方式前要配置好 gradle 的“ 环境变量 ”,否则直接在项目根目录下找不到这个命令。使用 cmd 比较费劲,不推荐。

方式 C :在 Android Studio 终端窗口中输入 gradlew makeJar 命令。

Android studio将Module打包成Jar的方法

打包成功如下图:

Android studio将Module打包成Jar的方法

打包成功后:在配置的指定目录下生成jar包

Android studio将Module打包成Jar的方法

注意:

问题1:

Android studio将Module打包成Jar的方法

对于以上配置 form 默认 jar 包部分,在用目录是 from('build/intermediates/bundles/release/') ,注意粗体部分,最初我也是按照这个目录写的,确实没问题。但后来,也就是Android Studio 更新到2.3以后,发现这个目录没有了,取而代之的是 default 和 debug 目录,debug目录之前也是有的,没有变化,只是原来的release目录被现在的default目录代替了。这导致我后来生成jar包的时候始终没有找到jar包,报上图所示错误。

原因就是没有了 release 目录,找不到默认的 classes.jar 文件,所以也就没有生成自定义名字的jar包,改为 default 或者 debug 目录以后就能正常生成jar包了,要注意这点变化。

问题2

Execution failed for task ':mylibrary:lint'.
> Lint found errors in the project; aborting build.

解决在 build.gradle 文件中,加入下面的代码块(注意代码块所在的位置),重新执行 gradlew makeJar 命令。


android {
 lintOptions {
   abortOnError false
 }
 ...
}


最后注意:


将被嵌入的应用打包成 jar 包,但是这样的方式有局限性,无法将被嵌入的应用所使用的资源性文件一起打包。下面介绍 aar 打包方式。


三、直接使用 aar 包


将被嵌入的应用打包成 aar 包,这也是 Android Studio 的一种新特性,可以将应用所使用的资源性文件一起打包。编译即可打包生成 aar 包,而且也不用担心漏掉资源问题。


如果Project 中 Module 是一个应用,则在 Module 的 build.gradle 文件中定义属性为:apply plugin: 'com.android.application';而如果 Mudule 是一个被引用的依赖 lib 库的话,则在 Module 的 build.gradle 文件中定义属性为:apply plugin: 'com.android.library;所以当我们将应用 Module 打包出 aar 文件的时候,需要修改类型属性。正常情况下,直接重新编译 Module,生成的 aar 包在 Module 根目录的/build/outputs/aar/,如下图:


Android studio将Module打包成Jar的方法


下面介绍将 aar 包添加到其他 Android 工程:


首先,将 aar 包复制到 libs 目录下


其次,配置build.gradle文件:


A 在 android 中加入,如下:




repositories {
 flatDir {
   dirs 'libs'
 }
}

B 在 dependencies中加入 compile(name:lib-zxing-release', ext:'aar')

完整 build.gradle 文件如下:


apply plugin: 'com.android.application'

android {
 ...
 repositories {
   flatDir {
     dirs 'libs'
   }
 }
}

dependencies {
 ...
 compile(name:'lib-zxing-release', ext:'aar')
}

最后,重新编译Rebuild的以下工程。

来源:https://www.cnblogs.com/xinaixia/p/7660173.html

标签:Android,studio,Module,Jar
0
投稿

猜你喜欢

  • Spring Boot利用JSR303实现参数验证的方法实例

    2022-07-28 20:36:26
  • 高效C#编码优化原则

    2023-06-13 03:16:23
  • C#下使用XmlDocument操作XML详解

    2022-08-27 16:38:53
  • spring boot 动态生成接口实现类的场景分析

    2022-12-14 05:09:33
  • UGUI实现图片拖拽功能

    2021-06-27 18:26:24
  • 通过spring注解开发,简单测试单例和多例区别

    2023-11-06 09:18:31
  • Android 自定义imageview实现图片缩放实例详解

    2023-03-08 10:56:08
  • Spring中Bean的生命周期使用解析

    2021-09-06 23:06:54
  • Java面试题冲刺第十六天--消息队列

    2022-08-08 09:07:04
  • Java中的注解和反射实例详解

    2023-02-02 04:25:45
  • JAVA集合框架工具类自定义Collections集合方法

    2022-01-11 16:24:13
  • Java并发编程之Java内存模型

    2023-08-17 23:06:10
  • 并行Stream与Spring事务相遇会发生什么?

    2022-08-28 15:40:12
  • C#在复杂多线程环境下使用读写锁同步写入文件

    2021-06-16 03:45:53
  • springcloud整合seata的实现代码

    2022-04-26 23:49:49
  • Spring Boot整合Swagger测试api构建全纪录

    2022-10-21 09:05:25
  • 详解kafka中的消息分区分配算法

    2021-06-02 08:16:15
  • JavaWeb实现学生信息管理系统(2)

    2022-03-04 02:31:12
  • SpringBoot MongoDB 索引冲突分析及解决方法

    2023-01-23 06:28:05
  • c#中switch case的用法实例解析

    2023-09-20 23:02:51
  • asp之家 软件编程 m.aspxhome.com