升级Flutter 2.28.1后CircleCI中flutter build APK仅开启SSH时成功的问题排查及Gradle参数传递疑问
一、如何给Flutter的Gradle构建传递参数
当你执行flutter build apk时,想要传递--stacktrace、--info这类Gradle参数,可以通过以下几种方式实现:
- 使用
--gradle-option参数
Flutter CLI支持直接通过--gradle-option将参数传递给Gradle,多次添加该参数即可传递多个选项:
flutter build apk --build-name ${CIRCLE_BUILD_NUM} --build-number ${CIRCLE_BUILD_NUM} --release -t lib/main_dev.dart --gradle-option="--stacktrace" --gradle-option="--info"
- 通过环境变量传递JVM参数
如果需要调整Gradle的JVM参数,可以设置GRADLE_OPTS环境变量,比如在CircleCI的run命令中添加:
- run: name: Package APK command: | export GRADLE_OPTS="-Xmx2048M --stacktrace" echo "==> Dev Build $CIRCLE_BUILD_NUM <==" cd .. echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > ./upload-keystore.jks flutter build apk --build-name ${CIRCLE_BUILD_NUM} --build-number ${CIRCLE_BUILD_NUM} --release -t lib/main_dev.dart environment: KEY_STORE_FILE: /home/circleci/workforce/upload-keystore.jks
- 修改项目的
gradle.properties文件
直接在项目的android/gradle.properties中添加或修改参数,比如:
org.gradle.jvmargs=-Xmx2048M --stacktrace org.gradle.debug=true
二、排查Gradle Daemon意外消失的问题
根据你的描述,SSH连接后执行命令能成功,但正常CircleCI任务频繁失败,大概率是资源限制或环境差异导致的,以下是具体排查建议:
升级CircleCI资源配置:默认的CircleCI容器内存可能不足以支撑Flutter+Gradle的构建需求。你可以在CircleCI配置中指定更大的资源类(比如
medium或large),同时调整gradle.properties中的org.gradle.jvmargs内存上限,比如从-Xmx1536M提升到-Xmx2048M甚至-Xmx3072M。检查系统级OOM日志:Gradle Daemon消失很可能是被系统的OOM Killer(内存不足杀手)杀死了。你可以在SSH连接到CircleCI容器后执行
dmesg命令,查看是否有out of memory相关的日志;或者在CircleCI任务的"System"标签页查看系统日志,确认是否存在内存不足的情况。临时禁用Gradle Daemon:为了验证是否是Daemon本身的问题,可以临时禁用它。在CircleCI的build命令前添加
export GRADLE_OPTS="-Dorg.gradle.daemon=false",或者修改gradle.properties添加org.gradle.daemon=false,然后重新运行任务,如果不再报错,说明Daemon的运行环境有问题。对比环境变量差异:正常任务和SSH成功执行时的环境变量可能存在差异。你可以在失败的任务中添加
env命令输出所有环境变量,然后和SSH连接后的env输出对比,重点检查KEY_STORE_FILE、JAVA_HOME、GRADLE_OPTS等相关变量是否一致。清理缓存:CircleCI的缓存可能存在损坏的情况,导致构建异常。尝试在build命令前添加
flutter clean和rm -rf ~/.gradle/caches命令,或者在CircleCI配置中暂时禁用缓存,重新运行任务。更新Gradle版本:Flutter 2.8.1可能对Gradle版本有特定要求,尝试将项目的Gradle版本更新到Flutter推荐的稳定版。比如修改
android/build.gradle中的classpath 'com.android.tools.build:gradle:7.0.4'(或对应Flutter版本的推荐版本),并更新android/gradle/wrapper/gradle-wrapper.properties中的distributionUrl到对应的Gradle版本。调整并行构建设置:如果项目开启了Gradle并行构建,可能会加剧资源消耗。可以在
gradle.properties中添加org.gradle.parallel=false,关闭并行构建后测试是否解决问题。
内容的提问来源于stack exchange,提问作者Boiler Bill

