繁体   English   中英

在 Jenkins 上构建 Android 项目时,Gradle 构建守护进程意外消失(它可能已被杀死或崩溃)

[英]Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed) while building Android project on Jenkins

我有一个在 Android Studio 上成功构建的 Android 项目。

现在我想在 Jenkins 上构建它。 但是当我这样做时,出现以下错误:Gradle build daemon 意外消失(它可能已被杀死或可能已崩溃)

例外是:

org.gradle.launcher.daemon.client.DaemonDisappearedException: Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)
    at org.gradle.launcher.daemon.client.DaemonClient.handleDaemonDisappearance(DaemonClient.java:222)
    at org.gradle.launcher.daemon.client.DaemonClient.monitorBuild(DaemonClient.java:198)
    at org.gradle.launcher.daemon.client.DaemonClient.executeBuild(DaemonClient.java:162)
    at org.gradle.launcher.daemon.client.DaemonClient.execute(DaemonClient.java:125)
    at org.gradle.launcher.daemon.client.DaemonClient.execute(DaemonClient.java:80)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:43)
    at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:173)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:241)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:214)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:207)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:33)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:55)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:36)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)

我阅读了相关主题,但没有帮助。 我尝试使用 gradle daemon 构建它,但没有它,但问题仍然存在。

编辑看起来新版本的 Gradle 发生了一些变化。

从 3.0 开始,您不应再禁用 CI 上的守护进程

[我们] 建议对开发人员的机器和持续集成服务器使用 [守护程序]。

但是,如果您怀疑 Daemon 使您的 CI 构建不稳定,您可以禁用它以便为每个构建使用新的运行时,因为运行时与任何以前的构建完全隔离。

以前的答案

建议关闭任何 CI 服务器上的daemon 使用此选项禁用它

--no-daemon

发生此崩溃后,我尝试了几件事来让 GradleDaemon 停止在我的 CI 服务器上运行。 这些都没有奏效。

我在 gradle.org 论坛上找到了一个答案,该答案表明 GradleDaemon 无论如何都会运行。 --no-daemon 标志只会让它为这个特定的构建运行,而不是无限期地停留。

如果您指定需要分叉的 JVM 参数,Gradle 将分叉一个新的 JVM。 不管你是否想要一个守护进程,运行的类叫做 GradleDaemon。 --no-daemon 开关应该导致分叉进程是单一使用的,而不是长时间运行的守护进程,但它仍将运行 GradleDaemon 类。

来源: https ://discuss.gradle.org/t/no-daemon-switch-ineffective-if-jvm-settings-cause-new-fork/14919/5

我可能读错了,我不能保证答案的有效性,但我认为这个错误的原因只是 Gradle 内存不足。 因为它总是会运行 GradleDaemon。

所以我加了

org.gradle.jvmargs=-Xmx1024m 

到我的~/.gradle/gradle.properties文件,它不再给我那个错误。

这似乎是一个与内存相关的问题。 尽管如此,按照 Oleg 的建议禁用守护进程似乎确实有所帮助。

利用

org.gradle.daemon=false

gradle.properties

在 ~/.gradle 文件夹或项目文件夹中。

参考: https ://docs.gradle.org/current/userguide/gradle_daemon.html#sec:disabling_the_daemon

在我们的例子中,这个问题是由 CI 服务器使用非 ascii 字符(即提交作者的名字)传递环境变量引起的。

file.encoding=utf-8添加到 Gradle 属性立即解决了该问题。

gradle -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug

或者将org.gradle.jvmargs=-Xmx1536m添加到gradle.properties 文件中。

随着人们转向 GitHub 工作流和 GitHub Actions,这种类型的问题(Gradle 构建守护进程意外消失(可能已被杀死或崩溃))似乎变得越来越普遍。

在本地构建(命令行或 Android Studio)或在我们的 Jenkins 构建服务器上构建时,我们从未见过这个问题。 但是一旦我们开始通过 GitHub Workflows/Actions 测试构建,这种类型的构建错误就会间歇性地发生。

每个项目都是不同的,因此似乎有几种可能有效的解决方案。 在对我们的构建进行大量试验之后,唯一可靠地解决了这个问题的参数是“ -XX:MaxMetaspaceSize ”。

GRADLE_OPTS: -Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=1g"

在我们的案例中,不需要对 build.gradle、gradle.properties、gradle-wrapper.properties 等进行更改。 只是我们 GitHub 工作流 yaml 中的单个 GRADLE_OPTS 行。 Java 文档中的这种解释是最有帮助的(避免类元数据空间的无限增长)。

在 Java Hotspot VM 的先前版本中,类元数据是在所谓的永久代中分配的。 从 JDK 8 开始,永久代被删除,类元数据被分配在本地内存中。 默认情况下,可用于类元数据的本机内存量是无限的。 使用选项-XX:MaxMetaspaceSize对用于类元数据的本机内存量设置上限。

资料来源: https ://docs.oracle.com/en/java/javase/17/gctuning/other-considerations.html

GitHub 工作流的工作示例:

jobs:
  build:

    runs-on: ubuntu-latest

    env:
      GRADLE_OPTS: -Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=1g"

    steps:
    - uses: actions/checkout@v2
      with:
        ref: 'master'
        fetch-depth: 0

    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: gradle

    - name: Gradle Build
      uses: gradle/gradle-build-action@v2
      with:
        arguments: build -x lint appDistributionUploadRelease

Gradle build daemon disappeared unexpectedly意味着 gradle 本身甚至 java 崩溃。 就我而言,它是java 填写错误报告: https ://bugzilla.redhat.com/show_bug.cgi?id=1408857

查看名为: hs_err_pid%p.log的文件,其中 %p 是您运行gradle任务的目录中进程的 PID。

更新:看起来像gradle 本身的问题 在我的情况下,因为使用原生jansi 在问题中提供了解决方法:

ln -sb /dev/null /home/pasha/.gradle/native/jansi/1.17.1/linux64/libjansi.so

其他人可能不会遇到这种情况,因为这很愚蠢,但是...

我的问题是我的提交消息中出现了一个奇怪的字符......我从 gitlab 复制了一条包含表情符号的先前提交消息并将其粘贴到合并请求的标题中,而不是正常的:bug:语法。

akru 的回答帮助我指明了正确的方向🙏

哇,在我的情况下,关闭 Android Studio 并重新打开它工作得很好,错误就消失了。 :)

就我而言,删除org.gradle.parallel=true就可以了。

我的gradle.properties供您参考:

org.gradle.daemon=false
org.gradle.jvmargs=-Xmx3g -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
kotlin.compiler.execution.strategy=in-process

PS:我正在使用此配置通过 GitHub Actions (ubuntu-20.04) 运行 Android 工作流

我尝试了--no-daemon解决方案,但我的构建继续失败,并出现相同的DaemonDisappearedException

我通过增加运行 Jenkins 的服务器的 RAM 解决了这个问题。 在 AWS EC2 中,这意味着必须增加 EC2 实例类型,从而导致 RAM 增加。

有时只是做 Build -> Clean Project 工作 - 在开始其他 gradle 文件更改之前尝试一下。

我有同样的问题,最后在 gradle 文件中缺少一个参数

基本上,这是一个 kotlin 项目,其中使用了一些实验性的协程功能。 使用它的类标有

@OptIn(FlowPreview::class) 

这需要在 build.gradle 中添加以下参数,尽管它在本地的 android studio 中运行得很好

kotlinOptions {
        jvmTarget = "1.8"
        freeCompilerArgs = [ "-Xopt-in=kotlin.RequiresOptIn"]
    }

花了很多时间寻找这个

大多数情况下,您只需要重新启动 Android Studio 即可。 您还可以执行以下操作:文件 -> 使用 Gradle 文件同步项目,然后文件 -> 无效缓存/重新启动。

我在 Windows 7 中使用 Android Studio,然后出现了这个错误。 对我有用的是从 Windows TaskManager 中杀死 Java.exe。

就我而言,我正在升级我的 android studio 项目,我使用ZelixKlassMaster来混淆我的代码问题是,我将 Zelix 上的类路径设置为27 ,但我的项目使用的是 android 28希望这将有助于任何未来的人我调试的方式是我的seed文件打印出这个错误

ERROR: Invalid classpath in "classpath" statement at line 69 : "C:\Users\Rab\AppData\Local\Android\Sdk\platforms\android-27\android.jar" is not a valid path.

在组装任务之前。

./gradlew --status

检查守护进程状态。

然后

./gradlew --stop

停止守护进程。

利用

./gradlew assemblerelease  --no-daemon -Dkotlin.compiler.execution.strategy="in-process"

禁用守护程序。

添加gradle.properties文件。

org.gradle.daemon=true <br>
org.gradle.jvmargs=-Xmx1024m <br>
android.useDeprecatedNdk=true <br>
android.useAndroidX=true <br>
android.enableJetifier=true <br>
file.encoding=utf-8

我在 gradle.properties 文件中添加了同样的问题

android.useAndroidX=true
android.enableJetifier=true
org.gradle.jvmargs = -Xmx2g

我遇到了同样的问题,经过长时间的斗争,我删除了一些文件并在内存中获得了一些可用空间。 然后重新启动了android studio,现在它可以正常工作了。

此处发布的所有解决方案均不适用于我的 Mac。 我尝试删除.gradle目录和项目目录下.gradle目录下的锁定文件,然后我尝试另外删除~/.gradle/caches ,退出尽可能多的进程以腾出空间并将守护进程的-Xmx设置为 4GB,使确定不存在其他 Java 进程,但这些都没有帮助。 我什至尝试吹掉.gradle目录和项目目录中的.gradle目录。 很难相信,但它在重新启动操作系统后又开始工作了。 我在这个项目中使用 gradle 构建已经超过 2 年了,这是第一次发生这种情况,所以也许这与 Mac 而非 gradle 有关。 作为参考,我使用的是macOS 10.15.7并采用使用Brew安装的adoptopenjdk-14.jdk

我在 GitHub Actions 中遇到了同样的问题。 正如其他答案所提到的,这似乎是一个内存问题。

以下设置对我来说非常适合 GitHub Ubuntu 运行器(无需禁用守护程序):

# ...
env:
  GRADLE_OPTS: -Dkotlin.incremental=false -Dorg.gradle.jvmargs="-Xmx4g -XX:MaxMetaspaceSize=2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8"
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # ...
      - name: Build app
        run: ./gradlew assembleRelease --stacktrace

就我而言,我使用 Docker 在本地运行来自 Github 操作的 Gradle 任务。

我不得不增加 docker 内存,它奏效了!

我在 Docker 中遇到了同样的错误,我尝试设置 org.gradle.daemon=false 和上述所有方式,但它不起作用。 最后,我将 gradle 更新到 6.5 版,将 android gradle 插件更新到 4.1.0 版。 然后错误消失了。

这就是它对我的工作方式:

启用 gradle 守护程序(这是 gradle 7 的默认设置)。

org.gradle.daemon=false

安装 Jenkins 插件: https ://plugins.jenkins.io/gradle-daemon/

如果另一个构建仍在使用它,插件将阻止杀死守护进程。

转到/gradle.properties然后删除org.gradle.jvmargs=-Xmx1024m ,如果org.gradle.jvmargs=-Xmx1024m不可用,则将此代码添加到您的/gradle.properties中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM