Groovy介绍
Groovy 是一种动态语言。这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机 中。可以认为 Groovy 扩展了 Java 语言。比如,Groovy对自己的定义就是:Groovy 是在 java 平台上的、 具有像 Python, Ruby 和 Smalltalk 语言特性的灵活动态语言, Groovy 保证了这些特性像 Java 语法一样被 Java 开发者使用。
-
环境搭建
http://www.groovy-lang.org/download.html#gvm
创建test.groovy文件,
println "hello world"
执行groovy test.groovy
如果正常打印“hello world”,说明环境已经搭建成功。
-
语法
- groovy注释和java一样
- groovy语句末尾可以不使用分号
- groovy中支持动态类型,即在定义的时候可以不指定类型。
def var1 = 1 //可以不使用分号结尾 def var2 = "Hello World" def int x = 1 //变量定义时,也可以直接指定类型
- 函数定义时,参数的类型也可以不指定。
String fun(arg1,arg2){//可以不指定参数类型 }
- 函数返回值也可以不指定类型
def fun(){ last_line //最后一行执行的结果就是本函数的返回值 } //如果指定了函数的返回类型,则可不必加def关键字来定义函数 String fun(){ return "Hello World" }
- 函数的返回值,可以不使用return,函数的最后一句代码执行的结果被设置成函数的返回值。
def fun(){ "Hello" //如果这句是最后一行代码,则返回类型为String 1000 //如果这行是最后一行代码,则返回值为Integer }
注意:函数定义时指明了返回值类型的话,函数中则必须返回正确的数据类型,否则运行时报错
- groovy对字符串支持相当强大,充分吸收了一些脚本语言的优点
//1,单引号中的内容严格对应Java中的String,不对$符号进行转义 def string = 'I am $dolloar' //输出就是I am $dolloar //2,双引号的内容和脚本语言的处理有点像,如果字符串中有$号的话,则会 $表达式 先求值 def x = 1 def string = "I am $x"//输出I am 1 //3,三个引号中的字符串支持随意换行 def string = '''begin line 1 line 2 end '''
- 最后,groovy中函数调用可以不加括号
println("test") println "test"
-
Groovy中的数据类型
- java中的基本数据类型
- Groovy中的容器类
- 闭包
- java基本数据类型
def int x = 1 println x.getClass().getCanonicalName()
-
容器类
- List:链表,其底层对应Java中的List接口,一般用ArrayList作为真正的实现类。
- Map:键-值表,其底层对应Java中的LinkedHashMap。
- Rang:范围,对List的一种拓展。
- List类
def list = [5,'string',true]//List由[]定义,其元素可以是任何对象 //变量存取:可以直接通过索引存取,而且不用担心索引越界。如果索引超过当前链表的长度,List会自动向该索引添加元素 assert list[1] == 'string' assert list[5] == null assert list[100] == 100 那,list到现在为止有多少个元素呢?
- Map类
def map = ['key1':'value1','key2':true,'key3':100] Map由[:]定义,注意其中的冒号,冒号左边的key,右边是value。key必须是字符串,value可以任何对象。另外,key可以用单引号或双引号包起来,也可以不用。
- Range类
def range = 1..5 range.step 1,{ print it }
-
闭包
//定义 def closure = { String param1,int param2-> println param1+param2//最后一句是返回值 } //调用 closure.call("Hello",100) closure("hello",100)
如果闭包没定义参数的话,则隐含有一个参数,这个参数名叫it,和this的作用类似。it代表闭包的参数。
例如:
def closure = {"hello $it"} 等同于: def closure = {it->"hello $it"} assert closure("wang") == "hello wang"
Gradle
它是一个构建工具。
Project
一个build.gradle即为一个project。
Task
构建工作的基本单位。
gradle命令介绍
- gradle projects查看工程信息
- gradle tasks查看任务信息
- gradle task-name执行任务
Gradle工作流程
- 初始化阶段
- Configration阶段:解析每个project的build.gradle文件。
- Configration之后,各个task的依赖关系就确定了。
- 最后执行task
Gradle对象
主要看HomeDir和UserHomeDir
Project对象
- 加载插件
- 不同的插件有不同的dsl
- 设置属性
- 加载插件
apply方法,看api - extra property:项目中的config.gradle
Task介绍
//Task 是和 Project 关联的,所以,我们要利用 Project 的 task函数来创建一个 Task
task myTask <==myTask 是新建 Task 的名字
task myTask { configure closure }
task myType << { task action }<==注意,<<符号 是 doLast 的缩写
task myTask(type: SomeType)
taskmyTask(type: SomeType) { configure closure }
Android Plugin DSL Reference
http://google.github.io/android-gradle-dsl/current/index.html
说一下工程中的打包。