Android Gradle 基础知识概括

1. Groovy 基础

Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,并增加了很多动态类型和灵活的特性。(闭包、DSL)

Groovy中的函数

括号可以省略,method1(2,3)method1 2,3效果一样

method1(2,3)
method1 2,3 //执行效果和上面一行是一样的

def method1(int a,int b){
	println a+b
}

return可以不写,当没有return的时候,Goovy会把方法执行过程中的最后一句代码作为其返回值

def getResult(int a,int b){
	if (a > b) a else b
}

代码块(闭包)可以作为参数传递,即{}可以作为参数传递

list.each({
	println it
})

//方法也可以省略,变成我们常看到的样子
list.each {
	println it
}

Groovy中的闭包

闭包是Groovy一个非常重要的特性,可以说它是DSL的基础。

闭包其实就是一段代码块

customMethod {
	println "hello world!"
}

定义了一个方法customMethod,它只有一个参数,用于接收一个闭包 (代码块),即{}

Groovy中的DSL

DSL 领域特定语言,Gradle就是一门DSL,基于Groovy,专门用来解决自动化构建的DSL。

起因是自动化构建太复杂、太专业,理解门槛高,为了帮助人们使用,专家们就开发了相关的DSL,名叫Gradle。
我们作为开发者只要按照Gradle DSL定义的语法,书写相应的Gradle脚本就可以达到自动化构建的目的,这也是DSL的初衷。

Groovy中的断言

Groovy断言和Java断言不同,Groovy断言一直处于开启状态,是进行单元测试的首选方式

task method << {
	assert 1+2 == 6
}

当断言的条件为false时,程序会抛出异常,不再执行下面的代码,从而可以很清晰地看到发生错误的地方。

Groovy中的asType

asType可以用于数据类型转换

String a = '123'  
def b = a.asType(Integer)  

2. Gradle 常用的命令

查看所有可执行的Tasks

:tasks

Gradle强制刷新依赖

./gradlew --refresh-dependencies assemble

多任务调用

可以一个命令执行多个任务

./gradlew clean assemble

通过任务名字缩写执行

驼峰命名可以缩写,比如./gradlew connectCheck可以使用

./gradlew cc

查找app工程依赖树

./gradlew :app:dependencies

使用Android Studio中的Gradle View插件,也可以达到同样的效果,且比较主观 / 美观

查看所有可执行Tasks

./gradlew tasks 

3. Gradle构建脚本基础

Settings 文件

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

设置文件大多数的作用都是为了配置子工程。

Build文件

每个Project都会有一个Build.gradle文件,该文件是该Project构建的入口。

Root Project可以获取到所有的Child Project,所以在Root ProjectBuild文件里我们可以对Child Project统一配置,比如应用的插件,依赖的Maven中心库等。

大家不要误以为subprojectsallprojects只能配置。他们只是两个方法。

void subprojects(Closure configureClosure);

void allprojects(Closure configureClosure);

接受一个闭包作为参数,对工程进行遍历,遍历的过程中调用我们自定义的闭包,所以我们可以在闭包里配置、打印、输出或修改Project的属性都可以。

Projects以及tasks

在Gradle中,可以有很多Project,每个Project又是由很多个Task组成的。

Task : 一个操作,比如打个jar包,复制一份文件,编译一次Java代码,上传一个jar到Maven仓库等

创建一个Task

task customTask1{
	doFirst {
		println "customTask1:doFirst"
	}
	doLast{
		println "customTask1:doLast"
	}
}

这里的Task看着像一个关键字,其实它是Project对象的一个函数,原型为create(String name,Closure configureClosure) ,参数一是Task的名字,参数二是一个闭包。

最后一个参数是闭包的时候,就可以放到括号外面,然后方法的括号可以省略,就生成了上面的写法,很简洁。

doFirst和doLast方法,分别在Task执行前后输出一段文字。

方式二,使用TaskContainer进行创建

tasks.create("customTask2"){
	doFirst {
		println "customTask2:doFirst"
	}
	doLast{
		println "customTask2:doLast"
	}
}

任务依赖

dependsOn可以指定其依赖的任务,从而可以确定任务执行的顺序。

自定义属性

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

//自定义一个Project的属性
ext.age=18

//通过代码块同时自定义多个属性
ext {
	phone = 12345678
	address="xxxxx"
}

task myTask << {
	println "年龄是${age}"
	println "电话是${phone}"
	println "地址是${address}"
}

相比局部变量,自定义属性有更为广泛的作用域,你可以跨Project,跨Task访问这些自定义属性。只要你能访问这些属性所属的对象,那么这些属性都可以被访问到。

Gradle wrapper

Gradle Wrapper是对Gradle的包装,它的作用是简化Gradle本身的下载、安装和构建。
因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。
所以引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置指定版本的gradle,我们就不用关心如何去下载gradle,如何配置到项目中,gradle-wrapper 自动帮我们做了这些事,这样就标准化了项目,从而提高了开发效率。

至于gradlew也是一样的道理,它共有两个文件,gradlew是在linuxmac下使用的,gradlew.bat是在window下使用的,提供在命令行下执行gradle命令的功能
至于为什么不直接执行Gradle,而是执行Gradlew命令呢?
因为就像wrapper本身的意义,gradle命令行也是善变的,所以wrapper对命令行也进行了一层封装,使用同一的gradlew命令,wrapper会自动去执行具体版本对应的gradle命令。
同时如果我们配置了全局的gradle命令,在项目中如果也用gradle容易造成混淆,而gradlew明确就是项目中指定的gradle版本,更加清晰与明确。

Gradle 清除maven依赖缓存

删除C:\Users\你的用户名\.gradle\caches\modules-2\files-2.1\对应包名文件夹,Gradle就会再重新去拉去最新的maven依赖了。

Gradle Task 指定 组

默认新建的task是会被放到other组内的,如果我们放到对应的group中,那么我们需要在代码中指定

task uploadArchivesAll(group: 'upload'){
  ...
}

重新sync项目后,可以看到,upload组内多了一个uploadArchivesAll的Task
在这里插入图片描述

Task除了可以配置group、description外,还可以配置name、type、dependsOn、overwrite、action
给Task分组之后,该task会被放到指定组中,方便归类查找。(默认被分组到other中)
给Task添加描述,相当于给方法添加注释

Gradle 执行task时传入参数

执行gradle task的时候,如果想要携带参数,需要加-P

gradlew 你的task名称 -P参数名称=参数值

比如

task hello(){
    println("你好啊:"+username)
}

执行命令

gradlew hello -Pusername=heiko

执行结果

你好啊:heiko

dependsOn 和 mustRunAfter

tasks.create('a')
tasks.create('b').dependsOn('a')
tasks.create('c')
tasks.create('d').mustRunAfter('c')
  • dependsOn : 设置任务依赖项。正在执行 b这里需要 a首先被执行。
  • mustRunAfter : 设置任务顺序。正在执行 d不需要 c .但是,当两个 c和 d包括在内,c将在 d 之前执行.

如果全局设置 : task01.dependsOn(task02),执行task01的时候,task02会先被执行

参考
《Gradle权威指南》
《Android进阶指北》
关于 Gradle 你应该知道的知识点
Gradle如何传递参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值