Gradle学习之旅(一) – 基础语法笔记
Gradle学习之旅(二) – 闭包
Gradle,相信使用过 AndroidStudio 的童鞋们都再熟悉不过了,AndroidStudio 工具构建 Android 工程全靠他,跟 eclipse 使用的Ant类似,是一门脚本语言。在好奇心的推动下看了些博客,买了本飞雪无情的Android Gradle权威指南研究了两天,很薄的书不过介绍的很细致,看的过程中记了些笔记,想着跟大家分享下我这两天的成果,不过整本书还没看完,我把我看过的部分都写下来,后续书里的后几章内容待我整理下再更新。
推荐一篇更容易理解的gradle基础文章: https://www.cnblogs.com/dasusu/p/6635576.html
那么标题为什么叫 “在AndroidStudio中使用Gradle脚本” 呢?哈哈,因为AndroidStudio工具也可以写gradle工程,并且还有代码提示,我在学习Gradle写Demo的时候都是用的AndroidStudio(以下都称AS)工具,今天也介绍下如何利用AS工具来构建Gradle脚本。
首先从gradle环境搭建开始
- 第一步,下载Gradle,做Android开发使用AS工具的小伙伴就不用下载了,打开.gradle文件夹,找到对应版本号的gradle工具即可,没有用过AS也没关系,点击这里下载gradle脚本。
- 接下来要配置环境变量:
-
Windows用户:首先新建环境变量 GRADLE_HOME ,需要配置为Gradle的安装目录,然后在path环境变量中配置
%GRADLE_HOME%\bin
-
MAC用户: 同样也需要配置环境变量,不过跟Windows稍微不同,首先需要在用户 home 目录下(前往home目录请在桌面顶部选择 前往–>个人)新建纯文本文件 .bash_profile, 然后输入以下内容:
export GRADLE_HOME=/Users/admin/.gradle/wrapper/dists/gradle-4.1-all/bzyivzo6n839fup2jbap0tjew/gradle-4.1 export PATH=$PATH:$GRADLE_HOME/bin
第一行是GRADLE_HOME环境变量,第二行是PATH环境变量,然后保存并打开终端cd进入该文件所在目录,输入 source .bash_profile 更新环境变量,最后在终端输入Gradle命令 gradle -? 弹出一堆东西就是配置成功了
-
接下来介绍使用AndroidStudio新建Gradle工程:
首先打开AndroidStudio开发工具,确保上面环境变量配置无误,在工程根目录下新建文件夹,我取名为 GradleProject,该文件夹将是我们的Gradle工程目录,如下图:
接下来需要在 setting.gradle
中配置该目录为gradle工程,如下图在该文件中将我们的工程配置进去,之后同步即可
之后需要在我们所建的gradle工程中新建 build.gradle
文件,然后打开Terminal,输入gradle命令gradle -help
,等待执行成功输出一大堆东西确保环境变量配置无误(第一次执行gradle命令需要时间稍久些)(如果无法识别可以将 Terminal 窗口关闭再打开然后重新执行命令, 如果还不行就打开 cmd 窗口, 在 cmd 中执行命令, 如果 cmd 中可以执行, 但 Terminal 中不能执行, 需要重启 AndroidStudio(或IDEA))。
接下来在build.gradle中输入以下内容:
task HelloWorld {
doLast{
println 'HelloWorld'
}
}
执行这段脚本有两种方式:
- 第一种需要在 Terminal 中输入命令 gradle -q HelloWorld(HelloWorld为我们的任务名) 即可执行任务,如下图:
- 第二种需要同步工程,并打开AS中 Gradle侧边栏:
在 Tasks -> other中双击我们的工程即可运行(如果没有找到请先同步),运行结果需要打开右下角 Gradle Console 查看(正常是在右下角,我调了位置所以在左下角):
目前我们的第一个gradle程序已经执行成功了,接下来先介绍些常用的命令: - gradle -? | -h | - help **->**使用帮助
- gradle -q taskName **->**执行名为 taskName 的任务
- gradle -q|-i|-d tasks **->**输出 q 级别以上的日志
- gradlew -tasks **->**查看所有任务
- gradlew --refresh-dependencies assemble **->**强制刷新依赖
#####Groovy 脚本
Gradle是基于Groovy的,并且在Gradle中可以使用JAVA跟Groovy混编也全是Groovy的功劳,Java相信大家都应该很熟悉了,所以接下来就介绍下 Groovy这么脚本语言。
-
Groovy 是一门完全兼容 Java 的脚本语言,又有着脚本语言的特性,比如变量都用 def 定义,语句末尾不用加分号等。
-
groovy基本语法:
- String 字符串:
def str1 = '单引号字符串' def str2 = "双引号字符串" def str3 = """ 三引号多行字符串 """ println "单引号字符串: " + str1 println "双引号字符串: ${str2} // 只有一个变量时可以省略花括号,单引号字符串变量中不能使用${}"
- List集合
task printList <<{// << 是 doLast 的缩写 def list = [1,"2",3.0,'4']//list集合定义 println list[1]//访问第二个元素 println list[-1]//访问最后一个元素 println list[1..3]//访问第2到4个元素 list.each { println it //使用迭代器遍历list集合 } }
- Map集合
task printMap <<{ def map = ['name':"张三", 'age':23]//初始化 Map集合 println map['name'] //获取姓名 println map.age //获取年龄 map.each {//迭代遍历map集合 println "Key:${it.key}, value: ${it.value}" } }
- 方法
task method <<{ method1(1,2) method1 1,2 //括号可以省略 return 可省略(建议不要省略) } def method1(int a, int b){ println a+b }
- 代码块可以做参数传递, 类似 Object-C中的 block,可以实现Java中接口回调的功能
- JavaBean |类|对象
task printBean<<{ Person person = new Person person.name = "张三" person.age = 23 println person.name println person.age customEach2 {k,v -> println "name: ${k}, age: ${v}" } } class Person{ private String name; private int age; }
- 闭包
task printCustom <<{ //可以省略小括号变成这样 customEach {//调用下边定义的 customEach方法,传递一代码块并打印变量 当 custom 只有一个参数时就用it println it } customEach() { //稍微简写变成这样 (groovy 特性) println it } customEach ({//三者等价 正常写法是这样 println it }) } def customEach(closure){//闭包有点类似Java中的接口回调,closure相当于接口,在外部使用时传递的代码块相当于接口的实现,只不过 groovy 使用更加简洁 for (int i in 1..10){ closure(i) } } def customEach2(closure){//闭包传递多个参数 Person person = new Person person.name = "张三" person.age = 23 closure(person.name, person.age) }
- loggger 函数:
logger.quiet('q级别日志 最高') logger.error('e级别日志') logger.warn('w级别日志') logger.lifecycle('l级别日志') logger.info('i级别日志') logger.debug('d级别日志') ```
Gradle – Task:
gradle 中 Task是一个很重要的概念,接下来介绍创建Task的几种方式:
- 创建Task
tasks.create("oneTask",{//创建task方式一
doLast{
println "one"
}
})
task oneTask (){//创建Task方式二
doLast {
println "one"
}
}
task oneTask {//创建Task方式三
doFrist{//在任务执行前执行
println 'frist'
}
doLast {//在任务执行后执行
println "last"
}
}
task oneTask <<{//创建Task方式四
println "one"
}
- 任务依赖 dependsOn 指明任务依赖那些任务
指明了任务依赖后执行一任务会先执行依赖的任务
task task1 <<{
println 'task1'
}
task task2 <<{//注意task1 和 task2要放在task3上边, 要不然会找不到
println 'task2'
}
task task3 { //gradle -q task3 运行task3
dependsOn task1,task2
doLast{
println 'task3'
}
}
//打印结果:
//task1
//task2
//task3
- task 自定义属性
之前写代码都是在 task中,其实 task外 有一个叫做 project 的概念,下边的代码介绍在 project 中自定义属性并在 task 中使用:
ext.age = 18//为project自定义属性
ext {//自定义多个属性
phone = 'aaa'
hahaha = 'fff'
}
task task1 <<{
println age
println phone
println hahaha
}