theme: condensed-night-purple
Gradle是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java有Java插件,编译Groovy有Groovy插件,编译Android APP有Android APP插件,编译Android Library有Android Library插件。Gradle中每一个待编译的工程都是一个Project,一个具体的编译过程是由一个一个的Task来定义和执行的。一个Project到底包含多少个Task,其实是由编译脚本指定的插件决定。插件是什么呢?插件就是用来定义Task,并具体执行这些Task的东西
项目结构
gradle项目目录结构:
除了build.gradle(构建的说明书)其他的文件是gradlewrapper相关的
Gradle的生命周期
gradlelifecycle:
- initialization:执行两个脚本init.gradle , settting.gradle; init用于创建全局的Gradle对象 判断是单项目构建还是多项目构建;Setting用于决定哪些项目参与到构建中,为每个项目创建一个Project init.gradle是当前机器所有Grdale所有项目公用的,配置全局的init.gradle文件需要放在GRADLE_USER_HOME指代的gradle文件夹的init.d下面。 init.d中的init.gradle有initscript 脚本块,和普通gradle不一样的是执行脚本会先调用initscript 方法,可在此处添加三方依赖。 跟项目只有.gradle有意义,每个Gradle项目都必须有一个.gradle构建脚本,在之后的配置阶段会根据这个构建脚本的内容去创建对应的Projcet对象
- Configuration配置阶段:执行build.gradle文件【创建task,执行task的闭包去配置这个task的Action】,对上一步生成的project进行设置(有哪些任务,任务之间的依赖,应用了哪些插件等)
Action其实就是doLast,doFirst这些。配置阶段去配置这个task的Action及各个task之间的依赖关系,对Projcet添加Task,等到执行阶段的时候在执行Task里面的Action
- Execution:执行阶段,针对project 真正的运行task,根据配置阶段生成的task依赖和添加任务列表进行执行
gradle执行的最小单元是task任务,任何无主函数都可以在Project中找到
Task创建示例
代码语言:javascript复制//使用闭包去填充这个task1任务,添加内部的Action到任务的执行列表中,
//配置阶段确定task包含哪些Action及Tasl的依赖关系
task("task1"){
print('Config')
doLast{
//把当前闭包添加到这个任务执行列表的最后,并不执行这个任务
//task每次执行都需要经历三个阶段。因此执行其他task的时候不会执行这个doLast里
print('Executing')
}
}
比如denpendes依赖其他task,在执行这个task之前会先执行依赖的task。
特殊的钩子函数
钩子函数并不会像普通task一样按照从上到下的顺序执行,他的执行依赖于特定的方法,比如afterEveluatetask,这个task的执行时机是在配置完成阶段将build.gradle都执行完的时候去执行的(当然也会执行普通task闭包用于确定配置这个task)。
在配置阶段碰到这类task的时候会把它们添加到一个待执行的列表中,等待合适时机在调用。
调用完钩子函数之后就进入到了Eveluate阶段,这个阶段会去执行gradlew指定的task任务,也就是执行配置阶段已经配置了这个task的任务列表
Task的type属性
type属性用于创建指定task,从而可以使用这个Task内的方法。
比如copy这个系统的task,我们创建的task的type属性指定了copy,那么在我们创建的task闭包中就可以使用一系列copytask的方法
比如: //数据源目录,多个目录 public AbstractCopyTask from(Object... sourcePaths)/ //目标目录,单一 public AbstractCopyTask into(Object destDir) //过滤文件 包含 public AbstractCopyTask include(String... includes) //过滤文件 排除 public AbstractCopyTask exclude(String... excludes) //重新命名,老名字 新名字
复制图片:多个数据源 -->
public AbstractCopyTask rename(String sourceRegEx, String replaceWith) task copyImage(type: Copy) { from 'C:Usersyiba_zyjDesktopgradlecopy' , 'C:Usersyiba_zyjDesktopgradlecopy' into 'C:Usersyiba_zyjDesktop' }
复制文件:过滤文件,重命名 -->
task copyImage(type: Copy) { from 'C:Usersyiba_zyjDesktopgradlecopy' into 'C:Usersyiba_zyjDesktop' include "*.jpg" exclude "image1.jpg" rename("image2.jpg","123.jpg") }