在『「Android Studio」如何导入 JAR 包』和『「Android Studio」如何导入 SO 库』之后,终于迎来了最重要的 AAR 包了。自从 Android 摆脱『Eclipse』步入『Android Studio』新纪元之后,ARR 包才是更加完美的第三方库方案。

为什么这么说?

「Android Studio」如何导入 JAR 包』一文中提到,JAR 的全称是 Java Archive,而 AAR 的全称则是 Android Archive,高下立判有没有?

AAR 是一个 Android 库项目的二进制归档文件,但文件本身是一个简单 ZIP 文件。

相比 JAR,AAR 包含了更多的资源,因为它是以『Android Studio』中的 Module 为基础建立的。通过解压 AAR,你可以看到有「AndroidManifest.xml」、「classes.jar」、「R.txt」等文件以及「res」等文件夹,同时它也能够包含 SO 库,这也就意味着 AAR 能够比 JAR 和 SO 提供更加强大的能力,比如 UI 库等,可以说是 Android 库的万金油封装方式。

既然如此,AAR 的导入方式就与 JAR 的导入有些许差异了。

首先,当然是要将 AAR 文件放到项目中,这里以开源库 Glide 为例,与 JAR 相似,都是放在 Module 的「libs」目录下。

将 aar 放置在 libs 目录

接着是添加依赖,同样也有很多种方式。

第一种,指定依赖。在 Module 的「build.gradle」文件中加入以下内容:

android {
    ...
    repositories {
        flatDir {
            dirs 'libs'     // 声明添加libs文件夹为库
        }
    }
}

dependencies {
    ...
    implementation(name: 'glide-4.12.0', ext: 'aar')       // 添加 aar_file_name.aar 文件为依赖
}

其中,implementationname 属性为该 ARR 的文件名。

需要注意的是,关于 repositories 的配置在网上很多文章都讲得不明不白,说在项目的「build.gradle」文件中做修改,这种博主大概率没有搞清楚『Android Studio』中 Project 和 Module 的概念就出来误人子弟,所以一定要记住是在 Module 的「build.gradle」文件中做修改,否则将会导致 ARR 不能正常使用。

第二种方法,也是指定依赖,和 JAR 类似,我们可以使用如下方式直接依赖 AAR:

dependencies {
    ...
    implementation files('libs/glide-4.12.0.aar')
}

第三种,全部依赖。也和 JAR 类似,同样是在 Module 的「build.gradle」文件中加入以下内容:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
    ...
}

可以看到这种方式更加简洁,直接扩充 dependencies 中的 fileTree 使其 include 原有的 JAR 文件并加入 AAR 文件。

第四种,作为 Module 导入,这种方法步骤稍复杂一些。

首先新建一个 Module:

New Module

选择「Import .JAR/.AAR Package」:

Select a Module Type

填入 AAR 文件路径:

Import Module from Library

完成后『Android Studio』会生成一个 Module 文件夹:

Library Module

最后,在需要引用的 Module 中将该 Module 导入:

dependencies {
    ...
    implementation project(':glide-4.12.0')
}

但使用该方法无法直接从调用处点击查看源码,个人感觉不太方便。

最后,还要介绍一种非常规的使用方式,这种方式在我做游戏渠道打包的时候也比较常用。

上文提到 AAR 在解压之后也有一个 JAR 文件,实际上 AAR 就是 JAR 加上其他资源的扩充。所以当我们拿到一个 AAR 包时,可以将其解压,然后使用『「Android Studio」如何导入 JAR 包』中的方法将 JAR 包导入,并将其他资源文件复制到 Module 中的各个对应的目录下即可,遵循无则复制有则追加的原则,如 AAR 中的「AndroidManifest.xml」中包含的声明,就要追加到 Module 的「AndroidManifest.xml」中去;如 AAR 中的 Layout 文件,一般直接复制到 Module 相同的文件夹。

这种方法其实在『Eclipse』上使用较多,因为『Eclipse』仅支持导入 JAR 而不支持 AAR,所以才会用到这种方式,这种方式是根据 Android 的打包合并原理得出的。

至于这几种方法的使用时机,可以参考之前的『Android Gradle Plugin 依赖项配置』一文,以及自己项目的实际情况,合理使用。