了解Gradle带你玩转Project

一、Gradle构建的生命周期

Gradle构建过程有3个生命周期,Initialization、Configuration和Execution

Initialization阶段会执行settings里面的代码,Configuration阶段会执行所有build.gradle里面的操作,无论是不是task,Execution阶段会执行action里面的操作

刚学gradle的时候经常看到有人写文章说gradle最重要的是Project、task和action,其实这样说确实能让新人很容易上手,却同样也很容易误导别人。但是从Project入手是不会有错的,真的了解Project是什么之后,你就真正的能看出gradle的架构,到时候task、action什么的就一目了然了。

二、Project

1. Project基本概念

(1)Lifecycle 生命周期
(2)Tasks 任务
(3)Dependencies 依赖
(4)Multi-project Builds 多项目构建
(5)Plugins 插件
(6)Properties 属性
(9)Methods 方法

2. 生命周期

生命周期是说,project在Initialization阶段被创建,我们经常在settings.gradle写比如

在Initialization阶段执行这行代码,创建app这个模块的project对象,那就是说一般来说,每个module对应一个project对象。准确来说是gradle根据settings.gradle去找对应module的build.gradle来创建project对象,也就是说project就是build.gradle。
所以project对象对应的代码在哪写,project在哪里创建,这些应该都很清楚了。

3. Methods 方法

task放到之后再写,我更倾向于单独拿一章出来写,其它的也应该分出来讲,要从浅入深,所以先讲Methods,因为它简单。
把project当成一个对象,那这个对象里面有方法就很容易理解吧,先看看一般AS生成的build.gradle是怎样的,也就是project一般是怎样的(我随便找个Demo里面的app模块的代码)

android {......}里面的内容,这是plugin(插件)的知识,先略过

整个project里面只剩一个dependencies 方法,为什么说是方法。这个是一个闭包的写法,不知道的话建议先看看groovy语法中的闭包,一个参数的情况下是能省略括号的。

然后看看project中有什么方法

截图截不完,具体的可以看官网的API https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html
我们随便拿一个方法来说,比如说getName,获取project的名称就这样写

this就是指这个project嘛,代码会在Configuration生命周期中执行,打印

这个Module的名称就叫app,我们可以再演示调用多一点的方法

而且也能在文档中找到默认生成的dependencies

传的参数是一个闭包(至于闭包里面写什么内容,那就要参照官网文档了)再比如文档中还有个ant​(Closure configureClosure)方法,那你就能这样写

那是不是只能在build.gradle里面调用文档中的方法,当然不是,当然也可以自己定义方法

上面演示的是在自己内部调用自己的project方法,那在别的project对象中调用该project的方法呢?就是一号project调用二号project的方法,要怎么操作。这种情况肯定是多模块的情况,先拿到这个project对象,然后再调用它的方法。这时候我们API找到对project的操作

比较分散,可能没截完全部,总之在这个API中肯定是能找到的,光看上面的这些方法就知道能拿到所有能获取到的Project,简单说几个
(1)比如getAllprojects(),返回当前的project和子project的集合(子project的意思是比如Moudule的project就是根目录project的子project)
(2)比如getParent()就是获取父project
(3)比如project​(String path)就是根据path获取project

你可以在对应的project中调用getPath()打印,就知道这个project的path是什么了,还有很多方法能获取到相对应的project,
假如我在名为test的project中调用:app的project

获取:app的根目录的地址,这样就行了,看得出什么不。project(":app").getRootDir() 和 this,getRootDir() 得到的结果是一样的,因为他们都是同一个根目录下。

4. Properties

文档中也有个Properties文档

截不完图,详细的可以看文档,比如属性中有个常用的属性name,可以直接在project中获取

如果我们直接设值的话呢

会提示这个属性是只读的属性。想看关于这些属性更详细的信息的话,可以在文档下面找到Property details

你会发现属性后面有个只读的提示,name属性也是,所以无法直接这样修改属性。

还有有个额外属性操作,就是ext关键字。在A的project中定义

在B的project中调用

project就大概先提到这些吧,其它内容在讲到task、dependencies和plugin也会提到一些相关的内容,学了project的生命周期和一些属性、方法之后,对project相信也会有一定的了解。

发布了25 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_20328181/article/details/101516933