Android Studio 打包及引用 aar

Android Studio 打包及引用 aar


1、 简述

在比较大的 Android 项目的开发中,我们经常会遇到工程、jar 包等等之间相互引用的方式。一般我们通过在 gradle 文件中配置依赖来解决,比如:

通用配置vcq9yOfPwjwvc3Ryb25nPqO6PC9wPg0KPGNvZGU+Y29tcGlsZSBmaWxlVHJlZShkaXI6ICYjMzk7eHh4JiMzOTssIGluY2x1ZGU6IFsmIzM5OyouamFyJiMzOTssICZxdW90OyoueHh4JnF1b3Q7XSk8L2NvZGU+o7q9q8SzuPbEv8K8z8LL+dPQt/u6z8Cp1bnD+7XEzsS8/tf3zqrSwMC1o7sgPGNvZGU+Y29tcGlsZSAmIzM5O2NvbS54eC54eDpQcm9qZWN0TmFtZTpWZXJzaW9uJiMzOTujusXk1sM8L2NvZGU+TWF2ZW5gIL/i1/fOqtLAwLWju9TaIE1hdmVuIL/i1tDQxCC/ydLUy9HL99fUvLrP69PDtcS/4r340NDSwMC1o7sgPGNvZGU+Y29tcGlsZSBwcm9qZWN0KCYjMzk7OkFub3RoZXJNb2R1bGUmIzM5Oyk8L2NvZGU+o7rF5NbDwe3Su7j2IE1vZHVsZSDX986qsb4gTW9kdWxlILXE0sDAtaOssbvSwMC1tcQgTW9kdWxlILHY0Ouxu7W8yOu1vbWxx7C5pLPM1tCjuyA8Y29kZT5jb21waWxlIGZpbGVzKCYjMzk7eHh4LmphciYjMzk7KTwvY29kZT6jusXk1sPEs7j2IGphciCw/Nf3zqrSwMC1oaMNCjxwPr+0xvDAtLK7tO2jrLv5sb7NqNPDtcTF5NbDtrzS0b6ttObU2sHLoaPSu7DjttTT2tbQtcjQodDNtcS5pLPMo6zV4tbWv6q3ore9yr3N6sirw7vT0M7KzOKho7WrysfT0MqxuvIgQSC6zSBCIMG9uPa5pLPMo6zP682syrHS/dPDwe3Su7j2uau5srXEIE1vZHVsZSBDo6y2+NXiuPYgTW9kdWxlIL/JxNzKx9K7uPaxyL3PuLTU07XEIEFuZHJvaWQgTW9kdWxlo6y/ycTcsPy6rMHL0rvQqdb3zOKholVJIKGi18rUtM7EvP61yLXIo6zV4sqxuvKjrMjnufvTwyBNb2R1bGUg0sDAtbXEt73KvcC0xeTWw6OssrvD4tPQ0KnAp8TRo6zS8s6qIEEgus0gQiC2vNKqtbzI6yBDo6y2+MfS0qrL5sqxudjXoiBDILXEuPy4xKGjPC9wPg0KPHA+usPU2iBBbmRyb2lkIFN0dWRpbyDM4bmpwcsgPGNvZGU+YWFyPC9jb2RlPiC/4rXEtPKw/Le9yr2jrM7Sw8e/ydLUsNEgQyDX986qIDxjb2RlPmxpYnJhcnk8L2NvZGU+IL340NC08rD8o6zK5LP2IGFhciDOxLz+o6zIu7rz1NogQSC6zSBCINbQo6zF5NbDIGFhciC/4tLAwLWjrL7Nv8nS1L3ivvahozwvcD4NCjxoMiBpZD0="2aar-文件简介">2、aar 文件简介

要输出 aar 文件,必须将 Module 配置为 library,在 gradle 文件中如下:

输出 aar :  apply plugin: 'com.android.library' ; 输出 apk : apply plugin: 'com.android.application'

将 Module 配置为 library 后,构建输出一个 aar 文件,根据渠道和 BuildType 的不同,在相应的目录下可以找到。比如对 BuildType 为 debug 的配置,输出为:[ModuleName]/build/outputs/aar/[ModuleName]-debug.aar。一份 aar 文件其实就是一份 zip 包,和 jar 不同的是,它将一些资源文件、第三方库文件、so 文件等等都打包在内,而代码文件编译后压缩在在 classes.jar 中。比如:

Android Studio 打包及引用 aar_第1张图片

3、导入 aar 的方式引用

这种方式比较简单,打开 Project Structure,添加一个新 Module,然后选择 Import *.JAR or *.AAR Package 的方式导入:

Android Studio 打包及引用 aar_第2张图片

导入后,在你的工程下面,会生成一个文件夹,里面是 aar 文件以及 Android Studio 的配置文件。

Android Studio 打包及引用 aar_第3张图片

接着可以在 gradle 中配置依赖了,其他 Module 可以引用这个 Module 了,依赖方式使用compile project 的方式即可。

缺点:被依赖的 aar 无法 F3 跟进去,无法看到资源文件内容以及目录层级等等缺陷。

4、使用配置依赖的方式引用

gradle 其实还有另一种依赖可以引用 aar:

compile(name: 'xxx', ext: 'aar')

首先需要将 aar 文件放入引用 Module 的 libs 目录下,和一般的 jar 文件类似。然后在 gradle 配置文件中把 libs 目录加入依赖:

?
1
2
3
4
5
class = "hljs bash" >repositories {
     flatDir {
         dirs 'libs'
     }
}

接着在 gradle 的依赖配置中加入 compile(name: 'xxx', ext: 'aar') 这一句,依赖即可关联完毕。构建一下工程,在 Module 的 build/intermediates/exploded-aar 目录下,可以看到有一些临时文件生成:

Android Studio 打包及引用 aar_第4张图片

看起来完全是引用 aar 的解压版本。Android Studio 安装反编译插件后,可以通过 F3 跟进到 class 文件里面,如果你有被依赖 Module 的源代码的话,还可以 Attach Source 关联源代码查看。另外,可以很方便的查看 aar 中的资源文件。

另外,这种依赖方式更新 aar 后,生成的临时文件也会随之变动,不用担心改动不同步的问题。

5、总结

综上,介绍了 aar 文件的生成方式,以及两种 aar 依赖的方式,经过实战检验,第二种通过配置 gradle 依赖的方式简单易用,只需一行代码即可搞定。


随着项目越来越多,代码的复用就变得异常重要,这时候就要进行模块化编程,就是把一些通用的组件或者类库做成单独的模块,其他项目直接进行引用就好。针对Android开发最常见的就是Android Library,在Gradle出现之前引用Android Library的方式也很繁琐,但是有了Gradle一切变得非常简单方便。

aar

何为aar?大家都知道jar文件把,如果你有一个Android Library项目,可以很容易的导出jar文件,然后在其他项目中很方便的引用,aar和jar类似,区别就是一个Android Library项目导出的jar文件不能包含资源文件,比如一些drawable文件、xml资源文件之类的,所以这就有很大的限制,在gradle之前我们要引用带资源文件的Android Library必须要把整个library导入进来进行引用,但是有了gradle之后,Android Library项目可以直接导出成aar,然后其他项目像引用jar的方式直接方便的引用。

导出aar

首先Android Library项目的gradle脚本只需要在开头声明

apply plugin: 'com.android.library'

之后就和导出apk文件一样的方法,执行 ./gradlew assembleRelease,然后就可以在 build/outputs/aar 文件夹里生成aar文件

引用本地的aar

生成aar之后下一步就是如何引用本地的aar文件?本地的aar文件并没有像引用jar文件这么简单,官方也没有提供解决方案。好在国外的一些前辈总结出了方法,下面就以test.aar文件为例来详述下方法

1、把aar文件放在一个文件目录内,比如就放在libs目录内

2、在app的build.gradle文件添加如下内容

repositories {
    flatDir {
        dirs 'libs' //this way we can find the .aar file in libs folder
    }
}

3、之后在其他项目中添加一句gradle依赖便方便的引用了该library

dependencies {
    compile(name:'test', ext:'aar')
}

以上方法亲测有效。

总结

当然通过gradle最普遍的方法是把aar上传到mavenCentral或者jcenter,引用的话更方便,但是对于一些公司内部library不想公开,而传统的引用library方式又太繁琐,引用本地的aar文件这种方式会非常方便合适,之后通用的模块只需要做成library,不管更新还是修改只需要打包成aar,然后供其他项目使用就好了,对Android开发来说这是提升代码复用非常有效的一个手段。


你可能感兴趣的:(Android基础篇)