Android中Gradle深入理解

Gradle基础知识:

  • Groovy,由于它基于Java,所以我们仅介绍Java之外的东西。了解Groovy语言是掌握Gradle的基础。
  • Gradle作为一个工具,它的行话和它“为人处事”的原则。

Groovy定义:

百度百科:Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。

Groovy介绍:

image

发现了没?它和Java一样,也运行于Java虚拟机中!实际上,由于Groovy Code在真正执行的时候已经变成了Java字节码,所以JVM根本不知道自己运行的是Groovy代码。

Groovy入门:

请跳转:Groovy入门

这里重点讲一下闭包:

闭包,英文叫Closure,是Groovy中非常重要的一个数据类型或者说一种概念了。闭包的历史来源,种种好处我就不说了。我们直接看怎么使用它!

闭包,是一种数据类型,它代表了一段可执行的代码。其外形如下:

1
2
3
4
5
def aClosure = {//闭包是一段代码,所以需要用花括号括起来..
Stringparam1, int param2 -> //这个箭头很关键。箭头前面是参数定义,箭头后面是代码
println"this is code" //这是代码,最后一句是返回值,
//也可以使用return,和Groovy中普通函数一样
}

如果闭包没定义参数的话,则隐含有一个参数,这个参数名字叫it,和this的作用类似。it代表闭包的参数。

1
2
3
4
5
6
7
8
9
10
比如:
def greeting = { "Hello, $it!" }
assert greeting('Patrick') == 'Hello, Patrick!'
等同于:
def greeting = { it -> "Hello, $it!"}
assert greeting('Patrick') == 'Hello, Patrick!'
但是,如果在闭包定义时,采用下面这种写法,则表示闭包没有参数!
def noParamClosure = { -> true }
这个时候,我们就不能给noParamClosure传参数了!
noParamClosure ("test") <==报错喔!

闭包在Groovy中大量使用,比如很多类都定义了一些函数,这些函数最后一个参数都是一个闭包。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static <T> List<T>each(List<T> self, Closure closure)
上面这个函数表示针对List的每一个元素都会调用closure做一些处理。这里的closure,就有点回调函数的感觉。但是,在使用这个each函数的时候,我们传递一个怎样的Closure进去呢?比如:
def iamList = [1,2,3,4,5] //定义一个List
iamList.each{ //调用它的each,这段代码的格式看不懂了吧?each是个函数,圆括号去哪了?
println it
}
上面代码有两个知识点:
l each函数调用的圆括号不见了!原来,Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。比如
def testClosure(int a1,String b1, Closure closure){
//dosomething
closure() //调用闭包
}
那么调用的时候,就可以免括号!
testClosure (4, "test", {
println"i am in closure"
} ) //红色的括号可以不写..

如经常使用到的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
// apk output setting
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (publish.equals('false') ) {
return
}
def releaseApkName = 'yhshop-' + variant.productFlavors[0].name + '-v' + versionName + '-' + versionCode + '.apk'
println("output name======" + releaseApkName)
outputFileName = releaseApkName
}
}

Android 应用模块的默认项目结构

[站外图片上传中…(image-5ebded-1533465873627)]

Gradle工作流程:

image

我们以上图应用模块的默认项目结构来介绍

  • 首先是初始化阶段。就比如执行如上图settings.gradle。
    Initiliazation phase的下一个阶段是Configration阶段。
  • Configration阶段的目标是解析每个project中的build.gradle。比如multi-project build例子中,解析每个子目录中的build.gradle。在这两个阶段之间,我们可以加一些定制化的Hook。这当然是通过API来添加的。
    Configuration阶段完了后,整个build的project以及内部的Task关系就确定了,一个Project包含很多Task,每个Task之间有依赖关系。Configuration会建立一个有向图来描述Task之间的依赖关系。所以,我们可以添加一个HOOK,即当Task关系图建立好后,执行一些操作。
  • 最后一个阶段就是执行任务了。当然,任务执行完后,我们还可以加Hook。

接下来就是具体API使用了:

Gradle 里的几乎任何东西都是基于这两个基础概念:

  • task
  • project
    掌握了这两个,你就掌握了一大半的 Gradle 知识了。
    具体可以参考:掌控 Android Gradle

这里我贴一下我自己Demo中的几个使用:

1
2
3
apply from: '../signature.gradle'
apply from: '../config.gradle'
apply plugin: 'kotlin-android'
1
2
3
4
5
6
7
8
9
if (project.hasProperty("product") ? "true" : "false") {
bugly {
//do something
}
} else {
bugly {
//do something
}
}
1
2
3
4
5
if (rootProject.ext.compileProject) {
//不同APP依赖不同模块
} else {
//不同APP依赖不同模块
}

参考:

声明:此为原创,转载请联系作者


作者:微信公众号添加公众号-遛狗的程序员 ,或者可以扫描以下二维码关注相关技术文章。

qrcode_for_gh_1ba0785324d6_430.jpg

当然喜爱技术,乐于分享的你也可以可以添加作者微信号:

WXCD.jpeg

文章目录
  1. 1. Gradle基础知识:
    1. 1.1. Groovy定义:
    2. 1.2. Groovy介绍:
    3. 1.3. Groovy入门:
      1. 1.3.1. 这里重点讲一下闭包:
    4. 1.4. Android 应用模块的默认项目结构
|