Android Gradle 学习笔记(四):Gradle 构建脚本

本节咱们从总体的角度来介绍一下Gradle。android

1、setting.gradle

在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置。设置文件的默认的名字就是setting.gradle,此文件位于根工程目录下。编程

setting.gradle 的做用就是为了配置子工程。在Gradle中,多工程是经过工程树表示的,至关于咱们在Android Studio下面看到的Project和Module概念同样。根工程至关于Android Studio的Project,一个根工程能够有多个子工程,也就是不少的Module,这样就和Android Studio定义的Module概念对应上了。闭包

一个子工程(Module)只有在Setting文件里配置了Gradle才会识别,才会在构建的时候被包含进去。函数

2、build.gradle

每一个Project都会有一个build.gradle文件,该文件是该Project构建的入口,能够在这里针对该Project进行配置,好比配置版本,须要哪些插件,依赖哪些库等等。学习

既然每一个Project都会有一个build.gradle,那么Root Project能够获取到全部的Child Project,因此在Root Project的Build文件里面,咱们能够对Child Project进行统一的配置,好比应用的插件,依赖的Maven中心库等等。gradle

例如,咱们常常能在Root目录下的build.gradle文件中看到以下配置:ui

...
allprojects {
    repositories {
        google()
        jcenter()
        
    }
}
...

这样配置会很是方便,省去了咱们对每一个Project都去配置的状况,特别是对于要管理不少的Project的大工程来讲。google

3、Project 及 Tasks 介绍

在Gradle中,能够有不少Project,你能够定义建立一个Project用于生成一个jar,也能够定义一个另一个Project用于生成一个war包,还能够定义一个Project用于发布上传你的war等等。其实在Gradle里面,你能够将Poject理解为在你的业务范围内,抽象出来的一个个独立的模块,你能够根据项目的状况抽象归类,最后这一个个的Project组成了你的整个Gradle构建。从咱们编程的角度来说,它们就是一个个独立的模块。好好利用他们,这样你的代码就可以作到低耦合,高内聚。spa

一个Project里面由包含多个Task,也就是每一个Project是由多个Task组成的。那么什么是Task呢?这里咱们能够去一个项目的RootProject里面的build.gradle查看,最多见的task以下:插件

task clean(type: Delete) {
    delete rootProject.buildDir
} 

具体的含义相信你们都能理解,这里就不过多赘述了。

Task 是一个操做,一个原子性的操做,好比打个jar包,复制一份文件,编译一次Java代码,上传一个jar到Maven中心库等,这就是一个Task。

4、Task 详解

1. 建立一个任务(Task)

建立一个任务很简单,前面不少例子咱们也都有演示:

task customTask1 {
    doLast {
       println 'customTask1:doLast'
    }

    doFirst {
        println 'customTask1:doFirst'
    }
}

输出结果以下:

> Task :customTask1
customTask1:doFirst
customTask1:doLast

这里的Task看着像一个关键字,其实它是Project对象的一个函数,原型为create(String name,Closure configureClosure)。customTask1为任务的名字,咱们能够自定义,第二个参数是一个闭包,也就是咱们花括号里面的代码块。

若是了解Groovy的相关知识,咱们能够知道,若是最后一个参数是闭包的时候,能够放到括号外面,而后方法的括号能够省略,就生成了上面咱们的写法,很简洁。该闭包的做用就是用来对咱们建立的任务进行配置,例子中咱们用了任务的doFirst和doLast方法,分别在任务执行先后输出一段文字。上面的任务咱们还能够改成以下的方式来定义,做用是同样的:

tasks.create("customTask1")  {
    doLast {
        println 'customTask1:doLast'
    }

    doFirst {
        println 'customTask1:doFirst'
    }
}

除此以外,Task还有其余方法和属性可使用,须要咱们参考Gradle Task的API进一步学习。

2. 任务依赖

Task之间是能够有依赖关系的,这样咱们就能够控制哪些任务先于哪些任务执行;哪些任务执行后,其余任务才能执行。好比,咱们运行jar任务以前,compile任务必定要执行过,也就是jar依赖compile。Android 的install任务必定要依赖package任务进行打包生成APK,才能安装进设备里面。

下面咱们来举一个很是简单的例子,说明一下:

task outHello {
    println 'hello'
}

task outMain(dependsOn: outHello) {
    doLast {
        println 'main'
    }

输出以下:

renhui:android-gradle-book-code renhui$ gradle outMain

> Configure project :
hello

> Task :outMain
main

从例子中,咱们能够看出,在建立任务的时候,经过dependsOn能够指定其依赖的任务。

5、自定义属性

Project 和 Task 都容许用户添加额外的自定义属性,要添加额外的自定义属性,可使用应用所属的对应的ext便可实现。添加以后能够经过ext属性对自定义属性读取和设置,若是要同时添加多个自定义属性,能够经过ext代码块:

ext.age = 18

ext {
    phone = 123455
    address = '保定'
}

task outMain() {
    println "年龄是:${age}"
    println "电话是:${phone}"
    println "年龄是:${address}"
}

输出结果为:

> Configure project :
年龄是:18
电话是:123455
年龄是:保定

相比局部变量,自定义属性有更加普遍的做用域,你能够跨Project,跨Task访问这些自定义属性。只要你能访问这些属性所属的对象,你就能访问到这些属性。

自定义属性不只仅局限在Task和Project上,你能够应用在SourceSet中,这样等于每种SourceSet多了一个可供配置的属性。而咱们在Android开发中,就常常会用到main SourceSet,当使用productFlavors定义多个渠道的时候,还会新增其余不少的sourceSet。这块的相关内容,能够在之后的开发过程当中多留意和学习使用。

相关文章
相关标签/搜索