IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android之Gradle构建生命周期 -> 正文阅读

[移动开发]Android之Gradle构建生命周期

Gradle进行构建,都经过3个生命周期阶段:

  • 初始化阶段
  • 配置阶段
  • 执行阶段

Gradle提供了很多生命周期监听方法,可以在各阶段Hook指定的任务;

1.Project

Project提供的生命周期回调方法有

//在Project进行配置前调用
void beforeEvaluate(Closure var1);
//在Project配置结束后调用
void afterEvaluate(Closure var1);

beforeEvaluate必须在父模块的build.gradle对子模块进行配置才能生效,因为在当前模块的build.gradle中配置,它自己本身都没配置好,所以不会监听到;

我们用个例子来验证下结果,工程结构如下图所示:

?setting.gradle代码:

include ':app'
rootProject.name = "FloatWindowL"

FloatWindowL/build.gradle代码:

//对子模块进行配置
subprojects { sub ->
    sub.beforeEvaluate { project ->
        println "${project.name}子项目beforeEvaluate回调..."
    }
}

println "根项目配置开始---"

task rootTest {
    println "根项目里任务配置---"
    doLast {
        println "执行根项目任务..."
    }
}

println "根项目配置结束---"

FloatWindowL/app/build.gradle代码:

println "APP sub project config start---"

afterEvaluate {
    println "APP sub project afterEvaluate callback..."
}

task appTest {
    println "APP sub project task config---"
    doLast {
        println "execution sub project task..."
    }
}

println "APP sub project config end---"

在根目录执行:gradle -q,结果如下:

C:\xxxx\FloatWindowL>gradle -q
根项目配置开始---
根项目里任务配置---
根项目配置结束---
app子项目beforeEvaluate回调...
APP sub project config start---
APP sub project task config---
APP sub project config end---
APP sub project afterEvaluate callback...
?

2.Gradle

Gradle提供的生命周期回调方法很多,部分与Project里的功能类似:

//在project进行配置前调用,child project必须在root project中设置才会生效,root project必须在settings.gradle中设置才会生效
void beforeProject(Closure closure)

//在project配置后调用
afterProject(Closure closure)

//构建开始前调用
void buildStarted(Closure closure)

//构建结束后调用
void buildFinished(Closure closure)

//所有project配置完成后调用
void projectsEvaluated(Closure closure)

//当settings.gradle中引入的所有project都被创建好后调用,只在该文件设置才会生效
void projectsLoaded(Closure closure)

//settings.gradle配置完后调用,只对settings.gradle设置生效
void settingsEvaluated(Closure closure)

我们修改gradle的代码如下:

include ':app'
rootProject.name = "FloatWindowL"

//在初始化前就已经调用了buildStarted方法,所以在初始化阶段无法回调到
gradle.buildStarted {
    println('init Before bulidStarted......')
}

//1.初始化阶段
gradle.settingsEvaluated {
    println('init settingsEvaluated')
}

gradle.projectsLoaded {
    println('init projectsLoaded')
}

//2.配置阶段
gradle.beforeProject {project -> 
????????println "${project.name} config beforeProject --- in settings.gradle"
}

gradle.afterProject{ project ->
    println "${project.name} config afterProject"
}

gradle.projectsEvaluated {
    println 'config projectsEvaluated'
}

// 4.build结束
gradle.buildFinished {
    println 'buildEnd buildFinished'
}

这个时候的执行结果如下:

init settingsEvaluated
init projectsLoaded
FloatWindowL config beforeProject --- in settings.gradle
根项目配置开始---
根项目里任务配置---
根项目配置结束---
FloatWindowL config afterProject
app config beforeProject --- in settings.gradle
app子项目beforeEvaluate回调...
APP sub project config start---
APP sub project task config---
APP sub project config end---
app config afterProject
APP sub project afterEvaluate callback...
config projectsEvaluated
buildEnd buildFinished

可以看到 gradle.beforeProject project.beforeEvaluate 是类似的,同样 afterProject afterEvaluate 也是类似的。

除此之外,Gradle 还有一个通用的设置生命周期监听器的方法:addListener

?上面的 BuildListenerProjectEvaluationListener 等与前面的部分 API 功能是一致的,这里不再赘述了。

3. TaskExecutionGraph(Task执行图)

Gradle 在配置完成后,会对所有的 task 生成一个有向无环图,这里叫做 task 执行图,他们决定了 task 的执行顺序等。同样,Gradle 可以对 task 的执行生命周期进行监听。

//任务执行前掉用
void afterTask(Closure closure)
//任务执行后调用
void beforeTask(Closure closure)
//任务准备好后调用
void whenReady(Closure closure)

通过 gradle.getTaskGraph() 方法来获取 task 执行图:

FloatWindowL/app/bulid.gradle

// 3.执行阶段
TaskExecutionGraph taskGraph = gradle.getTaskGraph()
taskGraph.whenReady {
    println "task whenReady"
}

taskGraph.beforeTask { Task task ->
    println "task name:${task.name} beforeTask"
}

taskGraph.afterTask { Task task ->
    println "task name:${task.name} afterTask"
}

4. 小结

生命周期回调的执行顺序(粗体为生命周期方法):

C:\XXX\FloatWindowL>gradle -q
init settingsEvaluated
init projectsLoaded
FloatWindowL config beforeProject --- in settings.gradle
根项目配置开始---
根项目里任务配置---
根项目配置结束---
FloatWindowL config afterProject
app config beforeProject --- in settings.gradle
app子项目beforeEvaluate回调...
APP sub project config start---
APP sub project task config---
APP sub project config end---
app config afterProject
APP sub project afterEvaluate callback...
config projectsEvaluated
task whenReady
task name:help beforeTask

Welcome to Gradle 6.5.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org
task name:help afterTask
buildEnd buildFinished
?

Gradle构建周期的Hook点

参考:

Android Gradle学习(七):Gradle构建生命周期 - 简书

Gradle生命周期_威威的专栏-CSDN博客

Gradle | 进阶篇(Project & Task & 构建生命周期)| 七日打卡 - 掘金

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:59:21  更:2021-11-15 16:00:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:24:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码