这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
前言
在开发中我们接触的较多的是build.gradle和settings.gradle,我们知道新的moduler要配置在setting.gradle中,新的依赖库,包括项目的版本等要配置在app目录下build.gradle,远程仓库以及插件地址要配置在根目录的build.gradle。知道这些足够配置一个基本项目了,但是我们常有下面几个疑问:
- Gradle是什么? AndroidStudio中的AndroidGradlePlugin又是什么?
- 还有gradlew.bat是干嘛的,gradle在AndroidStudio中如何工作的?
第一个问题,我们需要了解关于gradle的三点:
- 构建工具包括 make,Ant,Maven,Lvy和现在的Gradle,差不多是一步步进化而来,前面几种都是基于XML,不擅长if这类逻辑判断,而Gradle基于Groovy有自己的语法。
- Gradle与Android本身没有任何关系,Gradle主要用于Java项目,不过还支持Android,C,C++。Gradle官方文档:docs.gradle.org/current/rel…
- Google选用Gradle作为AS的构建工具,集成了一套插件叫Android Gradle Plugin,Gradle Plugin官方文档:tools.android.com/tech-docs/n…
第二个问题,在此新建项目一探究竟
Android Studio中Gradle结构
在Android Studio新建项目,AS会自动下载安装Gradle并且生成下面这样的项目结构:
先看2号和4号,这里有个gradle wrapper的东西意为gralde包装,是Android studio特有的,因为我们在本地的项目可能用了不同的Gradle版本(比如项目A用Gradle5.0,项目B用Gradle6.0),那么我们只安装Gradle5.0或者Gradle6.0都是不行的,于是gradle wrapper可以来解决这个问题,不同的项目允许配置不同的Gradle版本,但是每个版本AS都会帮我们下载到本地,看下:
所以相当于在Android studio所有操作就是基于GradleWrapper,打开AS自带的Terminal查看当前项目的Gradle版本 gradlew -v
Gradle的工作流程
在上面1,3,5号对应三个.gradle文件,在每个gradle开始处都加上Log打印,运行项目,看下这三处.gradle文件的执行顺序:
- 先进入Settings.gradle初始化,弄清整个项目有多少project,可以在这对gradle添加额外属性,那么在buiuld.gradle中就能拿到。
- 进入跟目录的build.gradle,内容主要包含了两个方面:一个是声明仓库的源,这里可以看到是指明的jcenter(), 之前版本则是mavenCentral(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。另一个是声明了android gradle plugin的版本。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
- 进入app的build.gradle,这个gradle分为application 和library两个类型,区分是依据第一句的apply配置:
apply plugin: 'com.android.application'
//apply plugin: 'com.android.library'
- 注释:apply是Project类下的一个方法,接受Map类型参数,key是"plugin"代表类型,value是"com.android.application",代表android gradle插件版本就是上面配置的 classpath 'com.android.tools.build:gradle:3.2.0'
PluginAware.apply(java.util.Map)