只要 apply from: 'config.gradle' 这行代码被读到,config.gradle 里的代码就会被立即执行。
详细解释为什么
Gradle 的生命周期分为三个阶段,这对于理解脚本执行时机非常重要:
-
初始化阶段 (Initialization) : Gradle 决定有哪些项目参与构建(读取
settings.gradle) -
配置阶段 (Configuration) ------ 重点在这里:
- 当点击 Sync (大象图标)或者点击 Run (绿色三角形)时,Gradle 必须先执行这个阶段。
- 在这个阶段,Gradle 会把所有的
build.gradle文件从头到尾执行一遍,为了搞清楚项目有哪些依赖、版本号是多少、有哪些 Task 等等。 - 当根目录的
build.gradle执行到apply from: 'config.gradle'这一行时,它会立即跳转 去执行config.gradle的全部内容。 - 因此,
ext { ... }里的buildNum = getAndIncrementBuildNum()会被立即调用
-
执行阶段 (Execution):
- 只有当你真正编译(Run/Assemble)时才会进入这个阶段。这里才是真正执行编译 Java/Kotlin 代码、打包 APK 的地方
这对 buildNum 意味着什么?
正因为 config.gradle 在 Sync 阶段(配置阶段)就会被执行,所以在写自增逻辑时必须非常小心:
-
如果不加判断 : 每次点击 Sync,或者修改了
build.gradle自动刷新,getAndIncrementBuildNum()就会跑一遍,导致version.properties里的数字莫名其妙一直增加。 -
加了
taskNames判断后:- Sync 时 :Gradle 执行
config.gradle-> 调用getAndIncrementBuildNum()-> 获取到taskNames是空的(或者只是 generate 任务) -> 代码逻辑判断不满足条件 -> 只读取旧值,不执行+1写入操作。 - 打包/Run 时 :Gradle 执行
config.gradle-> 调用getAndIncrementBuildNum()-> 获取到taskNames包含 "assemble" -> 代码逻辑满足条件 -> 执行+1并写入文件。
- Sync 时 :Gradle 执行
关于代码位置
在 root/build.gradle 中写的:
groovy
buildscript {
apply from: 'config.gradle' // <--- 就在这一行
// ...
}
这行代码让 config.gradle 成为了构建脚本的一部分。一旦执行到这里,config.gradle 里的 ext 变量就会被加载到内存中,供后面的 allprojects 或者 app/build.gradle 使用
总结
- 执行了吗? 是的,每次 Sync 或 Build 必执行
- 为什么看不到效果? 之前是因为只有在
release任务时才写入文件,而可能是在点Run(debug) 或者Sync,导致逻辑走进了else分支(不保存) - 现在的解决办法 :它通过检测
taskNames来区分"仅仅是 Sync"还是"真正的打包/运行",从而决定是否要增加版本号