将Android Gradle Plugin从4.1.3升级至7.0.4后,CI环境运行lintDebug时Gradle守护进程崩溃求助
我之前在把Android Gradle Plugin(AGP)从4.x升级到7.0.x版本、同步升级lint工具时,也碰到过和你完全一样的Gradle守护进程崩溃问题,试过那个Google Issue里的配置也没解决,后来通过几个调整搞定了,分享给你:
1. 清理无效JVM参数,优化内存配置
你的gradle.properties里有个无效参数:-XX:MaxPermSize=1024m,这个参数是Java 7及以前的产物,Java 8+已经用Metaspace替代了PermGen,这个参数会被JVM直接忽略,建议删掉。
另外,CI环境的资源通常比本地机器紧张,设置过大的堆内存(比如-Xmx8g)反而可能触发系统的OOM Killer杀掉守护进程。可以尝试调整JVM参数到更适配CI机器的数值,比如:
org.gradle.jvmargs=-Xmx4g -Xms512M -XX:MaxMetaspaceSize=2g -Dkotlin.daemon.jvm.options="-Xmx4g" -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -Dfile.encoding=UTF-8
核心调整点:
- 降低堆内存上限到4g(可根据CI机器实际内存微调,比如机器总内存8g的话,给Gradle分配4g比较合理)
- 把MetaspaceSize提升到2g,AGP7.x和Kotlin编译对元空间的需求比旧版本更高
- 去掉无用的
-XX:+UnlockExperimentalVMOptions,除非你明确需要启用实验性JVM特性
2. 禁用可能冲突的Gradle特性
CI环境是一次性构建,不需要一些本地开发的优化特性,关掉它们能减少资源占用和兼容性问题:
- 暂时关闭
org.gradle.configureondemand=true:这个特性在AGP7.x升级初期容易出现配置不一致的问题,进而导致守护进程崩溃 - 关闭
org.gradle.unsafe.watch-fs=true:CI环境不需要文件系统监听,这个特性会额外消耗系统资源
修改后的相关配置片段:
# org.gradle.configureondemand=true // 暂时注释掉 org.gradle.parallel=true org.gradle.workers.max=4 # org.gradle.unsafe.watch-fs=true // 注释掉
3. 调整Lint运行配置(替代experimental参数)
你试过的experimental参数在AGP7.0.x可能已经不再生效,建议直接在模块的build.gradle里配置Lint的内存和运行模式:
android { lintOptions { // 强制Lint在单独进程运行,避免和Gradle守护进程共享内存 checkAllWarnings true abortOnError true // 给Lint分配单独的堆内存 heapSize = "2g" // 可选:禁用一些非必要且内存占用高的Lint检查(根据项目需求调整) disable 'OldTargetApi' } }
4. 检查CI环境的资源限制
很多时候守护进程崩溃是因为CI机器内存不足,被系统的OOM Killer强制杀掉了。你可以查看CI的系统日志,看看有没有类似Out of memory: Kill process的记录:
- 如果CI机器总内存小于8g,那你之前设置的
-Xmx8g肯定会导致内存过载,必须调低 - 可以在CI构建前增加内存检查命令,比如
free -m,确认机器可用内存情况
5. 升级到AGP和Gradle匹配的稳定版本
虽然AGP7.0.4和Gradle7.3.3是兼容的,但有时候小版本升级能修复已知的守护进程崩溃bug:
- 你当前用的AGP7.0.4已经是该分支的最新稳定版,可以尝试升级Gradle到7.4.2(AGP官方推荐的Gradle版本范围是7.0+,7.4.2是更稳定的迭代版本)
我当时是通过调整JVM参数+关闭configureondemand解决的问题,你可以逐个尝试这些方案,应该能解决守护进程崩溃的问题。
内容的提问来源于stack exchange,提问作者Subodh Nijsure

