今天遇到一个需求,需要把项目中的诸多的so封装成一个aar,直接使用这个aar进行调用,因为诸多的so看起来太多了,不太好管理,封装成一个aar也变相的达到了加密的效果。

文章目录

  • 打包aar流程
      • 第一步的重点就是:新建一个module并把它关联到APP module。
      • 继续回到我们的重点:
      • 第二步重点总结:把原本app module 里面的so或者其他的要打包进aar的资源,放到新建的solibrary module对应位置,包括build.gradle里面的配置。(就是src下面的libs整个剪切到solibrary module的src下面)
    • 打包完成。
  • 使用aar步骤:
      • 第一种引入方式:
      • Android导入aar报错:
      • 第二种方式:
    • 原理

首先,简单来说,aar其实就是一个压缩包,把一个项目或者一个module压缩成一个压缩包,里面可以包含项目中的所有东西,比如图片,布局,类,so等等,在其他项目中直接引入这个aar之后,就可以直接去使用这个aar中的资源了。
这样有一个什么好处呢,可以达到加密,方便管理的效果。这个aar内部的配置,在内部就可以完成了,和外部的配置没有什么关联,简化了配置文件,简化了项目module之间的关系。
把aar后缀改为rar,解压看一下里面的动有什么:

这里总结一下,如何打包aar,然后总结一下如何去把aar导入项目中去使用这个aar。

首先,要确保,打aar之前,项目是OK的,没有报错的,否则这问题点就不太好查找了。下面开始打包aar。

打包aar流程

1,首先,把要打包的东西放在一个module里。这里就以把项目中所有的so打包为aar为例。
Android studio层级管理切换到project,然后右键项目根,new–module—Android library,一路下一步。

OK,这样就建成了一个module,它会自动依赖进主APP ,如果没有依赖进去也没关系,找到APP的build.gradle(app),在dependencies里面增加对这个新建module的引用,也非常简单一句代码:

implementation project(path: ':solibrary')

这样,到此,就新建好了一个module,并且也把这个module关联到了APP这个module上面。

第一步的重点就是:新建一个module并把它关联到APP module。

2.第二步就是,把APP里面要封装成aar的东西全部剪切进这个module里。在这里就是剪切进solibrary这个module里。
但是值得一提的是,so,它是交叉编译生成的,对项目的目录层级包名有要求,所以在剪切过来的时候要和在它之前的地方一样的层次目录和一样的build.gradle配置。
什么意思呢?
就是说,在app module里面,so放的路径是什么,在solibrary module里面也要是同样的路径。在我的项目里,最初所有的so都放在了main/src下面新建了一个libs文件夹,所有的so都在这里,当然在build.gradle(app)里面也给这些so做了路径配置,要不然肯定是找不到的。
在build.gradle(app)的android节点下:

sourceSets {main {jniLibs.srcDirs = ['src/main/libs']jni.srcDirs = []}}

在代码里静态加载这些so:

这样,在app module里面,加载这些so并调用so就不会报错,可以流畅调用到了,因为在build.gradle(app)里面设置了sourceSets 这个so的路劲配置,就相当于告诉编译器,so都在哪呢?都在我这里指定的路劲下面。之前没有做修改之前,so放在app/main/src/libs里面的时候也是这样静态加载的。

继续回到我们的重点:

我们还是继续讨论如何封装aar。
把app–src下面的libs文件夹直接剪切到solibrary的src下面,把原本的build.gradle(app)里面的关于这些so的设置注释掉,并把注释的配置粘贴放在solibrary的build.grale(solibrary)对应位置也就是android节点下。
在build.gradle(solibrary)的android节点下:

sourceSets {main {jniLibs.srcDirs = ['src/main/libs']jni.srcDirs = []}}

第二步重点总结:把原本app module 里面的so或者其他的要打包进aar的资源,放到新建的solibrary module对应位置,包括build.gradle里面的配置。(就是src下面的libs整个剪切到solibrary module的src下面)

3.第三步,就是生成aar。
生成很简单,打开gradle–找到对应的solibrary module,-----build----assemble。点击它就可以生成aar了。

在项目/solibrary/solibrary\build\outputs\aar 下面就可以看到生成了两个aar。

可以看到生成了debug和release两个版本。我们使用一般用的就是release版本。
把这个aar后缀改成rar就可以看到里面的内容了。上面已经看过了。

打包完成。

其实很简单,总结来说:就是首先新建一个library module,然后把要打包进aar的东西全部放在这个module里面的对应位置,包括版本配置,gradle配置。第三步就是点击gradle–library–build–assemble,生成aar。

使用aar步骤:

使用也非常简单,但是有几个坑需要注意。引入方式有两种:

第一种引入方式:

第一步,把aar直接放在一个地方,随便放在哪都可以,引入之后,删掉它都是可以的。
第二步,引入。
点击项目根,右键–new–module–import jar、aar,然后一路下一步。

然后,同步,编译。如果不报错,那就OK了。
但是,有时候,这种导入方式会有问题。会提示一些莫名其妙的问题,比如,重复引入aar,比如application找不到,这样或者那样的一些编译问题。

Android导入aar报错:

Caused by: org.gradle.api.plugins.UnknownPluginException: Plugin with id 'com.android.application' not found.

所以,还有一种引入aar的方式。

第二种方式:

把aar放在APP的libs目录下。
然后在build.gradle(app)的android节点下增加:

repositories{flatDir{dirs 'libs'}}*

原理

增加这个repositories是什么意思?
就相当于我们之前在build.gradle(app)配置的,对于so的路径的说明,

sourceSets {main {jniLibs.srcDirs = ['src/main/libs']jni.srcDirs = []}}

就是说,在build.gradle(app)的android节点下增加

repositories{flatDir{dirs 'libs'}}*

就相当于告知编译器,我so的路径都在aar里面,在aar的具体哪里呢?不好意思,aar内部做了配置了,我不管,我只告诉你,so都在aar里。那么到底在aar哪里呢?我们需要在打aar的module的build.gradle(solibrary)里面去看。
我们之前也确实是在build.gradle(solibrary)增加了so的配置:

sourceSets {main {jniLibs.srcDirs = ['src/main/libs']jni.srcDirs = []}}

所以,原理就是这样。

在dependencies里面增加一句:

implementation(name:'solibrary-1.0' , ext:'aar')

这样,就完成了引用aar。

亲测可用。

参考:
https://my.oschina.net/u/2862573/blog/3021027

https://www.jianshu.com/p/5f369ca79275

android打包诸多so成一个aar并调用aar中的so流程总结相关推荐

  1. Android两个项目整合成一个

    需求 有两个项目A.B.两个项目相互独立,功能业务逻辑均不同.现在需要实现将两个项目整合成一个,打包出一个apk文件,安装也是只安装一个App的过程,展示上也是只展示为主项目A的App,通过主项目A的 ...

  2. python将多个txt合并成一个_Python实现将目录中TXT合并成一个大TXT文件的方法

    #coding=gbkimport osimport sysimport globdef dirTxtToLargeTxt(dir,outputFileName): '''从dir目录下读入所有的TX ...

  3. android调用so封装jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓对c进行so文件打包,并以jni的形式进行调用...

    AndroidJniDemo1 安卓对c进行so文件打包,并以jni的形式进行调用 项目中的部分 app : 编译so文件 jniDemo: 添加运行so文件 开发环境: android studio ...

  4. 【Android】利用爬虫将电影网站打包成一个APP

    以前总是通过HDMI线将电脑连接电视看剧看电影,但是每次想快进啊进行一些操作过于麻烦,手机上的APP的资源又太少,于是想到将电影网站打包成一个APP! APP已经差不多做好了,最近也比较忙,没什么时间 ...

  5. Mac打包Android的apk,[Mac][React Native][Android] 打包成apk

    一旦把app写好之后,最后一个步骤就是打包成apk啰 文档中会提到keytool,gradlew assembleRelease. Android打包APK Android 把包成一个APK主要需要几 ...

  6. Android—打包aar以及module依赖操作

    将项目打包为aar: 1.manifest文件:去掉红框内容 2.Module的build.gradle文件中加上    apply plugin: 'com.android.library' 3.打 ...

  7. android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

    需求 现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库. 方案 创建Andro ...

  8. Android 打包aar包含第三方aar 实践

    Android 打包aar包含第三方aar 因项目需要,打包aar包含第三方aar,如果直接对module进行打包会产生一些问题. * What went wrong: Direct local .a ...

  9. vs中将网站aspx.cs文件打包成一个dll

    vs中将网站aspx.cs文件打包成一个dll 23小时前 vs中将网站asp.net cs文件打包成一个dll. 在vs2008以上的版本中可以建立web应用来开发网站,这样网站aspx.cs文件[ ...

最新文章

  1. 基于数组的无锁队列(译)
  2. 微信从原版到现在所有界面图片_微信突然宣布:现在能改微信号了,所有人都能改...
  3. java for each 原理_Java for each实现机制代码原理解析
  4. linux命令--vi,vim
  5. 本机mysql无法进行碎片整理有什么用,试试mysql数据碎片整理吧解决astgo经常死机变慢的问题...
  6. ENVI实验教程(2)遥感图像预处理—辐射校正
  7. 百度音乐 android,百度音乐旧版本
  8. qlib里alpha158因子库的计算与缓存
  9. 怎样在vs2010中添加图片资源呢?
  10. uni-app中的生命周期钩子函数
  11. 服务器hz和显示器hz,揭秘精神论:玩电竞是否必须144Hz显示器
  12. 京东、快手及其他小公司Android面试(2020)
  13. Oracle导入dmp数据
  14. 5G套餐到底该不该换?看完你就明白啦!
  15. python控制微信屏蔽_Python之微信消息防撤回
  16. buuctf在线测评web Secret File
  17. 这样干前端你早该考虑离职了
  18. 远程视频监控组网方案:4G工业设备实现林区中心端汇聚!
  19. Quantifying Success in Science: An Overview2020翻译
  20. 使用Wireshark抓包工具抓取直播源

热门文章

  1. 致終將失去的手机形态
  2. uni showModeal
  3. Ansible自动部署(基础篇)
  4. 已解决:好用的集成PHP环境 一键安装包PHPNow--Win7下安装phpnow的方法出现[ Apache_pn ] 错误的解决 !(亲自测试通过)
  5. 高姿态下的面部表情识别系统
  6. Spring的maven项目单元测试报错 : Error:java:JDK isn't specified for module
  7. 数据分析之EXCEL常用函数总结
  8. Linux下对MySQL数据库的操作
  9. 【历史上的今天】11 月 2 日:蠕虫起源;iPad mini 上市;领英注册域名
  10. C#,电话数字键盘问题(Mobile Numeric Keypad problem)的算法与源代码