Android Gradle 语法简介

Android Studio 是基于Gradle 作为编译系统的,下面简单总结一下Gradle!

Gradle API 文档:https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 

一、引言
Gradle 是groovy语言实现的构建工具. groovy是运行在jvm平台的一门敏捷开发语言.其语法和java有诸多类似之处,然而其具备一些java没有的概念需要读者细细体会.下面会详细的介绍groovy的基本语法,当然如果您已经对groovy的语法有了一定的了解.可以直接跳过这一小节.

二、闭包的基本语法
闭包是groovy中最重要的概念之一. 简单地说闭包(Closures)是一段代码块. 这个代码块可以接受参数并具有返回值. 有一点要非常注意的是, 闭包往往不是在需要使用的时候才写出来这么一段代码(就像Java的匿名类那样), 通过def 关键字可以声明一个变量代表一个闭包,然后在需要的时候直接使用该变量即可,多说无益,请看如下的例子:
1、一个简单的hello world闭包:

def myClosure = { println 'Hello world!' }
//execute our closure
myClosure()

output: Hello world!

2、如下是一个接受参数的闭包的例子:

def myClosure = {String str -> println str }
//execute our closure
myClosure('Hello world!')

output: Hello world!
3、如果闭包只接受一个参数,这个参数在代码块中可以用it代替:

def myClosure = {println it }
//execute our closure
myClosure('Hello world!')

output: Hello world!
4、如下是接受多个参数的闭包的例子:

def myClosure = {String str, int num -> println "$str : $num" }
//execute our closure
myClosure('my string', 21)

output: my string : 21
5、闭包里面的参数类型可以省略不写,例子如下:

def myClosure = {str, num -> println "$str : $num" }
//execute our closure
myClosure('my string', 21)

output: my string : 21
6、闭包还有一个比较酷的写法就是,可以直接调用context里面的变量,默认的context就是创建这个闭包的类(class) 例子如下:

def myVar = 'Hello World!'
def myClosure = {println myVar}
myClosure()

output: Hello world!

7、上面提到了闭包可以直接调用context的变量,这个context可以通过setDelegate()方法来改变,极大的增加了闭包的灵活性!

def myClosure = {println myVar} //I'm referencing myVar from MyClass class
MyClass m = new MyClass()
myClosure.setDelegate(m)
myClosure()
class MyClass {
    def myVar = 'Hello from MyClass!'
}

output: Hello from MyClass!

三、闭包可以作为参数进行传递

在groovy中,将闭包作为参数传递进函数,是将逻辑进行分离解耦的重要手段.在上述的例子中,我们已经尝试了如何将闭包作为参数进行传递.下面我们总结一下传递闭包的方法:

1 接受一个参数的函数
myMethod(myClosure)
2 如果函数只接受一个参数,括号可以忽略
myMethod myClosure
3 可以将闭包以插入语的形式创建
myMethod {println ‘Hello World’}
4 函数接受两个参数
myMethod(arg1, myClosure)
5 接受两个参数,同样可以用插入语创建闭包
myMethod(arg1, { println ‘Hello World’ })
6 如果存在多个参数,且最后一个参数是闭包,闭包可以不写在括号内
myMethod(arg1) { println ‘Hello World’ }
细心的朋友们是不是觉得上述的六种用法中,第三条和第六条很眼熟?很像gradle中的scripts了?

四、Gradle
在知道了groovy的基本语法(尤其是闭包)之后,下面我们就以一个简单的gradle 脚本作为例子具体感受一下:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
结合前文的例子,我们可以很容易的理解到,buildscript是一个接受闭包作为参数的函数,这个函数会在编译的时候被gradle调用.这个函数的定义就类似于:def buildscript(Closure closure). 而allprojects 同理也是一个接受闭包作为参数的函数.

那么问题来了,这些函数具体会在什么时候被gradle调用呢?要回答这个问题就需要介绍另一个知识点Project,理解gradle配置文件中的script如何调用的关键就是理解project的相关概念:在gradle执行某个”任务”的时候,会按照各个task的依赖关系来依次执行. 而执行这些task的对象就是Project.说的在通俗一些,project就是你希望gradle为你做的事情,而要完成这些事情,需要将事情分成步骤一步一步的做,这些步骤就是task.

Script blocks
通过前文的学习,我们已经很清楚的了解到scipt block就是一段接受闭包的函数,这些函数会被Project调用,默认的情况下,gradle 已经准备好了很多script用于我们对项目进行配置,例如buildScript{} … … 当然你也可以自己写出符合规范的task来在编译的过程中被调用。下面我们先看一下Android Studio中默认的script:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.trickyandroid.testapp"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
按照我们已经有的知识,上面的脚本说明有一个名称为android的函数,该函数接收闭包作为参数,然而其实在 Gradle的API文档中是不存在这个函数的. 那么android脚本怎么会出现在这里呢? 答案就是最上面的apply plugin:‘com.android.application’.这个插件提供了android构建所需要的各种script.

既然gradle官方的文档中没有android相关的script信息,那我们该怎么查阅呢? 您可以去官方的android网站上查阅,如果懒得找的话请点击这个链接:https://developer.android.com/shareables/sdk-tools/android-gradle-plugin-dsl.zip

您下载了前文连接的文档后,可以发现有一个html格式的文档的名字是AppExtension, 这个文档主要就是介绍了Android configuration blocks. 即在gradle官方文档中没有的关于Android 配置的各种gradle script都可以在这里进行查阅(几个例子):
1、 compileSdkVersion 在文档中的描述是Required. Compile SDK version. 即这个脚本是gradle进行Android构建之必需,并且这个脚本是用来描述编译的时候使用的sdk版本.
2、buildToolsVersion在文档中的描述是Required. Version of the build tools to use. 即该脚本是构建之必需,其用于告诉gradle使用哪个版本的build tools

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值