1.定义
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置[DSL 全称是Domain Specific Language,即“特定领域的语言”,其实就是这个语言不通用,只能用于特定的某个领域,俗称“小语言”],支持maven, Ivy仓库,支持传递性依赖管理,抛弃了基于XML的各种繁琐配置。
面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。
2.与Ant和Maven的区别
Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具。
Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。
Ant:编写容易,但功能有限,需要人工操作的过程也多;
Maven:依托于庞大的依赖仓库,因此有着强大的外部依赖管理,但添加本地依赖并不方便,且项目不能灵活修改。
Gradle:能很好地结合Ant与Maven各自的优点,可以随意的编写任务并组合成项目,直接利用Maven仓库,并且能很好的支持传递依赖和内部依赖。(本部分为个人主观意见,可能与大多数人的意见并不相同)
Gradle通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对项目进行构建(复杂的项目也有其他文件)
Gradle 脚本本质上就是Groovy脚本,只不过高度利用了groovy的语法糖,例如省略方法参数括号和省略句尾分号等,让代码看起来像DSL。
所以几乎所有java和groovy支持的语法,它的脚本都支持。(使用JAVA和GROOVY的SDK应该也是没问题的)
Gradle支持基于惯例的构建,并有丰富的适合不同情景下的插件库,光有官方用户手册支持的就有20多种,方便构建。
3.Gradle里有两个基本概念:项目(projects)和任务(tasks)
1.项目(projects):
项目由多个任务组成,一个项目可以理解为提供给不同设备的构建版本,如桌面版、网页版、安卓版、iOS版等等,也可以理解为一种行为,例如部署应用到生产环境。
2.任务(tasks):
任务相当于Ant的target,可以理解成一个构建中原子性的工作,例如编译、打包、执行等。需要注意的是,Ant中他自己的命令例如javac、copy等也叫做task,但Ant的task远没有Gradle的task那么自由。
每个项目的编译至少有一个 Project,一个 build.gradle就代表一个project,每个project里面包含了多个task,task 里面又包含很多action,action是一个代码块,里面包含了需要被执行的代码。
Gradle 的编译周期
在编译过程中, Gradle 会根据 build 相关文件,聚合所有的project和task,执行task 中的 action。因为 build.gradle文件中的task非常多,先执行哪个后执行那个需要一种逻辑来保证。这种逻辑就是依赖逻辑,几乎所有的Task 都需要依赖其他 task 来执行,没有被依赖的task 会首先被执行。所以到最后所有的 Task 会构成一个 有向无环图(DAG Directed Acyclic Graph)的数据结构。编译过程分为三个阶段:
- 初始化阶段:创建 Project 对象,如果有多个build.gradle,也会创建多个project.
- 配置阶段:在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为后一个阶段做准备。
- 执行阶段:在这个阶段,gradle 会根据传入的参数决定如何执行这些task,真正action的执行代码就在这里.
Gradle 项目文件说明:
1. 项目的配置文件build.gradle配置文件:
文件的配置最终会被应用到所有项目中。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {//定义了 Android 编译工具的类路径。
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects { //中定义的属性会被应用到所有 module 中,但是为了保证每个项目的独立性,我们一般不会在这里面操作太多共有的东西。
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2. settings.gradle配置文件:
定义了哪些module 应该被加入到编译过程,对于单个module 的项目可以不用需要这个文件,但是对于 multimodule 的项目我们就需要这个文件,否则gradle 不知道要加载哪些项目。这个文件的代码在初始化阶段就会被执行。
include ':app'
3. Module app的build.gradle配置文件:
apply plugin: 'com.android.application' //应用了Android 程序的gradle插件,作为Android 的应用程序,这一步是必须的,因为plugin中提供了Android 编译、测试、打包等等的所有task。
android {//这是编译文件中最大的代码块,关于android 的所有特殊配置都在这里,这就是又我们前面的声明的 plugin 提供的。
compileSdkVersion 25
buildToolsVersion "27.0.1"
//就是程序的默认配置,注意,如果在AndroidMainfest.xml里面定义了与这里相同的属性,会以这里的为主。
defaultConfig {
applicationId "com.example.libra.myapplication" //包名,作为程序的唯一识别ID,防止在同一手机装两个一样的程序;以前在manifest中还会作为我们R资源类的包名,现在不在作为R文件的包名了。
minSdkVersion 15 //支持最小的android系统版本
targetSdkVersion 25 //这是该应用针对的目标SDK版本
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {//定义了编译类型,针对每个类型我们可以有不同的编译配置,不同的编译配置对应的有不同的编译命令。默认的有debug、release 的类型。
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {//是属于gradle 的依赖配置。它定义了当前项目需要依赖的其他库。
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.squareup.okhttp3:okhttp:3.3.0'
compile 'com.squareup.okio:okio:1.8.0'
testCompile 'junit:junit:4.12'
}
repositories{
mavenCentral()
}

4.Gradle的构建:
Gradle的构建分两个阶段
第一阶段是设置阶段(configuration phase),分析构建脚本,处理依赖关系和执行顺序等,脚本本身也需要依赖来完成自身的分析。
第二阶段是执行阶段(execution phase),此阶段真正构建项目并执行项目下的各个任务。
5.为甚要学习Gradle
Gradle是目前Android主流的构建工具,不管你是通过命令行还是通过AndroidStudio来build,最终都是通过Gradle来实现的。所以学习Gradle非常重要。
目前国内对Android领域的探索已经越来越深,不少技术领域如插件化、热修复、构建系统等都对Gradle有迫切的需求,不懂Gradle将无法完成上述事情。所以Gradle必须要学习。
网友评论