【Android Gradle 插件】Gradle 构建机制 ④ ( Gradle 构建生命周期 | 初始阶段 | 配置阶段 | 执行阶段 )
文章目录
Gradle 构建生命周期 :
- 初始阶段 ( Initialization )
- 配置阶段 ( Configuration )
- 执行阶段 ( Execution )
Gradle 构建生命周期 完整流程 : 下图中的函数 , 都可以作为 HOOK 点 , 监听拦截 Gradle 的执行流程 ;
参考
- 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 )
- 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 )
- 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )
博客 , 添加 Gradle 生命周期中的监听器 , 以监听拦截生命周期的各个阶段执行情况 ;
一、初始阶段
初始阶段 ( Initialization ) : Gradle 构建启动后最开始执行的阶段 ;
- 执行 settings.gradle 构建脚本 , 查看当前的工程有哪些子模块 , 工程的顶层配置有哪些 , 如 rootProject.name 工程名称 ;
- 为每个 build.gradle 构建脚本 创建对应的 Project 实例对象 ;
Gradle 构建 是 通过 调用 Gradle#buildStarted 函数 开启的 , 该函数 不属于 初始化阶段 ,
下面开始 进入 初始化阶段 :
首先 , 执行 settings.gradle 构建脚本 ;
然后 , 执行 Gradle#settingsEvaluated 函数 , 验证 settings.gradle 中的配置 ;
最后 , 执行 Gradle#projectsLoaded 函数 , 创建 Project 实例对象 ;
下图是初始化阶段执行的过程 :
监听拦截初始化阶段 : 参考 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 ) 二、Gradle#addBuildListener 函数 博客 , 调用 Gradle#addBuildListener 方法 , 添加 BuildListener 监听器 , 参考代码如下 :
gradle.addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
// 构建开始时回调该函数
}
@Override
void settingsEvaluated(Settings settings) {
// 分析 settings.gradle 函数完成后回调该函数
}
@Override
void projectsLoaded(Gradle gradle) {
}
@Override
void projectsEvaluated(Gradle gradle) {
}
@Override
void buildFinished(BuildResult buildResult) {
// 构建完成时回调的函数
}
})
其中
- BuildListener#settingsEvaluated 接口 就可以拦截 初始化阶段的 Gradle#settingsEvaluated 函数 ,
- BuildListener#projectsLoaded 接口 就可以拦截 初始化阶段的 Gradle#projectsLoaded 函数 ,
二、配置阶段
配置阶段 ( Configuration ) 会解析 工程根目录 和 每个模块 下的 build.gradle 构建脚本 , 确定 任务分组 , 任务之间的 依赖关系 , 执行顺序 等 , 然后对任务进行配置 ; 注意这里 只对任务进行配置 , 不会执行任务 ;
在 编写完 build.gradle 构建脚本 后 , 并 不会生成 Gradle 任务 , 在右侧的 Gradle 面板中找不到自定义的 Gradle 任务 , 需要点击 " Sync Now " 按钮 , 进行 配置阶段 操作 , 才会在右侧 Gradle 面板中 生成自定义的 Gradle 任务 , 并且 将指定的任务分配的指定的分组 , 任务间的依赖关系 , 执行先后顺序 也会进行处理配置 ;
如果没有配置 , 是不会再右侧 Gradle 面板显示自定义 Gradle 任务的 ;
配置阶段执行内容 :
如果要对该 " 配置阶段 " 的构建过程进行拦截 , 参考 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 ) 二、Project#afterEvaluate 函数 三、Project#beforeEvaluate 函数 博客章节 , 可以直接在 build.gradle 构建脚本中 调用上述 Project#beforeEvaluate 函数 和 Project#afterEvaluate 函数 ;
1、任务配置示例演示
在根目录的 build.gradle 构建脚本 中 , 定义一个任务
task Hello {
println "Hello"
}
点击右上方的 " Sync Now " 进行同步 ,
发现在 配置工程 阶段 , 执行了 Hello 任务闭包中的代码 ,
在 Build 面板中输出内容如下 : 下面的输出说明 , 配置阶段只配置任务 , 并没有执行任务 ;
Starting Gradle Daemon...
Gradle Daemon started in 2 s 669 ms
> Configure project :
Hello
BUILD SUCCESSFUL in 11s
2、任务执行示例演示
点击该 Gradle 任务左侧的 运行按钮 , 运行该任务 ;
运行 Hello 任务 , Build 面板输出如下内容 , 说明运行任务前 , 需要配置任务 ;
16:46:20: Executing task 'Hello'...
Executing tasks: [Hello] in project D:\002_Project\002_Android_Learn\MyApplication2
> Configure project :
Hello
AGPBI: {"kind":"warning","text":"Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build to other Maven repositories.\nThis repository is deprecated and it will be shut down in the future.\nSee http://developer.android.com/r/tools/jcenter-end-of-service for more information.\nCurrently detected usages in: root project 'My Application', project ':app', project ':hello', ...","sources":[{}]}
> Task :Hello UP-TO-DATE
BUILD SUCCESSFUL in 496ms
16:46:21: Task execution finished 'Hello'.
3、任务执行示例代码
修改构建脚本中的 Hello 任务 , 修改完毕后 , 点击右上角的 " Sync Now " 按钮 ,
task Hello {
println "Hello"
doFirst {
println "Hello doFirst"
}
}
输入结果如下 , 该 Hello 任务只进行了配置 , 没有运行任务 ;
> Configure project :
Hello
BUILD SUCCESSFUL in 3s
三、执行阶段
执行阶段 ( Execution ) 会在 配置阶段 的 任务配置 基础上 , 执行任务 ;
执行阶段执行的任务如下 :
如果要对该过程进行拦截 , 可参考 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 ) 博客进行 拦截 ;
相关文章
- 基于chromium for android开发Android浏览器
- Android ListView滚动条配置完全解析
- Android + Appium 自动化测试完整的环境配置及代码详解
- mac 电脑android环境变量设置,mac上Android环境变量配置[通俗易懂]
- Android angle_android 界面悬停
- android应用程序_chrome Android
- 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )
- 【Android Gradle 插件】Android Studio 工程 Gradle 构建流程 ② ( settings.gradle 构建脚本分析 | 根目录下 build.gradle 分析 )
- 【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
- 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )
- 【Android Gradle 插件】settings.gradle 配置文件 ( 配置基本作用 | include 函数用法 | 目录层级配置 | 修改 Module 模块构建脚本名称 )
- 【Android Gradle 插件】Gradle 映射文件 ( settings.gradle 映射为 Settings 类 | build.gradle 映射为 Project 类 )
- 【Android Gradle 插件】build.gradle 中的 android 配置 ( 配置项 | compileSdkVersion 配置 | buildToolsVersion 配置 )
- 【Android Gradle 插件】ProductFlavor 配置 ( AppExtension#externalNativeBuild 配置 | cmake 配置 | ndkBuild 配置 )
- 【Android Gradle 插件】ProductFlavor#externalNativeBuild配置 与 AppExtension#externalNativeBuild 配置区别
- 【错误记录】Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )
- 【Android Gradle 插件】SigningConfig 签名配置 ① ( SigningConfig 签名配置位置 | storeFile 配置 | storePassword 配置 )
- 【Android Gradle 插件】SigningConfig 签名配置 ③ ( storeType 配置 | v1SigningEnabled / v2SigningEnabled 配置 )
- 【Android Gradle 插件】DexOptions 配置 ① ( BaseExtension#dexOptions 脚配块配置 | DexOptions 属性配置简介 )
- 【Android Gradle 插件】DexOptions 配置 ⑤ ( additionalParameters 属性配置 | --minimal-main-dex 参数最小化主 dex 字节码 )
- 【Android Gradle 插件】LintOptions 配置 ① ( BaseExtension#lintOptions 配置 | LintOptions 配置简介 | lint 工具 )
- 【Android Gradle 插件】LintOptions 配置 ② ( abortOnError 配置 | 手动执行 lint 检查并生成 lint-result.html 检查报告 )
- 【Android Gradle 插件】PackagingOptions 配置 ④ ( pickFirsts、merges、excludes 属性配置 Set<String> 类型属性值常用配置方法 )
- 【Android Gradle 插件】 Splits 配置 ① ( BaseExtension#splits 配置 | Splits 配置简介 )
- 【Android Gradle 插件】TestOptions 配置 ② ( TestOptions#animationsDisabled 属性配置 | Android 工程本地化测试与设备化测试 )
- 【Android Gradle 插件】TestOptions 配置 ③ ( TestOptions#unitTests 脚本块配置 | UnitTestOptions 配置简介 )
- 【Android Gradle 插件】Gradle 依赖管理 ⑦ ( dependencies 传递依赖设置 | transitive 关闭依赖传递配置 | exclude 排除子依赖配置 )
- 【错误记录】Android Studio 编译报错 ( Could not resolve com.android.tools.build:gradle:7.4.2. )