Gradle系列(一):Groovy基础

Gradle系列(一):Groovy基础
Gradle系列(二):AndroidStudio的Gradle简介
Gradle系列(三):项目实践

前言

关于Gradle的文章很多,但是大多是以一些技巧为主,东敲西打看了之后可能解决了一些问题,但对于新的需求,gradle如何运用到项目中还是一知半解。我准备稍微深层一点了解gradle,从基本语法开始到如何用到实际项目中,在此我把gradle的学习分成三个部分,分享给大家:

  • 第一部分:Groovy基础
  • 第二部分:android studio中gradle插件简介
  • 第三部分:项目实践

Groovy基础

项目中build.gradle都是用groovy写的,不了解一下groovy怎么能看得懂呢?这里只需要知道groovy的一些基础知识,比如怎么定义变量,定义方法,方法怎么使用,闭包的使用,这些就差不多了。
首先要知道groovy是一种脚本语言,有下面三个特点:

  • 是一种动态语言,不需要编译直接生效
  • 是一种DSL,即Domain Specific Language(专门领域的编程语言,所以比较难阅读)
  • Groovy基于Java同时也像是一种脚本语言(基于java,这个看下面基本语法就明白了)

基本语法

  • ****定义基本变量:****
   def variable1 = 1   //可以不使用分号结尾
   def varable2 = "I am a person"
   def  int x = 1   //变量定义时,也可以直接指定类型
  • ****字符串:****

1  单引号''中的内容严格对应Java中的String,不对$符号进行转义
 
   def singleQuote='I am $ dolloar'  //输出就是I am $ dolloar
2  双引号""的内容则和脚本语言的处理有点像,如果字符中有$号的话,则它会$表达式先求值。
 
   def doubleQuoteWithoutDollar = "I am one dollar" //输出 I am one dollar
   def x = 1
   def doubleQuoteWithDollar = "I am $x dolloar" //输出I am 1 dolloar
3 三个引号'''xxx'''中的字符串支持随意换行 比如
 
   def multieLines = ''' begin
     line  1
     line  2
     end '''

  • ****定义函数:****

String testFunction(arg1,arg2){//无需指定参数类型
  ...
}

def  nonReturnTypeFunc(){
     last_line   //最后一行代码的执行结果就是本函数的返回值
}
 
//如果指定了函数返回类型,则可不必加def关键字来定义函数
String  getString(){
   return "I am a string"
}

  • ****函数调用:****

println("test") ---> println "test"// 可以不加括号,但是建议:自定义的方法调用加上括号! API提供的方法调用可以不用括号

  • ****数据类型:****

  • ** java中的基础数据类型**

在Groovy中所有事物都是对象,int count = 12; //这里的count其实是Integer类型,其他的使用和Java一样

  • ****容器类****

1.List


变量定义:List变量由[]定义,也可以赋予一些初始值,比如
 
def aList = [5,'string',true] //List由[]定义,其元素可以是任何对象
 
变量存取:可以直接通过索引存取,而且不用担心索引越界。如果索引超过当前链表长度,List会自动
往该索引添加元素
 
assert aList[1] == 'string'
assert aList[5] == null //第6个元素为空
aList[100] = 100  //设置第101个元素的值为10
assert aList[100] == 100
 
那么,aList到现在为止有多少个元素呢?
 
println aList.size  ===>结果是101

2.Map


Map由[:]定义,注意其中的冒号。冒号左边是key,右边是Value。key必须是字符串,value可以是任何对象。另外,key可以用''或""包起来,也可以不用引号包起来。比如

    def mapData = [:]
    mapData.put("name","test name")
    println(mapData.get("name"))//输出“test name”

3.闭包(Closure)

  • 定义:闭包,是一种数据类型,它代表了一段可执行的代码。他可以作为方法的参数,或者返回值,也可以独立运行
//自定义一个闭包
def aClosure = { //闭包是一段代码,所以需要用花括号括起来..
String param -> println("test closure,para = $param") //这个箭头很关键。箭头前面是参数定义,箭头后面是代码
        return 200 //返回值
    }
//调用这个闭包:(用call方法或者直接蚕食写在括号里面)
def count = aClosure.call("dml")
//    def count2 = aClosure("dml")
    println("$count")

在Gradle控制台看一下输出:

Paste_Image.png

上面说到Closure也可以作为方法的参数,在Android Gradle中有不少这样的用法,比如:


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug{
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为boohee_v1.0_2015-01-15_wandoujia.apk
                        def fileName = "boohee_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }

分析一下这里代码是什么意思:
这里debug的配置代码:
作用是根据多渠道打包配置,重新命名APK(这里的实例代码是在productFlavors中配置了“wandoujia”),这里不考虑这个配置,看下这段代码用到了
applicationVariants.all和variant.outputs.each两个Android Gradle插件API提供了两个方法,第一个方法大致意思是获取project对应的app,第二个方法大致意思是遍历生成的所有debug和release的apk,并且重命名!

Paste_Image.png

看下each这个方法,参数就是一个Closure,并且遍历自己,把每一个item传入这个自定义的Closure执行,而在这个Closure中就是我们自己的实现:传入
output变量,对output重命名。Closure有点类似java的函数回调。

  • 闭包使用注意:

1.如果一个方法的最后一个参数是Closure那么,可以不用圆括号,比如上面的all方法和each方法

2.如果闭包没有定义参数,那么它默认拥有参数it,类似于java的this:

    def bClosure = {println("param = $it")
    }
    bClosure.call("this closure!") //输出: param = this closure!

3.闭包的参数怎么传
比如上面的
variant.outputs.each方法,虽然知道他要传入closure参数,但是这个closure参数传几个呢 ? 我们无法确定,只有通过API:

Paste_Image.png

才能知道这个closure只接受一个参数!如果我们传入多参数的closure这里会报错,所以说closure和上下文有很强的关联性,我们必须熟悉一些api才能很好地传入closure!

  • IO操作
    Groovy提供了简单的读取文件的方法,通过一个实例了解一下:
    在我们公司项目中,一些基础功能比如网络模块,通用控件等单独编译成aar文件,放到项目的根目录lib文件夹。
Paste_Image.png

我们可以利用gradle的IO操作读取lib里面的file名称:

   //获取基础库版本号
    def path = rootProject.getRootDir().getAbsolutePath() + "/libs"
    def configFile = new File(path)
    def files = configFile.listFiles()
    def aar1 = files[0].getName()
    def aar2 = files[1].getName()
       println(aar1 )
    println(aar2 )

输出:

Paste_Image.png

那这个有什么用呢,后面第三部分的实践会讲到。

其他

Groovy还有一些技巧:

  1. 读取xml文件,比如读取manifest.xml文件信息
  2. 封装独立的工具类tools.gradle,比如获取Android版本名称,版本号,拷贝文件等IO操作

这些等用到的时候再说

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,513评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,312评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,124评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,529评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,937评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,913评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,084评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,816评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,593评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,788评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,267评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,601评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,265评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,158评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,953评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,066评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,852评论 2 277

推荐阅读更多精彩内容

  • Groovy :是一种动态语言。 1:这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机中。简单...
    PeytonWu阅读 1,487评论 0 1
  • 这篇文章讲给大家带来gradle打包系列中的高级用法-自己动手编写gradle插件。我们平常在做安卓开发时,都会在...
    呆萌狗和求疵喵阅读 15,911评论 22 80
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,108评论 18 139
  • 导语: 随着技术的发展,不管是前端开发、服务端开发或者是移动端开发(移动也是前端的一个分支)中都会用到自动化构建工...
    伊始雨深阅读 2,956评论 0 4
  • 学习Gradle,前前后后总结了一些内容,然后整理出了一个系列,共计10篇文章,与大家分享: Groovy基本介绍...
    sososeen09阅读 1,772评论 0 7