Gradle学习之旅(一) -- 基础语法笔记

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工程目录,如下图:
project
接下来需要在 setting.gradle 中配置该目录为gradle工程,如下图在该文件中将我们的工程配置进去,之后同步即可
setting
之后需要在我们所建的gradle工程中新建 build.gradle文件,然后打开Terminal,输入gradle命令gradle -help,等待执行成功输出一大堆东西确保环境变量配置无误(第一次执行gradle命令需要时间稍久些)(如果无法识别可以将 Terminal 窗口关闭再打开然后重新执行命令, 如果还不行就打开 cmd 窗口, 在 cmd 中执行命令, 如果 cmd 中可以执行, 但 Terminal 中不能执行, 需要重启 AndroidStudio(或IDEA))。
Terminal
接下来在build.gradle中输入以下内容:

task HelloWorld {
    doLast{
        println 'HelloWorld'
    }
}

执行这段脚本有两种方式:

  • 第一种需要在 Terminal 中输入命令 gradle -q HelloWorld(HelloWorld为我们的任务名) 即可执行任务,如下图:
    Terminal run
  • 第二种需要同步工程,并打开AS中 Gradle侧边栏:
    AS Gradle
    Tasks -> other中双击我们的工程即可运行(如果没有找到请先同步),运行结果需要打开右下角 Gradle Console 查看(正常是在右下角,我调了位置所以在左下角):
    as look
      目前我们的第一个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
}

猜你喜欢

转载自blog.csdn.net/qq_27070117/article/details/79309325