本节我们从整体的角度来介绍一下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文件中看到如下配置:

  1. ...
  2. allprojects {
  3. repositories {
  4. google()
  5. jcenter()
  6.  
  7. }
  8. }
  9. ...

这样配置会非常方便,省去了我们对每个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如下:

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

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

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

四、Task 详解

1. 创建一个任务(Task)

创建一个任务很简单,前面很多例子我们也都有演示:

  1. task customTask1 {
  2. doLast {
  3.    println 'customTask1:doLast'
  4. }
  5.  
  6. doFirst {
  7. println 'customTask1:doFirst'
  8. }
  9. }

输出结果如下:

  1. > Task :customTask1
  2. customTask1:doFirst
  3. customTask1:doLast

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

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

  1. tasks.create("customTask1") {
  2. doLast {
  3. println 'customTask1:doLast'
  4. }
  5.  
  6. doFirst {
  7. println 'customTask1:doFirst'
  8. }
  9. }

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

2. 任务依赖

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

下面我们来举一个非常简单的例子,说明一下:

  1. task outHello {
  2. println 'hello'
  3. }
  4.  
  5. task outMain(dependsOn: outHello) {
  6. doLast {
  7. println 'main'
  8. }
  9. } 

输出如下:

  1. renhui:android-gradle-book-code renhui$ gradle outMain
  2.  
  3. > Configure project :
  4. hello
  5.  
  6. > Task :outMain
  7. main

从例子中,我们可以看出,在创建任务的时候,通过dependsOn可以指定其依赖的任务。

五、自定义属性

Project 和 Task 都允许用户添加额外的自定义属性,要添加额外的自定义属性,可以使用应用所属的对应的ext即可实现。添加之后可以通过ext属性对自定义属性读取和设置,如果要同时添加多个自定义属性,可以通过ext代码块:

  1. ext.age = 18
  2.  
  3. ext {
  4. phone = 123455
  5. address = '保定'
  6. }
  7.  
  8. task outMain() {
  9. println "年龄是:${age}"
  10. println "电话是:${phone}"
  11. println "年龄是:${address}"
  12. }

输出结果为:

  1. > Configure project :
  2. 年龄是:18
  3. 电话是:123455
  4. 年龄是:保定

相比局部变量,自定义属性有更加广泛的作用域,你可以跨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. 设计模式-单例模式code

    package singeton; import java.security.SecureRandom; /** * @author Zero * @since 2019-08-13. * Descr ...

  2. Android 自定义吐司通知

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...

  3. Android binder流程简图

    前段时间因为一个bug,研究了一下android binder的大概流程,方便自己理解画了一个框图. 粗点线箭头是继承关系,细实线箭头是调用关系.

  4. mysql数据库排坑过程

    刚安装mysql后想通过navicat来连接mysql,发现报错 1251这个错误,不慌.这个很简单. 首先通过cmd进入mysql. 然后修改密码规则 ALTER USER 'root'@'loca ...

  5. 阅读webpack代码笔记:antd-layout的webpack.config.prod.js

    'use strict'; const autoprefixer = require('autoprefixer');//自动补全css前缀 const path = require('path'); ...

  6. spring-boot 再添加mysql启动器的时候报错, The driver is automatically registered via the SPI and manual loading of the driver class....

    mysql驱动更新迭代之后驱动,稍微有点变化: com.mysql.jdbc.Driver (变化为) --> driver-class-name: com.mysql.cj.jdbc.Driv ...

  7. IPFS学习-DNS链接

    DNSLink 什么是DNS链接 DNS链接使用DNS TXT记录映射域名(如ipfs.io)到一个IPFS地址.因为你可以编辑自己的DNS记录,可以使他们总是指向最新版本的IPFS中的对象(如果修改 ...

  8. SpringBoot应用篇(二):SpringSecurity实现带验证码的登录认证 附代码

    一.文章简介 本文简要介绍了spring security的基本原理和实现,并基于springboot整合了spring security实现了基于数据库管理的用户的登录和登出,登录过程实现了验证码的 ...

  9. 3.java基础之关键字instanceof

    1. instanceof 使用:对象引用名 instanceof 类名 作用:来判读引用的对象和类名是否兼容(是否继承该类,或爷爷辈的类) 例子: Team team = new Team(); t ...

  10. Java 基础复习 -- Enum 类

    一.枚举类基本语法 在 Java SE5 中添加了一个看似很小的特性,即 enum 关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便的处理. 所有的 enum 都继承自 java.lang. ...