Flutter接入AppCenter(Gradle4.0+)构建因clean步骤引发libs.jar缺失报错
Flutter接入AppCenter构建异常应对方案
核心问题链路
- 自定义
appcenter-post-clone.sh脚本提前生成appCenterDebugflavor对应的Flutter中间产物libs.jar,存储路径为自定义根构建目录../build/app/intermediates/flutter/appCenterDebug/ - AppCenter默认拼接的Gradle执行命令携带
clean任务,会全量删除上述自定义构建目录下的所有中间文件 - 后续执行
:app:lintVitalAppCenterRelease任务时,JetifyTransform流程依赖已被删除的debug中间jar文件,触发文件不存在的报错
验证结论:本地复现确认带
clean的全量Gradle命令可稳定触发报错,跳过clean、按顺序生成双flavor中间产物后再执行lint与assemble任务,构建流程可正常完成。
构建报错根治方案
- 调整Flutter构建动作的触发时机
- 移除
appcenter-post-clone.sh脚本中手动执行flutter build的相关逻辑,将Flutter侧的产物生成逻辑完全交回Gradle插件的任务调度链 - 确保Gradle在执行
clean任务后、执行:app:lintVitalAppCenterRelease任务前,自动触发对应debug flavor的Flutter编译流程,生成需要的libs.jar文件,从根源上避免clean删除未重建的产物
- 移除
- 缩小
clean任务的清理边界- 由于项目自定义根构建目录为
../build,可在根目录build.gradle中自定义clean任务的删除规则,排除Flutter中间产物目录:
tasks.named('clean') { delete rootProject.buildDir exclude 'intermediates/flutter/**' }- 配置后
clean任务仅删除其余构建目录内容,不会清除Flutter编译生成的中间jar文件
- 由于项目自定义根构建目录为
- 临时兜底适配
- 在
appcenter-post-clone.sh脚本中,将已生成的appCenterDebug/libs.jar文件备份到项目工作区的非构建目录(如项目根目录下的.flutter_cache文件夹) - 在app模块
build.gradle的afterEvaluate块中添加逻辑,在所有Gradle任务执行前,自动将备份的jar文件还原回原中间路径,满足JetifyTransform的读取要求
- 在
AppCenter自动拼接Gradle命令修改(移除冗余clean步骤)
- 标准配置入口定位
- 打开AppCenter对应项目的「构建」配置页,进入目标分支的构建设置面板,开启页面的高级模式开关
- 滑动到设置页最下方的「构建脚本」板块,找到**「Gradle 参数」输入框**,该字段即为平台自动拼接Gradle执行命令的参数配置位,默认配置值为
clean assemble
- 直接移除clean的操作
- 将「Gradle 参数」输入框中的默认值从
clean assemble修改为assemble,保存配置后重新触发构建,平台生成的最终Gradle执行命令将不再包含clean步骤
- 将「Gradle 参数」输入框中的默认值从
- 找不到配置入口的兜底拦截方案
- 在
appcenter-post-clone.sh脚本最后追加配置,通过Gradle任务拦截机制,直接禁用传入的clean任务:
echo "tasks.named('clean') { enabled = false }" >> build.gradle- 配置生效后,即使平台传入
clean参数,Gradle流程也会直接禁用该任务,不会触发构建目录删除动作
- 在
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

