Android之Gradle<第三篇>:Gradle构建脚本基础
当新建一个Android Studio项目后,会自动生成一些Gradle配置文件,了解
Gradle构建脚本
是学习Gradle的必要知识之一。
[Settings 文件]
上图是Android工程的的目录结构,在根目录下有一个非常重要的文件settings.gradle
,这个文件称为设置文件
,设置文件大多数的作用都是为了配置子工程,也就是Module。
Android工程支持多Module,如果项目中存在app、app1、app2、app3、app4、app5这几个Module,那么需要在设置文件中配置这几个Module,配置方式可以是:
图片.png也可以这么配置
图片.png如果某个Module用不到,可以不要配置这个Module。
接下来,看一下以下项目结构
图片.png默认情况下,Module文件夹的位置都在项目的根目录,那么,有没有办法调整Module在项目中的路径呢?
答案是:有的
为了优化工程结构,我们会将一些业务层的Module单放入一个文件夹中,在项目的根目录下新建一个名称为business
的文件夹,将app1
、app2
、app3
、app4
、app5
放入到business
文件夹中,在设置文件中,重新执行Module的目录,配置代码如下:
include ':app'
include ':app1'
project(':app1').projectDir = new File(rootDir, 'business/app1')
include ':app2'
project(':app2').projectDir = new File(rootDir, 'business/app2')
include ':app3'
project(':app3').projectDir = new File(rootDir, 'business/app3')
include ':app4'
project(':app4').projectDir = new File(rootDir, 'business/app4')
include ':app5'
project(':app5').projectDir = new File(rootDir, 'business/app5')
当然,如果不指定Module的路径,那么默认就是根目录。
[Build文件]
我们都知道,使用工具创建一个Android工程,会默认构建一个项目,那么构建项目的入口在哪里呢?
在项目的根目录下找到文件build.gradle
,这个一个工程的Build文件
,这个文件是构建项目的起始点。
先来看一下Build文件的代码
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
buildscript:
主要功能是下载并引用一些插件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
dependencies代码块中主要放置一些项目必要的插件,当新建项目时,必然会默认加载一个gradle插件
classpath "com.android.tools.build:gradle:4.0.0"
当前gradle的插件版本是4.0.0。
当然,也可以自定义一个插件,将自定义的插件放入dependencies代码块中加载。
repositories代码块决定了插件下载的远程仓库,先从google仓库中下载,如果google仓库中找不到对应的插件,那么会在jcenter仓库中寻找对应的插件。
allprojects:
主要功能是下载所有Module下的依赖
allprojects {
repositories {
google()
jcenter()
}
}
allprojects对应着所有Module下的依赖,repositories代码块指定了那些依赖下载的地址。
这里,有一个闭包的概念,所有,如果在闭包上添加小括号是没有语法错误的,代码如下:
buildscript ({
repositories ({
google()
jcenter()
})
dependencies ({
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
})
})
allprojects ({
repositories ({
google()
jcenter()
})
})
构建一个Android工程,会执行大量的任务(task),出了一些自带的task之外,还以自定义协议task,可以将自定义task放在Build文件来执行,代码如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
//...
}
allprojects {
//...
}
task clean(type: Delete) {
delete rootProject.buildDir
}
task test1{
println 'test1'
}
task test2{
println 'test2'
}
task test3{
println 'test3'
}
task test4{
println 'test4'
}
task test5{
println 'test5'
}
[Projects和Tasks]
学习Gradle必须要理清楚Projects和tasks的概念,我们都知道,一个Android项目,由若干个Module组成,这些Module就是Projects,然而,每个Project的构建都是由多个Task来构建的,Task是一个命令,或者说是一个操作,由于一个Project是由多个Task来构建的,所以可以理解为多个Task就是一个Project
。
[创建一个新的任务]
方法一:
task test{
doLast {
println 'doLast'
}
doFirst {
println 'doFirst'
}
}
方法二:
tasks.create('test'){
doLast {
println 'doLast'
}
doFirst {
println 'doFirst'
}
}
补充:doFirst
优先被执行,doLast
最后被执行。
[任务依赖]
task test1{
println 'test1'
}
task test2(dependsOn: test1){
println 'test2'
}
以上代码的意思是:test2依赖于test1,所以在执行test2之前必然会执行test1。
[自定义属性]
定义一个属性:
ext.aa = 1
定义多个属性:
ext{
age = 18
name = 'zhangsan'
}
还可以使用sourceSets定义属性,代码如下:
sourceSets {
main{
resourcesDir = 'main/res'
}
test{
resourcesDir = 'test/res'
}
}
task testC{
sourceSets.each {
println "${it.name}的resourcesDir是:${it.resourcesDir}"
}
}
[脚本即代码,代码也是脚本]
在Build文件中可以使用Groovy语言,比如使用Groovy语言定义一个方法,代码如下:
def function() {
def sum = 1+2
println sum
}
task testD{
function()
}
[本章完...]