上周部门知识分享会上分享了关于如何在Android开发中使用gradle的话题,其中涉及到了aar文件的使用,经过一番讨论引申出了更多有趣的问题,留下了很多迷惑之处,经过研究后决定将成果记录于此。

概述

aar是什么?

aarAndroid Archive的缩写,而我们熟悉的jar则是Java Archive的缩写.说白了`aar就是一种类似于Jar的打包格式。

aarjar有什么异同?

aarjar非常类似,基本上都可以理解为一个压缩文件( zip-file )。jar中包含了编译后的class文件以及一些包含元数据的文本文件。而aarjar多了些Android特有的一些文件,例如layout文件,drawable文件以及manifest文件。说白了,一个aarAndroid中就是一个完整的Module.

Jar是被广大java世界的成员所熟知的,但是Aar除了Android Studio认识它,其他人根本不屌它,因为压根不认识这货。

如何生成AAR文件

Android Studio中添加一个Android Library,然后在此库中开发你所要实现的功能,单独编译此库后,在其outputs目录下就会生成相应的aar文件。如下图所示
arr目录

如何使用AAR文件

Android Studio中使用aar文件有两种方法:

第一种方法:

1.打开菜单:File->New->New Module …后进入Module选择弹窗,选择导入.JAR/.AAR的选项

这里写图片描述
2.这样aar文件就会出现在你项目的层级下面,好像一个Module一样。

3.这样导入的aar文件,系统已经在settings.gradle中帮你配置好了

include ':app', ':calculatelib-debug'

你只需要在**app**Module中的gradle文件中配置依赖即可。

dependencies {
    ...
    implementation project(path: ':calculatelib-debug')
}

第二种方法:

这种方法是我们比较常用的,网上也多是这种方法的介绍,这部分有趣的事情很多,带出来的知识点也比较多,我们先讲如何正确的使用,然后做一些有趣的探讨。

1.在libs文件夹里建立一个新的文件夹aars(至于为什么要新建一个文件夹后面再说),将要使用的aar文件放到aars文件夹中。

2.在app模块下的build.gradle文件中加入如下代码

repositories {
    flatDir {
        dirs 'libs/aars'
    }
}

此代码段与dependencies块相同级别

3.在dependencies下加入依赖

dependencies {
    ...

    compile(name:'calculatelib-debug', ext:'aar')
}

通过以上3步就可以使用aar文件了。

代码分析

疑问1:
下面这段代码什么意思,不加的话可以通过编译吗?

repositories {
    flatDir {
        dirs 'libs/aars'
    }
}

首先不加肯定是不行,但是加了表示什么意思呢?这还的从gradle处理依赖的原理说起,一般情况下我们我们用的最多的就是远程代码仓库。尤其以Maven仓库最多,为此,Gradle还为其提供了别名。

  • mavenCentral()别名,表示依赖是从Central Maven 2 仓库中获取的。
  • jcenter()别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。
  • mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。

除了Maven仓库以外还有其他仓库,例如我们这里使用到的Flat Directory仓库,上边那段代码就是在app这个Module下构建了Flat Directory仓库,那么gradle系统就会在我们指定的目录下搜索依赖,那样就找到了我们的aar文件。

疑问2:
我们可以把下面这段构建Flat Directory仓库的代码

flatDir {
    dirs 'libs/aars'
}

可以放在工程下面的那个build.gradle里面的buildscript模块下面吗?例如下面这样

buildscript {
    ext.kotlin_version = '1.2.30'
    repositories {
        google()
        jcenter()

        flatDir {
             dirs 'libs/aars'
        }

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

点击同步gradle后发现不行

疑问3:那么可以放在工程下面的那个build.gradle里面的allprojects模块下面吗?例如下面这样

allprojects {
    repositories {
        google()
        jcenter()

        flatDir {
            dirs 'libs/aars'

    }
}

发现可以正常工作,那么发生了什么?

要想明白这个问题需要先搞清楚这两个模块里面的配置分别是干什么的,有什么不同。

buildscript里面的配置是在配置gradle自己,例如决定gradle如何来执行编译。所以你会看到Android Gradle 插件,以及Kotlin插件都在这里面引用的。

allprojects是配置那些要被gradle编译的Module的。

通常情况下,这两部分的repositories里面的配置是一样的,那是因为两者都需要从相同的远程仓库,例如Jcenter里面获得依赖。但是dependencies部分的配置就完全不一样了。通常情况下allprojects里面的dependencies部分是空的,那是因为每个模块的依赖项都不一样,都配置到了各自模块下面的gradle文件中了。如果一个工程中的所以模块都依赖同一个库的话,就可以将其配置在这里了。

以上就是关于AAR文件我们应该了解的。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐