前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AndroidStudio生成jar、so、aar以及上传远程库jcenter

AndroidStudio生成jar、so、aar以及上传远程库jcenter

作者头像
ZhangXianSheng
发布2019-05-28 12:34:00
1.6K0
发布2019-05-28 12:34:00
举报
文章被收录于专栏:复盘总结文章集合

起因

各位安卓开发的各位小伙伴,大家肯定要用到很多类库。 如果,我们有一些特殊需求,就是一个项目的某个模块的功能给其他项目使用。我们直观的是想到依赖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{}区域内定义。

代码语言:javascript
复制
//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不是内部或者外部命令?

图片.png

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

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

生成so

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

图片.png

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

图片.png

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

代码语言:javascript
复制
//跟上面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

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

代码语言:javascript
复制
//定义任务指定来源文件夹、目的文件夹、来源文件、并且重命名
//目的文件如果已经存在,不需要先执行删除,会执行覆盖.
//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里面添加如下代码

代码语言:javascript
复制
  //指明本地文件夹路径(本地.aar文件存放路径)
//android{}里面添加下面代码
repositories {
    flatDir {
        dirs 'libs'
    }
 }

//依赖generate-release.aar文件
//dependencies {}里面添加下面代码
implementation(name: 'generateaar-release', ext: 'aar')

------------------------------完成aar生成-------------------------------------------------

最后,我们生成了so、jar、aar。我们可以方便的给其他项目添加,保证结构整齐。我们也可以分享给其他人。但是。作为分享的话,发布远程仓库这种方式也是不错的方案,特别对于喜欢写开源代码的小伙伴。 由于篇幅过长,发布远程仓库(jcenter)不再赘述。

总结

使用jar、so、aar可以更好的细化我们的项目,特别是针对包含c、c++代码的项目,一个项目负责生成so以及jar并测试,一个项目负责调用native代码。 希望本文能帮到大家~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 起因
  • 名词
  • jar生成
  • -------------------------------完成jar的生成--------------------------------------
  • 生成so
  • -------------------------------------------完成so的生成----------------------------------------
  • 生成aar
  • 注意:本地aar的依赖首先要指定本地仓库,然后指明依赖。在app.gradle里面添加如下代码
  • ------------------------------完成aar生成-------------------------------------------------
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档