Groovy介绍

Groovy 是一种动态语言。这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机 中。可以认为 Groovy 扩展了 Java 语言。比如,Groovy对自己的定义就是:Groovy 是在 java 平台上的、 具有像 Python, Ruby 和 Smalltalk 语言特性的灵活动态语言, Groovy 保证了这些特性像 Java 语法一样被 Java 开发者使用。

  1. 环境搭建

    http://www.groovy-lang.org/download.html#gvm

    创建test.groovy文件,

    println "hello world"
    

    执行groovy test.groovy

    如果正常打印“hello world”,说明环境已经搭建成功。

  2. 语法

    • 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"
    
  3. Groovy中的数据类型

    • java中的基本数据类型
    • Groovy中的容器类
    • 闭包
    1. java基本数据类型
    def int x = 1
    println x.getClass().getCanonicalName()
    
    1. 容器类

      • List:链表,其底层对应Java中的List接口,一般用ArrayList作为真正的实现类。
      • Map:键-值表,其底层对应Java中的LinkedHashMap。
      • Rang:范围,对List的一种拓展。
      1. List类
      def list = [5,'string',true]//List由[]定义,其元素可以是任何对象
      //变量存取:可以直接通过索引存取,而且不用担心索引越界。如果索引超过当前链表的长度,List会自动向该索引添加元素
      
      assert list[1] == 'string'
      assert list[5] == null
      assert list[100] == 100
      那,list到现在为止有多少个元素呢?
      
      1. Map类
      def map = ['key1':'value1','key2':true,'key3':100]
      
      Map由[:]定义,注意其中的冒号,冒号左边的key,右边是value。key必须是字符串,value可以任何对象。另外,key可以用单引号或双引号包起来,也可以不用。
      
      1. Range类
      def range = 1..5
      range.step 1,{
          print it
      }
      
    2. 闭包

    //定义
    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命令介绍

  1. gradle projects查看工程信息
  2. gradle tasks查看任务信息
  3. gradle task-name执行任务

Gradle工作流程

  • 初始化阶段
  • Configration阶段:解析每个project的build.gradle文件。
  • Configration之后,各个task的依赖关系就确定了。
  • 最后执行task

Gradle对象

主要看HomeDir和UserHomeDir

Project对象

  • 加载插件
  • 不同的插件有不同的dsl
  • 设置属性
  1. 加载插件
    apply方法,看api
  2. 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

说一下工程中的打包。