上周部门知识分享会上分享了关于如何在Android开发中使用gradle的话题,其中涉及到了
aar
文件的使用,经过一番讨论引申出了更多有趣的问题,留下了很多迷惑之处,经过研究后决定将成果记录于此。
概述
aar
是什么?
aar
是Android Archive
的缩写,而我们熟悉的jar
则是Java Archive
的缩写.说白了`aar
就是一种类似于Jar
的打包格式。
aar
与jar
有什么异同?
aar
与jar
非常类似,基本上都可以理解为一个压缩文件( zip-file )。jar
中包含了编译后的class
文件以及一些包含元数据的文本文件。而aar
比jar
多了些Android
特有的一些文件,例如layout
文件,drawable
文件以及manifest
文件。说白了,一个aar
在Android
中就是一个完整的Module
.
Jar
是被广大java世界的成员所熟知的,但是Aar
除了Android Studio
认识它,其他人根本不屌它,因为压根不认识这货。
如何生成AAR文件
在Android Studio
中添加一个Android Library,然后在此库中开发你所要实现的功能,单独编译此库后,在其outputs
目录下就会生成相应的aar
文件。如下图所示
如何使用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
文件我们应该了解的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14794.html