想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助,Android 工程师使用 Gradle 的门槛不算太高,基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改,就都能满足项目要求。但是,深入细致了解 Gradle 的基本知识,还是能帮助我们更优雅的实现项目配置工作。
有些场景 gradle 甚至能帮助我们完成一些业务上的需求,下面我们就来了解一下 gradle 那些需要掌握的基本知识。
gradle Task
Task(任务)可以理解为 gradle 的执行单元,gradle 通过执行一个个 Task 来完成整个项目构建工作。
自定义 Task
我们可以在 build.gradle 中使用关键字 task 来自定义一个 Task。如下代码所示
task A{println 'this is task A'
}
上面定义了一个简单的 task A,然后同步 build.gradle ,可以看到下面的打印结果
从结果中可以看出,打印日志是在 gradle 的配置阶段执行的。
gradle 的构建生命周期包含三个部分:初始化阶段、配置阶段、执行阶段
在 task A 中添加 doFirst 闭包,如下所示
执行后打印结果如下所示
gradle 在运行期,会执行所有的 Task 配置语句,然后执行指定的 Task。
Task 之间可以存在依赖关系
gradle 中的 Task 可以通过 DependsOn 来指定依赖另一个 Task,如下所示
在 builid.gradle 中新加了一个 Task B,并通过 dependsOn 关键字指定 Task B 依赖于 task A,执行 task B,结果如下
可以看出,我们虽然只是执行的 task B,但是因为依赖关系的存在,task A 也会被执行。
gradle 会在配置 Configure 阶段,确定依赖关系,对于 Android 项目来说即为执行各个 module 下的 build.gradle 文件。这样各个 build.gradle 文件中的 task 依赖关系就被确认起来了。而这个依赖关系的确定就是在 Configuration 阶段。
gradle 自定义方法
我们可以在 build.gradle 中使用 def 关键字,自定义方法。比如一下代码中,自定义了 getData() 方法,并在 task 中使用此方法。
执行 my_task,结果如下
gradle project
在 android 中,每个 module 就对应一个 project。gradle 在编译时期会为每一个 project 创建一个 Project 对象用来构建项目。这一过程是在初始化阶段,通过解析 settings.gradle 中的配置来创建相应的 Project。
上图 settings.gradle 中导入了 3个 project,但是实际上还会有一个root project。如下所示
我们可以在 root project 中统筹管理子 project。
buildSrc 统筹依赖管理
随着项目越来越大,工程中的 module 越来越多,依赖的第三方库也越来越多。一般情况下,我们会在一个集中的地方统一管理这些三方库的版本。比如谷歌官方推荐的使用 ext 变量。在 root module 下的 build.gradle 中,使用 ext 集中声明各种第三方库的版本。如下所示
然后在子 module 中引用这些版本信息
但是,这种写法也有一些小瑕疵,不支持 AS 的自动补充功能,也无法使用代码自动跟踪。因此可以考虑使用 buildSrc。
buildSrc 是 Android 项目中一个比较特殊的 project,在 buildSrc 中可以编写 Groovy 语言。但是现在谷歌越来越推荐使用 Kotlin 来编写编译语句。
先在根目录下创建 buildSrc 目录。结果如下
注意,这个工程只能有一个并且名字必须为 buildSrc。创建好之后,在 buildSrc 中创建 build.gradle.kts 文件,并添加 kotlin 插件。
编译工程可能会报错,如下所示
只要添加 repositories{jcenter()} 厂库即可。
接下来在 buildSrc 中创建 src/main/java 目录,并在此目录下创建 Dependencies.kt(名字可以随便取)。Dependencies.kt 中创建两个 Object,分别用来管理项目中的版本信息和使用的依赖库。
我么可以在 Versions 中添加各种项目中可能引用到的版本
然后在 Deps 中引用 Versions 中的变量
最后,我们就可以在 module 中的 build.gradle 中直接使用 Deps 中的变量来声明依赖。比如在 app module 的 build.gradle 中添加如下依赖
下图中,使用 buildSrc 前后的对比。并且在使用 Deps 的过程中,Studio 会给出自动提示。
总结
本次主要介绍了 gradle 构建中的 Task 和 project。
Task 与大部分开发者的开发是最为紧密的,是 gradle 构建的基本单元。每次编译工程时,Android studio 会在控制台打印出执行的 task 名称。
project 对应项目中的 module,每个 module 中包含一个 build.gradle。每个 build.gradle 都会被 gradle 编译成 Project 字节码。在 build.gradle 中所写的所有逻辑,最终都会被映射成此 Project 字节码内的实现逻辑。