Gradle作为一个构建工具,除了插件给我们带来的task,我们也可以自定义很多变量,task,或者继承某些task来重新指定输入输出文件等。首先我们要明确一下Gradle的周期,简单来说,一个Gradle任务执行的时候会有三个步骤。
- Gradle会分析构建脚本,通过setting.gradle配置的项目对应生成settings与project类的实例。
- 初始化配置,通过执行各个项目build.gradle脚本,配置project对象的属性, 此阶段也会去创建、配置task及相关信息。
- 执行具体的任务,通过任务之间的依赖关系来进行一系列的任务执行。
明确了这些之后我们就了解一下task的相关使用吧。这里我们新建一个Android项目,包含一个app和一个library。
settings.gradle
include ':app', ':mylibrary'
那么我们这个项目就有了三个project实例,rootProject,app,mylibrary
配置变量
1.在gradle文件中直接定义变量
我们在app的build.gradle中末尾直接定义。
def para='123'
println para
然后我们执行
就可以看到对应的输出
15:22:36: Executing task 'assembleDebug'...
Executing tasks: [assembleDebug]
Configuration on demand is an incubating feature.
G:\program\Android\sdk\platform-tools\adb.exe
123
:app:preBuild UP-TO-DATE
:mylibrary:preBuild UP-TO-DATE
:mylibrary:preDebugBuild UP-TO-DATE
:mylibrary:checkDebugManifest UP-TO-DATE
:mylibrary:processDebugManifest UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:mylibrary:compileDebugAidl UP-TO-DATE
.....
很明显我们可以看到输出是在任务执行之前的。这就表示配置阶段就已经执行了代码。这样定义的变量只在该文件内可见
2.使用ext定义变量
同样在app的build.gradle中定义如下,同样通过gradle的窗口执行assembleDebug任务,后面如果不变就不赘述了。
ext{
para1 ="456"
}
assert project.ext.para1=='456'
assert ext.para1=='456'
这样定义的变量可以在其他module中获取,但是必须要定义之后才行,比如这里定义在app里的,可以在mylibrary中获取,因为app的build.gralde是先执行的。
我们可以在mylibrarya中的build.gradle中获