Android-Gradle

1.Gradle介绍:

1.1Gradle是什么?

简单来说Gradle就是一个项目构建工具

1.2Gradle 有什么用?

它可以帮你管理项目中的差异,依赖,编译,打包,部署......,你可以定义满足自己需要的构建逻辑

1.3Gradle是用什么语言编写的呢:

Groovy基于Java并拓展了Java。 Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就是把写Java程序变得像写脚本一样简单。写完就可以执行,Groovy内部会将其编译成Javaclass然后启动虚拟机来执行。当然,这些底层的渣活不需要你管。

2.Groovy介绍:

Groovy是一种动态语言。这种语言比较有特点,它和Java一样,也运行于Java虚拟机中。恩??对头,简单粗暴点儿看,你可以认为Groovy扩展了Java语言。 比如,Groovy对自己的定义就是:Groovy是在 java平台上的、 具有像Python, Ruby 和 Smalltalk 语言特性的灵活动态语言, Groovy保证了这些特性像 Java语法一样被 Java开发者使用。

2.1闭包(Closure)

Groovy中的闭包是一个开放,匿名的代码块,可以接受参数,返回值并分配给变量,简而言之,他说一个匿名的代码块,可以接受参数,有返回值,甚至作为方法的参数传递

例子:

// 无参闭包
def clos = {println "Hello World"};
clos.call();
------------------------------------
// 带参闭包
def clos = {param->println "Hello ${param}"};   //这个箭头很关键。箭头前面是参数定义,箭头后面是代码,多参数用逗号分隔,param可以定义类型: String param
clos.call("World");
​
-----------------------------------
// 隐式单个参数(it)
def clos = {println "Hello ${it}"};
clos.call("World");
-----------------------------------
// 变量引用
def str1 = "Hello";
def clos = {param -> println "${str1} ${param}"}
clos.call("World");
​
str1 = "Welcome";
clos.call("World");
​
//执行结果:
Hello World 
Welcome World
-----------------------------------
// 省略圆括号:
//1.完整写法
task myTask() {
    doFirst({
        println("------>myTask 先执行")
    })
}
//2.去括号
task myTask() {
    doFirst {
        println("------>myTask 先执行")
    }
}
​

2.1DelegatesTo(委托)

例子:

3.基本组件:

3.1Project对象

每一个build.gradle文件都会转换成一个Project对象。在Gradle术语中,Project对象对应的是BuildScript。

Project包含若干Tasks。另外,由于Project对应具体的工程,所以需要为Project加载所需要的插件,比如为Java工程加载Java插件。其实,一个Project包含多少Task往往是插件决定的。

所以,在Project中,我们要:加载插件。

 

3.1.1. 加载插件

apply plugin: 'com.android.library'    <==如果是编译Library,则加载此插件
apply plugin: 'com.android.application'  <==如果是编译Android APP,则加载此插件
apply from: 'dependencies.gradle'  <==引入其他gradle
​
void    apply(Action<? super ObjectConfigurationAction> action)
Applies zero or more plugins or scripts.
void    apply(Closure closure)
Applies zero or more plugins or scripts.
void    apply(Map<String,?> options)
Applies a plugin or script, using the given options provided as a map.

3.1.2. 设置属性

如果是单个脚本,则不需要考虑属性的跨脚本传播,但是Gradle往往包含不止一个build.gradle文件,dependencies.gradle,settings.gradle。如何在多个脚本中设置属性呢?

在上一部分说到可以用apply from 引入其他gradle

Gradle提供了一种名为extra property的方法。extra property是额外属性的意思,在第一次定义该属性的时候需要通过ext前缀来标示它是一个额外的属性 。定义好之后,后面的存取就不需要ext前缀了。ext属性支持Project和Gradle对象。即Project和Gradle对象都可以设置ext属性

注意:如果多个gradle文件存在相同的属性,后加载的会覆盖前面加载的

举个例子:

 

3.2Tasks

有四个基本的 task, Android 继承他们分别进行了自己的实现:

assemble:对所有的 buildType 生成 apk 包。

clean:移除所有的编译输出文件,比如apk

check:执行lint检测编译。

build:同时执行assemblecheck命令

这些都是基本的命令,在实际项目中会根据不同的配置,会对这些task 设置不同的依赖。比如 默认的 assmeble 会依赖 assembleDebug 和assembleRelease, 如果直接执行assmeble,最后会编译debug,和release 的所有版本出来。如果我们只需要编译debug 版本,我们可以运行assembleDebug。

例子:

// 创建task
task myTask() {
    doFirst {
        println("------>myTask 先执行")
    }
​
    doLast {
        println("------>myTask 后执行")
    }
}
​
task myTask2() {
    println("------> myTask2")
}
//myTask 运行之前先运行myTask2
myTask.mustRunAfter myTask2
​
// 根据gradle api 提供的方法创建 创建 hello task 如下:
​
tasks.create("hello"){
    doFirst {
        println "-------->hello"
    }
}
​

一个Task包含若干Action。所以,Task有doFirst和doLast两个函数,用于添加需要最先执行的Action和需要和需要最后执行的Action。

Task创建的时候可以指定Type,通过type:名字表达。这是什么意思呢?其实就是告诉Gradle,这个新建的Task对象会从哪个基类Task派生 。比如,Gradle本身提供了一些通用的Task,最常见的有Copy 任务。Copy是Gradle中的一个类。当我们:task myTask(type:Copy)的时候,创建的Task就是一个Copy Task。

依赖关系:myTask 运行之前先运行myTask2,也可以存在多重的关系和先后执行

multi-projects build(多项目的构建)

Gradle中的多项目构建由一个根项目和一个或多个子项目组成。

虽然每个子项目都可以完全隔离其他子项目进行自我配置,但子项目共有共同特征是很常见的(比如compile/min/targetSdkVersion)。因此,通常最好在项目之间共享配置

每一个Project都必须设置一个build.gradle文件, 对于multi-projects build,需要在根目录下也放一个build.gradle,和一个settings.gradle。

根目录这个build.gradle一般干得活是:配置其他子Project的。比如为子Project添加一些属性

settings.gradle。这个文件很重要,名字必须是settings.gradle。它里边用来告诉Gradle,这个multiprojects包含多少个子Project。

Gradle工作流程

编译过程分为三个阶段:

初始化阶段:创建 Project 对象,如果有多个build.gradle,也会创建多个project.

配置阶段:在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为后一个阶段做准备。

执行阶段:在这个阶段,gradle 会根据传入的参数决定如何执行这些task,真正action的执行代码就在这里.

 

 

Gradle官网:https://gradle.org/

Gradle文档:https://docs.gradle.org/current/release-notes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值