AndroidStudio如何将两个Module打成一个jar包或者aar

前几篇文章抄啊抄,基本Android组件化开发看那几篇就够用了,下面就该打包了,(⊙o⊙)…打包遇到了问题,参照如下问题:

问题地址:https://www.oschina.net/question/2292274_2192845

AndroidStudio如何将两个Module打成一个jar包或者aar

现在有一个Android工程有三个module  demo 、library、core  其中library模块依赖于core模块  现在想把library模块以及他所依赖的core模块生成一个jar或者aar 供别的工程使用,请问应该如何操作。目前网上能找到的打包都是只有一个模块的打包 ,打的包里面没有依赖的core模块,无法使用。

解决方案概况就是: 将core模块打包成jar,放到library的libs目录下,然后library打包的时候type类型type:jar,就可以将core包含到library里。

解决方案:https://blog.csdn.net/qq_20328181/article/details/84333750

在做项目的时候,很多人都想把自己写的Module或者Libs或者Utils分享出来,一来可以在其他项目中方便用到之前写的东西,二来可以帮助同事提高效率,一般大神们都会选择用Jcenter Maven仓库的方法,然后在build.gradle中去引用这个第三方库,而我们小白呢,一般都会生成一个Library Module包来创建自己要分享公开的代码,但是如果这个Module中不再修改什么的话,一直用Module来传递未免也太不方便了,而且Module在相互传递发送的时候也有可能发生里面某个文件丢失的情况,虽然概率很低。而还有一个办法就是生产jar包来用,jar包在相互发送的时候由于被压缩后反而比较小,速度快,不易丢失文件。

但是问题来了,如果在要生成jar包的Module中还有其他第三方的jar包呢,一般情况在引入或者创建Module的时候,build整个项目就会在Module中的build—>intermediates—>intermediate-jars中会自动生成一个jar包,一个debug版本一个release版本,不同版本的Android Studio生成的路径可能不同。

PS:2020/5/15  我目前使用的Android Studio 3.6.3

路径为:build/intermediates/packaged-classes/release/

下图已不是最新的了。。。

我也搜了网上一部分有人说还要在build.gradle中配置,复制、删除原包,重命名等一系列命令符操作,拿到一个新生成的jar包,其实这个jar包已经包含原来Module的源码,但是但是但是(重要的事情说三遍)这个jar包是不包含源码Module包中Libs下的第三方jar包的,如果引入这个jar包的话,程序会报错NoClassDefFoundError,就是因为没有找到其里面还有的一个第三方jar包,这就尴尬了,那问题又来了,那么我们怎么让Module生成jar包的时候把libs中的第三方jar包也打进去呢,我又在网上查了一下,有很多人说要用Apache ANT工具,但是要使用ANT工具需要下载,配置环境变量,输入ant命令等一系列操作,像我这么懒得人怎么会做这么复杂繁琐的工作呢,然后,今天的重点来了

在不使用ANT工具的条件下,把Module的Libs下的第三方jar包合并Module生成包含第三方jar的新jar包,其实也是在build.gradle中用task操作符操作,但是类型不是copy,而是Jar,在Module中的build.gradle中的最后加上一句这样的代码

和原来的task不同的是,把type:Copy改成了type:Jar,archivesBaseName的值等于新生成的jar包的名字,下面两句from是说把这两个路径下的jar打进去,最后一句是生成的路径,这样就可以把两个jar包合并,很多人是用Terminal的命令符操作gradle makeJar打jar包,我就跟人不一样,我就喜欢用Android Studio最右边的Gradle工具,在Module项目下找到Tasks—>other—>makeJar,或者直接敲makeJar就会出来,点击就可以了。

只要等到出现Build Successful就生成好了,现在就去配置好的路径找到这个jar包就可以了

要是不确定是否合并,可以复制一份放到桌面,将后缀改成zip,就能看到里面的确是有你要的两个包。

PS:但是在Android Studio 3.6.3 按上面的方式会报错

 

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':testlibrary:makeJar'.
> Failed to create MD5 hash for file 'I:\AndroidStudioProjects\TestDemo\testlibrary\build\intermediates\packaged-classes\release\libs\base.jar' as it does not exist.


报错的原因呢,就是编译过后libs文件夹是空的,Android Studio并没有将我们app/libs目录下的文件拷贝到\build\intermediates\packaged-classes\release\libs文件夹下,那我们改一下from语句指定的路径就好了,修改如下:

from (project.zipTree("libs/base.jar"))//将base.jar作为源码添加到test.jar中


下面是我的task代码:

task makeJar(type: Jar) {//生成不含dex的jar
    archiveName = 'test.jar'
    //如果之前存在,则先删除
    delete 'build/libs/test.jar'
    //设置拷贝的文件
    from (project.zipTree("build/intermediates/packaged-classes/release/classes.jar"))
    from (project.zipTree("libs/base.jar"))//将base.jar作为源码添加到test.jar中
    
    destinationDir = file('build/libs') //生成的jar的输出路径,我这里是在module对应的build文件夹下面的libs文件夹

}
makeJar.dependsOn(build)//执行makeJar的时候会在之前执行build

完蛋:打包是打包到一起了,Android程序无法调用,o(╥﹏╥)o,下周再解决吧,O(∩_∩)O哈哈~

 

2020年5月19日

什么鬼???  按照上面的task代码,生成的test.jar中包含了两份base.jar  ,回到

build/intermediates/packaged-classes/release/文件夹下,

此时的classes.jar居然是一个包含base.jar的jar包,为什么呢这是?这个目录下的jar上面分析不是应该不包含第三方jar嘛。。。

难道 type:Jar后就是包含第三方jar包,不用再添加这句

from (project.zipTree("libs/base.jar"))了

最终就是下面简单的task代码:

task makeJar(type: Jar) {//生成不含dex的jar
    archiveName = 'test.jar'
    //如果之前存在,则先删除
    delete 'build/libs/test.jar'
    //设置拷贝的文件
    from (project.zipTree("build/intermediates/packaged-classes/release/classes.jar"))
    destinationDir = file('build/libs') //生成的jar的输出路径,我这里是在module对应的build文件夹下面的libs文件夹

}
makeJar.dependsOn(build)//执行makeJar的时候会在之前执行build

 

备注:使用的Android Studio 3.6.3   gradle 5.4.1

 

PS:
2020年6月17日,ε=(´ο`*)))唉,又遇到问题

单独打包base.jar居然 没有build/intermediates/packaged-classes 目录

其实还有三个文件夹能找到 classes.jar,他们是build/intermediates目录下aar_main_jar、compile_library_classes、runtime_library_classes 三个文件夹,这三个是有区别的,自己挑个合适的用吧。。。。。。

原单独打包base.jar的makeJar代码

task  makeJar(type: Copy){
    delete('build/libs/base.jar')
    from('build/intermediates/packaged-classes/release/')
    into('build/libs/')
    include('classes.jar')
    rename('classes.jar','base.jar')
}

makeJar.dependsOn(build)//执行makeJar的时候会在之前执行build

build之后找不到build/intermediates,那换成aar_main_jar/release凑合着用吧

task  makeJar(type: Copy){
    delete('build/libs/base.jar')
    from('build/intermediates/aar_main_jar/release/')
    into('build/libs/')
    include('classes.jar')
    rename('classes.jar','base.jar')
}

makeJar.dependsOn(build)//执行makeJar的时候会在之前执行build

 

我勒个去,为什么上面build之后没有packaged-classes目录

额,gradle版本是5.6.4就不生成这个目录。

哎,gradle换回老版本吧 5.4.1就有那个目录了。

PS:

gradle文件夹 - gradle-wrapper.properties 中指的是gradle 版本号

build.gradle文件 - classpath ‘com.android.tools.build:gradle:3.6.3’ 指的是 gradle 插件的版本号,而不是 gradle 的版本号。

 

 

下面两篇文章可以参考:

AndroidStudio3.6.1打包jar,AndroidStudio4.0打包jar

https://blog.csdn.net/Yu1441/article/details/104770779

 

AndroidStudio3.6.1打包jar

https://blog.csdn.net/lenyue2011/article/details/105156648

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值