今天遇到一个需求,需要把项目中的诸多的so封装成一个aar,直接使用这个aar进行调用,因为诸多的so看起来太多了,不太好管理,封装成一个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的使用方法,包括直接引入aar和放置在libs目录下的两种方式。在打包过程中,需新建一个library module,将so库及相应配置迁移过去,然后通过Gradle assemble生成aar。在使用aar时,可能遇到的导入问题及解决办法也进行了说明。
4768





