升级Android Gradle Plugin至4.1.0后afterEvaluate未触发问题求助
解决AGP 4.1.0中subprojects内afterEvaluate不触发的问题
这个问题我之前帮同行排查过,AGP 4.1.x版本开始对Android插件的配置生命周期做了关键调整,原来在android块内嵌套afterEvaluate的写法不再可靠——因为Android插件本身的配置流程在升级后有了变化,导致嵌套的afterEvaluate无法被Gradle正确触发执行。
可行的修复方案
你需要把afterEvaluate从android块移到subprojects的根层级,同时增加Android插件的判断逻辑(避免非Android模块报错),具体修改后的代码如下:
subprojects { // 将afterEvaluate移至subprojects的直接子层级,确保Gradle能正确注册回调 afterEvaluate { project -> // 先判断当前子项目是否为Android项目(应用或库) def isAndroidProject = project.plugins.hasPlugin('com.android.application') || project.plugins.hasPlugin('com.android.library') if (isAndroidProject) { project.android.buildTypes.each { buildType -> final String suffix = buildType.name == 'release' ? '' : ".${buildType.name}" project.libraryApplicationIds.each { String constant, String libAppId -> buildType.buildConfigField "String", constant, "\"$libAppId$suffix\"" buildType.manifestPlaceholders[constant] = "$libAppId$suffix" } } } } }
失效原因说明
AGP 4.1.0开始优化了配置阶段的执行逻辑,android块本身是在项目配置过程中被解析的,嵌套在其中的afterEvaluate会因为Android插件内部的生命周期调整,无法被Gradle正确加入到项目的评估回调队列中。把afterEvaluate放到subprojects的直接层级,就能确保它被Gradle正确识别,在所有子项目评估完成后执行。
另外新增的插件判断是个实用的防御性编程习惯——如果你的项目里包含非Android模块(比如纯Java库),可以避免执行Android相关代码时抛出异常。
内容的提问来源于stack exchange,提问作者Radim Janda
相关产品推荐
相关产品推荐

