深入理解Android之Gradle

gradle tasks会列出每个任务的描述,通过描述,我们大概能知道这些任务是干什么的…..。然后gradletask-name执行它就好。

这里要强调一点:Task和Task之间往往是有关系的,这就是所谓的依赖关系。比如,assemble task就依赖其他task先执行,assemble才能完成最终的输出。

依赖关系对我们使用gradle有什么意义呢?

如果知道Task之间的依赖关系,那么开发者就可以添加一些定制化的Task。比如我为assemble添加一个SpecialTest任务,并指定assemble依赖于SpecialTest。当assemble执行的时候,就会先处理完它依赖的task。自然,SpecialTest就会得到执行了…

大家先了解这么多,等后面介绍如何写gradle脚本的时候,这就是调用几个函数的事情,Nothing Special!

4.3 Gradle工作流程

Gradle的工作流程其实蛮简单,用一个图26来表达:

图26 Gradle工作流程

图26告诉我们,Gradle工作包含三个阶段:

下面展示一下我按图26为posdevice项目添加的Hook,它的执行结果:

图26 加了Hook后的执行结果

我在:

好了,Hook的代码怎么写,估计你很好奇,而且肯定会埋汰,搞毛这么就还没告诉我怎么写Gradle。马上了!

最后,关于Gradle的工作流程,你只要记住:

下面来告诉你怎么写代码!

4.4 Gradle编程模型及API实例详解

希望你在进入此节之前,一定花时间把前面内容看一遍!!!

https://docs.gradle.org/current/dsl/ <==这个文档很重要

Gradle基于Groovy,Groovy又基于Java。所以,Gradle执行的时候和Groovy一样,会把脚本转换成Java对象。Gradle主要有三种对象,这三种对象和三种不同的脚本文件对应,在gradle执行的时候,会将脚本转换成对应的对端:

注意,对于其他gradle文件,除非定义了class,否则会转换成一个实现了Script接口的对象。这一点和3.5节中Groovy的脚本类相似

当我们执行gradle的时候,gradle首先是按顺序解析各个gradle文件。这里边就有所所谓的生命周期的问题,即先解析谁,后解析谁。图27是Gradle文档中对生命周期的介绍:结合上一节的内容,相信大家都能看明白了。现在只需要看红框里的内容:

图27 Gradle对LifeCycle的介绍

4.4.1 Gradle对象

我们先来看Gradle对象,它有哪些属性呢?如图28所示:

图28 Gradle的属性

我在posdevice build.gradle中和settings.gradle中分别加了如下输出:

//在settings.gradle中,则输出"In settings,gradle id is"println "In posdevice, gradle id is " +gradle.hashCode()println "Home Dir:" + gradle.gradleHomeDirprintln "User Home Dir:" + gradle.gradleUserHomeDirprintln "Parent: " + gradle.parent

得到结果如图29所示:

图29 gradle示例

Gradle的函数接口在文档中也有。

4.4.2 Project对象

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

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

所以,在Project中,我们要:

1. 加载插件

Project的API位于https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html。加载插件是调用它的apply函数.apply其实是Project实现的PluginAware接口定义的:

图30 apply函数

来看代码:

[apply函数的用法]

apply是一个函数,此处调用的是图30中最后一个apply函数。注意,Groovy支持

函数调用的时候通过 参数名1:参数值2,参数名2:参数值2 的方式来传递参数

apply plugin: ‘com.android.library’ <==如果是编译Library,则加载此插件apply plugin: ‘com.android.application’ <==如果是编译Android APP,则加载此插件

除了加载二进制的插件(上面的插件其实都是下载了对应的jar包,这也是通常意义上我们所理解的插件),还可以加载一个gradle文件。为什么要加载gradle文件呢?

其实这和代码的模块划分有关。一般而言,我会把一些通用的函数放到一个名叫utils.gradle文件里。然后在其他工程的build.gradle来加载这个utils.gradle。这样,通过一些处理,我就可以调用utils.gradle中定义的函数了。

加载utils.gradle插件的代码如下:

utils.gradle是我封装的一个gradle脚本,里边定义了一些方便函数,比如读取AndroidManifest.xml中

的versionName,或者是copy jar包/APK包到指定的目录

apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle"

也是使用apply的最后一个函数。那么,apply最后一个函数到底支持哪些参数呢?还是得看图31中的API说明:

做事不怕难,自无难人事。

深入理解Android之Gradle

相关文章:

你感兴趣的文章:

标签云: