AS生成jar、so、aar以及上传远程库jcenter
起因
各位安卓开发的各位小伙伴,大家肯定要用到很多类库。
如果,我们有一些特殊需求,就是一个项目的某个模块的功能给其他项目使用。我们直观的是想到依赖module呗。确实可以,如果项目模块依赖过多呢?我们可以选择更好的jar、so、aar方式进行管理,使项目更加的清晰分明。
名词
jar:故名思议,java类库。不包含任何其他东西。
so:有过c、c++开发的小伙伴一定不陌生。动态链接库,只包含c、c++
aar:二进制归档文件,包含jar、so以及res、assets等各种资源。
明白以上概念的区别之后,我们可以根据业务需求,选择不同的依赖。
jar生成
项目结构,三个module分别对应生成jar、so、aar生成相关工作

大家在写好代码后,如果要生成jar,可以双击下面蓝色部分

最后生成默认名字为classes.jar文件,路径层级如下

那么,我们每次从这里面找文件,无疑是操蛋的。别急,自定义任务指定输出jar路径。
注意:在对应module的android{}区域内定义。
//generatejar_makeJar是任务名称,推荐通过mouldeName+actionName(考虑多模块问题)
//类型是copy操作
task generatejar_makeJar(type: Copy) {
//指定来源文件夹
from('build/intermediates/bundles/release')
//指定目的文件夹(目的文件如果已经存在,不需要先执行删除,会执行覆盖.)
into('build/libs')
//指定来源文件
include('classes.jar')
//给复制后的文件重命名
rename('classes.jar', 'generatejar.jar')
}
//generatejar_makeJar的执行依赖于build(build先去生成对应的源文件)
generatejar_makeJar.dependsOn(build)
定义完毕之后,后面就是执行任务了。

任务执行成功之后,查看如下目录

我们在module的build文件夹直接子层级,生成了libs目录以及里面的generatejar.jar文件
注意:通过 gradlew generateaar_makeAar 命令我们直接就拿到了对应的jar(我们自定义task依赖了build)。不需要像之前那样先执行module的 assembleRelease命令。
什么?你告诉我gradlew不是内部或者外部命令?

win平台小伙伴自己去配置下全局环境吧。
-------------------------------完成jar的生成--------------------------------------
生成so
各位小伙伴肯定用到过很多so文件,有没有想过生成自己的so文件?这样,别人也可以方便的使用我们的so。
好吧,这个涉及到cmake、lldb和jni等,我后续专门开文介绍吧,不能跑题,继续so的生成。
首先,类似jar的生成,我们需要先双击下面蓝色命令

执行完毕命令之后,得到了不同cpu构架的so文件

同样的,我们可以自定义任务指定输出路径
//跟上面jar生成方式一致
task generateso_makeJar(type: Copy) {
from('build/intermediates/bundles/release')
into('build/libs')
include('classes.jar')
rename('classes.jar', 'generateso.jar')
}
//这个generatejarMakeJar的执行依赖于build(build先生成对应的源文件)
generateso_makeJar.dependsOn(build)
//定义任务指定来源文件夹、目的文件夹、
//目的文件如果已经存在,不需要先执行删除,会执行覆盖.
//generateso_makeSo是任务名称,推荐通过mouldeName+actionName(考虑多模块问题)
task generateso_makeSo(type: Copy) {
from('build/intermediates/bundles/release/jni')
into('build/so')
}
generateso_makeSo.dependsOn(build)
执行命令,如下所示

最后,得到module的build文件夹直接子层级so文件夹以及内部文件,如下所示

注意:我们不仅需要生成so还需要生成对应的jar,因为我们的so是动态链接库,包含c、c++。但是,我们调用c、c++的方法代码全在jar里面。两个要一起使用。
-------------------------------------------完成so的生成----------------------------------------
生成aar
aar的生成和上面类似,首先要双击如下蓝色按钮

执行完毕,得到generate-release.aar。路径层级如下

我们同样可以自定义任务,指明我们的输出路径。
//定义任务指定来源文件夹、目的文件夹、来源文件、并且重命名
//目的文件如果已经存在,不需要先执行删除,会执行覆盖.
//generateaar_makeAar 是任务名称,推荐通过mouldeName+actionName(考虑多模块问题)
//include指定包含那些文件(下面表示所有的aar类型)
task generateaar_makeAar(type: Copy) {
from('build/outputs/aar')
into('build/aar')
include('*.aar')
}
//generateaar_makeAar依赖build(build生成相关源文件)
generateaar_makeAar.dependsOn(build)
执行命令,如下

得到对应的generate-release.aar,目录层级如下

这样我们jar、so、aar三个文件夹的层级都在moudle的build文件夹的直接子层级。方便获取管理。
注意:本地aar的依赖首先要指定本地仓库,然后指明依赖。在app.gradle里面添加如下代码
//指明本地文件夹路径(本地.aar文件存放路径)
//android{}里面添加下面代码
repositories {
flatDir {
dirs 'libs'
}
}
//依赖generate-release.aar文件
//dependencies {}里面添加下面代码
implementation(name: 'generateaar-release', ext: 'aar')
------------------------------完成aar生成-------------------------------------------------
最后,我们生成了so、jar、aar。我们可以方便的给其他项目添加,保证结构整齐。我们也可以分享给其他人。但是。作为分享的话,发布远程仓库这种方式也是不错的方案,特别对于喜欢写开源代码的小伙伴。
由于篇幅过长,发布远程仓库(jcenter)不再赘述。传送门:https://www.jianshu.com/p/903f3f111e3b
总结
使用jar、so、aar可以更好的细化我们的项目,特别是针对包含c、c++代码的项目,一个项目负责生成so以及jar并测试,一个项目负责调用native代码。
希望本文能帮到大家~
Demo地址:https://github.com/HoldMyOwn/GenerateJarSoAar.git
commit预览(包含c、c++的简单调用,后期开文介绍c、c++开发)
