【Android】初探自动化构建-Gradle中的Groovy

Groovy&Gradle

Groovy是基于JVM的一种脚本语言。

Gradle是新一代的自动化构建工具(似Ant+Ivy,Maven),其核心功能由Java实现。
幷包含由Groovy编写的自动化构建领域特定语言(DSL)。
Gradle的构建脚本(build.gradle)就是一个可执行的Groovy脚本。

Groovy的语法特性

Groovy底层由Java实现,几乎100%地支持Java语法
还融合了Python等脚本语言的特性,可以更加简洁:

基本语法

  1. 省略分号:语句后的分号(;)是可选的。
  2. 省略括号:如果方法调用有参数传递,括号是可选的,如:println 'Hello World'apply plugin:'java'等价于apply([plugin:'java'])
  3. 省略return:返回语句return是可选的,默认返回方法体最后一条语句的值或null,如无需返回应声明为void
  4. 构造器成员方法默认都是public的。
  5. 自动生成getter/setter,可以通过点号(.)操作成员,底层自动调用。
  6. ==在底层自动调用equals
  7. assert语句会一直生效,无需指定-ea-enableassertion

更多特性

  1. 类型弱化:def占位java.lang.Object,运行时自动分析 且 引用的类型可变。

  2. 命名参数:默认构造 + setter赋值

    class Person{
        String name
        Integer age
    }
    
    def Person p = new Person(name:'Name1',age:18);
    assert p.age == 18
    
  3. 闭包
    闭包是一个java.lang.Closure类型的代码块,可以赋值给变量,也可以作为方法调用。

    隐式闭包
    没有显式定义参数的闭包都可以访问一个it,代表调用这个闭包传过来的第一个参数,没传为null

    def increment={
        assert it == 12
    }
    increment(12)
    

    显式闭包

    def sum = { one, two, three ->
        one + two + three
    }
    println sum(1, 3, "14") // !!!: 414
    

    返回值
    闭包总是会返回值(return返回、最后一条语句的值,或null)。

    闭包作为方法参数

    void echo(Closure<Object> closure, def obj){
        println closure()+obj
    }
    echo({10},1)
    

    闭包委托
    闭包代码在委托上执行,默认委托是闭包的所有者,如:groovy.lang.Script。闭包的隐式成员delegate允许改变默认的所有者。

    class Person{
        String name
        Integer age
    
        void update(Closure closure){
            closure.resolveStrategy = Closure.DELEGATE_ONLY
            closure.delegate = this
            closure()
        }
    }
    
    Person person = new Person(name:"aCk",age:18);
    person.update {
        name = name.toUpperCase()
        age++
    }
    println person.name+' : '+person.age // ACK : 19
    
  4. 字符串
    三种定义方式:

    def s1 = 'Hello';
    def s2 = "World";
    def s3 = """
        Hello,
        Groovy;
    """
    

    其中双引号的串中可以有插值计算操作:

    def s1 = 'groovy';
    def s2 = "Hello ${s1.capitalize()}"
    assert s2=="Hello Groovy"
    
  5. List与Map

    // java.util.ArrayList
    def list = ['S1','S2']; 
    
    list << 'S3' // list.add("S3");
    
    assert list[2]=='S3' // list.get(2);
    
    list.each { /* it -> */ // 默认提供迭代器it
        println it
    }
    
    
    // java.lang.LinkedHashMap
    def map = ['K1':'V1', 'K2':'V2']
    
    assert map.K1 == 'V1'
    assert map['K2'] == 'V2'
    
    assert map.size() == 2
    
    map['K3'] = 'V3'
    
    map.each { key,val ->
        println "key $key's value is $val"
    }
    
  6. GDK(Groovy Development Kit)
    GDK拓展了JDK,并提供了很多更便捷的方法。具体可参见:http://groovy.codehaus.org/groovy-jdk/

new File().eachLine{ line ->
    println line
}

Gradle中的Groovy

每个build.gradle构建脚本都至少有一个对应的org.gradle.api.Project实例,多数情况下脚本的属性和方法都委托给了这个实例。

// project.apply([plugin:''])
apply plugin: 'com.android.application'

// project.android({})
android {
    // closure.delegate|owner.compileSdkVersion(28)
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.chavin"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        // closure.delegate|owner.setEnabled(true)
        enabled = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章