前言
Gradle对于android开发来说既熟悉也陌生,熟悉在于gradle已经成为android studio的默认构建工具,我们需要在build.gradle等配置文件中通过闭包申明来进行各种构建配置,而陌生在于gradle的另外一重身份,也就是编译编程框架,对于大多数开发者来说鲜于接触甚至一无所知。
因此会在接踵而至的随记中对gradle编译编程涉及最常用同时也最为重要的几个部分project,task,plugin,publish以及process来进行逐步解析,一起来对gradle的编译过程一窥究竟。
语言
正所谓工欲善其事必先利其器,在开始理解gradle前必须先了解其支持的语言,最常用的就是Java,Groovy以及Kotlin。
语法
推荐用Groovy和kotlin,kotlin实际上是Groovy的升级版,因为这两种语言会更加的简洁并且支持闭包,同时很多流行的插件也是由这两种语言来进行开发,这样以后会更便于对其源码的阅读。
这两种语言优点在于扩展了很多高阶函数比如find,any,count,drop等
,这是DefaultGroovyMethods
默认提供的,另外IO操作会更加简洁明了,而这是ResourceGroovyMethods
提供。
file.eachLine { println "${it}"}
outFile.withOutputStream { output ->
inFile.withInputStream { input ->
output << input
}
}
闭包
闭包实际是一个可以接收参数输入,同时有结果输出的匿名代码块,每一个闭包就是一个Closure对象。
语法:{ [closureParameters -> ] statements }
我们着重来说明怎么调用gradle函数中的闭包,例如org.gradle.api.project
中定义的一个函数
void subprojects(Closure var1)
我们怎么去得知这个Closure是需要传入什么参数同时输出结果是什么?很简单,在gradle中每一个闭包函数都会对应一个普通函数,因此上述闭包函数对应的就是
void subprojects(Action<? super Project> var1)
其中,Action对应的是
@HasImplicitReceiver
public interface Action<T> {
void execute(T var1);
}
那可以清晰从中得知此Closure是一个传入参数为Project对象,返回是void的闭包。
这里语法不再做进一步细说了,Groovy和Kotlin可以自行去各自的官网学习,当然也可以就纯粹用Java进行开发,Java和Groovy以及Kotlin是无缝兼容的,因为最后都是编译成class字节码进行类装载。
开发环境
开发环境可以用android推荐的IDE(Android Studio)进行开发。这里需要说明的是,AS下载不了gradle对应的源码下来,这对于后续开发来说是一件很头疼的事情,当然也有解决的办法。
- maven仓库根据
com.android.tools.build:gradle
查找对应版本的source-jar包,下载拷贝到对应gradle-api.jar所在的目录下 - Gradle Releases官网下载对应的complete版本
个人推荐第二种方式,因为complete版本包含了所有源码的同时,并且包含User Manual, API Javadoc,Dsl Reference
。下载解压后,通过AS的Choose Sources打开对应的源码目录。
好了,Gradle开发的前提工作都已准备完毕,下节会进入到gradle编译的世界,从Project开始一步一步揭开迷雾。