Gradle脚本执行

只要 apply from: 'config.gradle' 这行代码被读到,config.gradle 里的代码就会被立即执行。

详细解释为什么

Gradle 的生命周期分为三个阶段,这对于理解脚本执行时机非常重要:

  1. 初始化阶段 (Initialization) : Gradle 决定有哪些项目参与构建(读取 settings.gradle

  2. 配置阶段 (Configuration) ------ 重点在这里

    • 当点击 Sync (大象图标)或者点击 Run (绿色三角形)时,Gradle 必须先执行这个阶段。
    • 在这个阶段,Gradle 会把所有的 build.gradle 文件从头到尾执行一遍,为了搞清楚项目有哪些依赖、版本号是多少、有哪些 Task 等等。
    • 当根目录的 build.gradle 执行到 apply from: 'config.gradle' 这一行时,它会立即跳转 去执行 config.gradle 的全部内容。
    • 因此,ext { ... } 里的 buildNum = getAndIncrementBuildNum() 会被立即调用
  3. 执行阶段 (Execution)

    • 只有当你真正编译(Run/Assemble)时才会进入这个阶段。这里才是真正执行编译 Java/Kotlin 代码、打包 APK 的地方

这对 buildNum 意味着什么?

正因为 config.gradleSync 阶段(配置阶段)就会被执行,所以在写自增逻辑时必须非常小心:

  • 如果不加判断 : 每次点击 Sync,或者修改了 build.gradle 自动刷新,getAndIncrementBuildNum() 就会跑一遍,导致 version.properties 里的数字莫名其妙一直增加。

  • 加了 taskNames 判断后

    1. Sync 时 :Gradle 执行 config.gradle -> 调用 getAndIncrementBuildNum() -> 获取到 taskNames 是空的(或者只是 generate 任务) -> 代码逻辑判断不满足条件 -> 只读取旧值,不执行 +1 写入操作
    2. 打包/Run 时 :Gradle 执行 config.gradle -> 调用 getAndIncrementBuildNum() -> 获取到 taskNames 包含 "assemble" -> 代码逻辑满足条件 -> 执行 +1 并写入文件

关于代码位置

root/build.gradle 中写的:

groovy 复制代码
buildscript {
    apply from: 'config.gradle' // <--- 就在这一行
    // ...
}

这行代码让 config.gradle 成为了构建脚本的一部分。一旦执行到这里,config.gradle 里的 ext 变量就会被加载到内存中,供后面的 allprojects 或者 app/build.gradle 使用

总结

  1. 执行了吗? 是的,每次 Sync 或 Build 必执行
  2. 为什么看不到效果? 之前是因为只有在 release 任务时才写入文件,而可能是在点 Run (debug) 或者 Sync,导致逻辑走进了 else 分支(不保存)
  3. 现在的解决办法 :它通过检测 taskNames 来区分"仅仅是 Sync"还是"真正的打包/运行",从而决定是否要增加版本号
相关推荐
漏刻有时4 小时前
PHP GeoJSON转PNG地图渲染程序开发笔记、源码解读、问题复盘与整改方案
android·笔记·php
-SOLO-5 小时前
解决VMware 显示比例被重置的问题
android
alexhilton5 小时前
探究Android Views、Flutter和Compose如何渲染你的UI
android·kotlin·android jetpack
Lesile8 小时前
Android:Hilt框架入门 · 在ViewUI和ComposeUI下的应用
android·android jetpack
用户423816229078 小时前
Android 16 WebView 页面顶部挖孔/通知栏不能显示UI问题排查
android
weixin_727535629 小时前
Loop 已死,Graph 新生:AI 工作流的范式革命
android·人工智能·rxjava
严同学正在努力10 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
梦想三三10 小时前
LangChain Output Parser 实战:从字符串到结构化数据的完整指南
android·服务器·langchain·github·uv
爱笑鱼13 小时前
Binder(八):远端进程死了,BinderProxy 为什么还能收到通知?
android
Android-Flutter13 小时前
Kotlin 冷流与热流详解
android·kotlin