admin 管理员组

文章数量: 887021

Gradle

Groovy Language

Gradle 系列

  1. Gradle - 简介
  2. Gradle - Groovy Language
  3. Gradle - DSL
  4. Gradle - Android Plugin DSL
  5. Gradle - 插件开发
  6. Gradle - 插件发布

简介

  • Groovy - 官方文档

Gradle 依赖于 Groovy,Groovy 同时本身是一种 DSL。所以学习 Gradle 之前我们先熟悉一下 Groovy 语言。

DSL 的全称是 Domain Specific Language,即领域特定语言,或者直接翻译成”特定领域的语言”,算了,再直接点,其实就是这个语言不通用,只能用于特定的某个领域,俗称“小语言”。因此 DSL 也是语言。

Groovy 程序运行时,首先被编译成 Java 字节码,然后通过 JVM 来执行。 Java, Groovy 和 JVM 之间的关系类似于下图:

实际上,由于 Groovy Code 在真正执行的时候,已经变成了 Java 字节码, 因此 JVM 根本不知道自己运行的是 Groovy 代码。

环境搭建

  • 配置 Java JDK

    Groovy 是依赖于 Java 的,所以首先要配置好 JDK。

  • 下载安装 Groovy

    .html

    下载完解压放在固定目录下。

  • 配置环境变量

    // 配置 Groovy 环境变量

    $ vim ~/.bash_profile

    export PATH=$PATH:/Users/<username>/Develop/groovy-2.4.15/bin 
    

    // 重新加载配置文件,使配置生效

    $ source ~/.base_profile

    // 打印版本号

    $ groovy -v

    显示结果为:

    Groovy Version: 2.4.15 JVM: 9.0.1 Vendor: Oracle Corporation OS: Mac OS X
    
  • Hello World

    创建一个 hello.groovy 文件。

    $ vim hello.groovy

    输入代码:

    println "Hello Groovy!"
    

    保存并执行

    $ groovy hello.groovy

    输出结果为:

    Hello Groovy!
    

基本语法

默认情况下,Groovy 在代码中包括以下库,因此您不需要显式导入它们。

import java.lang.* 
import java.util.* 
import java.io.* 
import java.net.* import groovy.lang.* 
import groovy.util.* import java.math.BigInteger 
import java.math.BigDecimal
  • 变量

    def variable = 1//不需要指定类型,不需要分号结尾
    def int x = 1//也可以指定类型
    
  • 函数

    //无需指定参数类型
    String test(arg1, arg2) {return "hello"
    }//返回值也可以无类型
    def test2(arg1, arg2) {return 1
    }def getResult() {"First Blood, Double Kill" // 如果这是最后一行代码,则返回类型为String1000 //如果这是最后一行代码,则返回类型为Integer
    }//函数调用,可以不加()
    test a,b
    test2 a,b
    getResult()
    

    调用函数要不要带括号,我个人意见是如果这个函数是 Groovy API 或者 Gradle API 中比较常用的,比如 println,就可以不带括号,否则还是带括号。

  • 字符串

    //单引号包裹的内容严格对应Java中的String,不对$符号进行转义
    def singleQuote='I am $ dolloar' //打印singleQuote时,输出I am $ dollardef x = 1
    def test = "I am $x" //打印test时,将输出I am 1
    
  • 容器类

    Groovy中的容器类主要有三种: List(链表)、Map(键-值表)及Range(范围)。

    //List
    // 元素默认为Object,因此可以存储任何类型
    def aList = [5, 'test', true]
    println aList.size  //结果为3
    println aList[2]  //输出true
    aList[10] = 8
    println aList.size // 在index=10的位置插入元素后,输出11,即自动增加了长度
    println aList[9] //输出null, 自动增加长度时,未赋值的索引存储null//添加as关键字,并指定类型
    def aList = [5, 'test', true] as int[]//Map
    def aMap = ['key1':1, "key2":'test', key3:true]//读取元素
    println aMap.key1    //结果为1
    println aMap.key2    //结果为test//注意这种使用方式,key不用加引号println aMap['key2'] //结果为test//插入元素
    aMap['key3'] = false
    println aMap         //结果为[key1:1, key2:test, key3:false] //注意用[]持有key时,必须加引号aMap.key4 = 'fun'    //Map也支持自动扩充
    println aMap         //结果为[key1:1, key2:test, key3:false, key4:fun]//Range
    def aRange = 1..5
    println aRange       // [1, 2, 3, 4, 5]aRange = 1..<6       
    println aRange       // [1, 2, 3, 4, 5]println aRange.from  // 1
    println aRange.to    // 5println aRange[0]    //输出1
    aRange[0] = 2        //抛出java.lang.UnsupportedOperationException
    
  • 闭包

    //同样用def定义一个闭包
    def aClosure = {//代码为具体执行时的代码println 'this is closure'
    }//像函数一样调用,无参数
    aClosure() //将执行闭包中的代码,即输出'this is closure'//下面这种写法也可以
    //aClosure.call()
    
  • Groovy 可以像 Java 那样定义类,例如:

    package com.jeanboy.groovyclass Test {String mNameString mTitleTest(name, title) {mName = namemTitle = title}def print() {println mName + ' ' + mTitle}
    }
    

    与 Java 不同的是,如果不声明 public/private 等访问权限, Groovy 中定义类的方法及成员变量均默认是 public 的。

    与 Java 一样,其它文件如果需要使用这个类时, 需要使用 import 关键字导入。

    例如,在 Test 类的根目录下创建一个测试文件 test.groovy 时, 可以这么使用 Test.groovy:

    import com.jeanboy.groovy.Testdef test = new Test('superman', 'hero')
    test.print()
    
  • 文件

    def targetFile = new File("/home/jeanboy/Desktop/file.txt")
    //读文件的每一行
    targetFile.eachLine { String oneLine ->println oneLine
    }
    def bytes = targetFile.getBytes()//返回文件对应的 byte()
    

其他系列

  • Android 屏幕适配全攻略
  • Windows 环境下载 Android 源码
  • Android 性能优化-UI优化
  • Android 性能优化-内存优化
  • Java 虚拟机内存分配机制
  • Java 虚拟机垃圾回收机制
  • 一篇文章看明白 TCP/IP,TCP,UDP,IP,Socket 之间的关系
  • 一篇文章看明白 HTTP,HTTPS,SSL/TSL 之间的关系
  • 一篇文章看明白 Android 系统启动时都干了什么
  • 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
  • 一篇文章看明白 Android 从点击应用图标到界面显示的过程
  • 一篇文章看明白 Activity 与 Window 与 View 之间的关系
  • 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
  • 一篇文章看明白 Android Service 启动过程
  • 一篇文章看明白 Android PackageManagerService 工作流程
  • 一篇文章看明白 Android v1 & v2 签名机制

更多文章:

这是我博客长期更新的项目,欢迎大家 Star。

我的公众号

欢迎你「扫一扫」下面的二维码,关注我的公众号,可以接受最新的文章推送,有丰厚的抽奖活动和福利等着你哦!?

如果你有什么疑问或者问题,可以 点击这里 提交 issue,也可以发邮件给我 jeanboy@foxmail.com。

同时欢迎你 来一起交流学习,群里有很多大牛和学习资料,相信一定能帮助到你!

本文标签: Gradle