本节我们从整体的角度来介绍一下Gradle。

一、setting.gradle

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

setting.gradle 的作用就是为了配置子工程。在Gradle中,多工程是通过工程树表示的,相当于我们在Android Studio下面看到的Project和Module概念一样。根工程相当于Android Studio的Project,一个根工程可以有多个子工程,也就是很多的Module,这样就和Android Studio定义的Module概念对应上了。

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

二、build.gradle

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

既然每个Project都会有一个build.gradle,那么Root Project可以获取到所有的Child Project,所以在Root Project的Build文件里面,我们可以对Child Project进行统一的配置,比如应用的插件,依赖的Maven中心库等等。

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

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

这样配置会非常方便,省去了我们对每个Project都去配置的情况,特别是对于要管理很多的Project的大工程来说。

三、Project 及 Tasks 介绍

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

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

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

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

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

四、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可以指定其依赖的任务。

五、自定义属性

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。这块的相关内容,可以在以后的开发过程中多留意和学习使用。

Android Gradle 学习笔记(四):Gradle 构建脚本的更多相关文章

  1. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  2. Android Studio 学习笔记(四):Adapter和RecyclerView说明

    在现版本中,滚动控件有多种,而相比于ListView,GridView,RecyclerView的用途更广,因此将前两者作为Adapter适配器的引入,再对RecyclerView进行简单讲解. MV ...

  3. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  4. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

  5. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

  6. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)———探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  7. Android:日常学习笔记(2)——分析第一个Android应用程序

    Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...

  8. Android:日常学习笔记(8)———探究UI开发(3)

    Android:日常学习笔记(8)———探究UI开发(3) 详解四种基本布局 前言 布局定义用户界面的视觉结构,如Activity或应用小部件的 UI.您可以通过两种方式声明布局: 在 XML 中声明 ...

  9. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  10. python3.4学习笔记(四) 3.x和2.x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

随机推荐

  1. WFS服务查询方法

    基于Geoserver发布的wfs服务,实现空间和属性信息的查询.wfs包含getFeature操作,用来检索要素信息,支持返回gml格式的地理要素表达. WFS的getFeature操作需要提供的参 ...

  2. Hadoop_HDFS_02

    1. HDFS入门 1.1 HDFS基本概念 HDFS是Hadoop Distribute File System的简称, 意为: Hadoop分布式文件系统. 是Hadoop三大核心组件之一, 作为 ...

  3. Win32 API编程——前言

    一丶什么是Win32 API? 微软为了保护操作系统的安全性和稳定性,把系统分为内核层和用户层(内核层的代码只能在当CPU的特权级为R0状态下执行,用户层的代码在CPU特权级为R0和R3都能执行),w ...

  4. js中数组去重方法及性能对比

    js中数组的 数组去重 常用的数组去重方法以及效率分析: 首先我们先构建一个数组,主要是用于进行去重实验,我们主要实验的量级为1000,10000,100000,500000.具体的生成数组的方法如下 ...

  5. 【zabbix部署】基于linux安装zabbix监控服务和被监控服务

    环境配置 zabbix_server:10.0.0.1 zabbix_agentd:10.0.0.1,10.0.0.2(暂定) 操作系统:centos7.6 安装环境配置 1. LNMP环境 zabb ...

  6. Microsemi Libero使用技巧——使用第三方编辑器Notepad++

    前言 与Xilinx的ISE和Altera的Quartus一样,Microsemi的编辑器也支持指定第三方编辑器. Microsemi自带的编辑器,没有自动补全功能,也不支持中文注释,非常不好用,为了 ...

  7. Prometheus学习系列(八)之Prometheus API说明

    前言 本文来自Prometheus官网手册 和 Prometheus简介 HTTP API 在Prometheus服务器上的/api/v1下可以访问当前稳定的HTTP API. 将在该端点下添加任何非 ...

  8. alpine制作jdk、jre镜像、自定义镜像上传阿里云

    alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...

  9. Laravel实现大型商城网站之用户注册短信发送项目实战功能开发

    确定短信运营商 我这里采用的云片,不过大家使用其它的也可以. 首先自己注册一个帐号,然后找到这个 点击开始接入,完成新手引导过程. 第二部的签名和模板必须填写,类似我下面填写的这样 值得注意的是这个模 ...

  10. SAP GUI Security notice

    出现错误提示: Failed to load administrator rule file.Check your Installation. 原因: 电脑缺少MS XML4.0,导致SAP客户端无法 ...