Gradle初识
Android打包的一种工具
生命周期
一个Android项目从 源代码+资源文件 -> 应用包,Gradle可大致分为3个步骤
- 初始化阶段:加载项目配置文件(build.gradle)并创建Gradle对象。解析项目结构、依赖关系等,并准备构建所需的资源和插件
- 配置阶段:根据初始化加载的配置文件来配置项目构建。执行各模块的Task、解析依赖关系、确定编译选项、处理资源文件、应用插件等。主要确定构建行为和内容(即告诉Gradle如何构建项目)
- 执行阶段:根据配置阶段确定的构建行为执行实际的构建任务。按指定顺序执行各任务(编译源码、处理资源文件、运行单元测试、打包等)。该阶段是构建的实际执行阶段,根据配置及任务间关系自动执行所需任务
任务Task
Gradle构建的操作单位,用于执行具体的构建任务,编译、打包等。一次编译由多个Task组成的
基础语法
// Gradle变量
val resDirs = arrayOf(
"other"
)
// Gradle方法
fun getDate(): String {
return ""
}
// Gradle任务
task("A") {
println("this is A Task")
}
task("B") {
// 依赖Task A
dependsOn("A")
println("this is B Task")
doFirst {
println("Task B doFirst")
}
}
// 注册名为myCopy类型为Copy的任务,将src目录下所有文件拷贝至dst目录
tasks.register<Copy>("myCopy") {
from("src")
into("dst")
}
// 使用kotlin委托属性
val myCopy1 by tasks.registering(Copy::class)
val myCopy2 by tasks.registering(Copy::class) {
from("src")
into("dst")
}
项目Project
- 一个Android项目在Gradle作用下会生成一个rootProject对象,每个module对应一个project
- rootProject可以管理所有的子project,即可在根目录的build.gradle中一次性管理所有module中的依赖配置
# 方式一:根目录下独立配置各模块信息
// app module
project("app") {
// 强制app工程使用某个版本的依赖以解决依赖冲突问题
project.configurations.all {
resolutionStrategy {
force("com.xxx:xxx:1.x.x")
}
}
apply(plugin = "com.android.application")
// 指定版本
version = "1.0.0"
// project可配置的均可在此配置
dependencies {}
}
// lib module
project("lib") {
apply(plugin = "com.android.library")
dependencies {}
}
# 方式二:根目录下统一配置各模块信息,例强制依赖版本号
subprojects {
// 对所有子module遍历
project.configurations.all {
// 对module中所有配置遍历
resolutionStrategy.eachDependency {
// 对配置中所有的依赖遍历
if (requested.group == "org.greenrobot"
&& requested.name.contains("eventbus")) {
// 通过依赖group和name,锁定一个依赖,并指定同一个版本号
useVersion("1.x.x")
}
}
}
}
小结
- Task是Gradle工作的基本单元,编译时可在控制台中看到有很多task在执行
- 每个项目都包含一个根build.gradle.kts和一个或多个模块build.gradle.kts组成
- 每个build.gradle.kts中都是由多个Task组成的
- 编译时每个build.gradle.kts都会被Gradle编译成Project字节码,build.gradle.kts中所有逻辑都会被映射成Project字节码的实现逻辑
- 可在根build.gradle.kts中统一管理module配置信息