android同步aar到jcenter,AndroidStudio生成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生成相关工作

86a8656c45c01dcc62577e29ae3bafe1.png

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

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

9f9e4e99ff08079b9613c1c0e6850143.png

那么,我们每次从这里面找文件,无疑是操蛋的。别急,自定义任务指定输出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)

定义完毕之后,后面就是执行任务了。

d2e0500e0349e39b8540add9f949730b.png

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

我们在module的build文件夹直接子层级,生成了libs目录以及里面的generatejar.jar文件

注意:通过 gradlew generateaar_makeAar 命令我们直接就拿到了对应的jar(我们自定义task依赖了build)。不需要像之前那样先执行module的 assembleRelease命令。

什么?你告诉我gradlew不是内部或者外部命令?

图片.png

win平台小伙伴自己去配置下全局环境吧。

-------------------------------完成jar的生成--------------------------------------

生成so

各位小伙伴肯定用到过很多so文件,有没有想过生成自己的so文件?这样,别人也可以方便的使用我们的so。

好吧,这个涉及到cmake、lldb和jni等,我后续专门开文介绍吧,不能跑题,继续so的生成。

首先,类似jar的生成,我们需要先双击下面蓝色命令

图片.png

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

图片.png

同样的,我们可以自定义任务指定输出路径

//跟上面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)

执行命令,如下所示

图片.png

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

图片.png

注意:我们不仅需要生成so还需要生成对应的jar,因为我们的so是动态链接库,包含c、c++。但是,我们调用c、c++的方法代码全在jar里面。两个要一起使用。

-------------------------------------------完成so的生成----------------------------------------

生成aar

aar的生成和上面类似,首先要双击如下蓝色按钮

图片.png

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

图片.png

我们同样可以自定义任务,指明我们的输出路径。

//定义任务指定来源文件夹、目的文件夹、来源文件、并且重命名

//目的文件如果已经存在,不需要先执行删除,会执行覆盖.

//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)

执行命令,如下

图片.png

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

图片.png

这样我们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代码。

希望本文能帮到大家~

commit预览(包含c、c++的简单调用,后期开文介绍c、c++开发)

作者:Allen___

链接:https://www.jianshu.com/p/9058b1e040e1

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值