Gradle翻译——Gradle Daemon(守护进程)

第6章 Gradle守护进程

原文
欢迎关注公众号:Glide風
这里写图片描述
目录

6.1 启用守护进程
6.2 停止现有的守护进程
6.3 常问问题
6.4 何时不应该使用Gradle守护进程?
6.5 工具和IDE
6.6 Gradle Daemon如何更快地构建?

From Wikipedia…

守护进程是一种作为后台进程运行的计算机程序,而不是由交互式用户直接控制。

Gradle在Java虚拟机(JVM)上运行,并使用一些支持库,这些库需要一定的初始化时间。因此,有时候看起来有点慢。解决这个问题的方法是启用Gradle Daemon(Daemon:一个长期的后台进程,比其他情况下执行你的构建要快得多)。我们通过避免昂贵的引导过程以及利用缓存来实现这一点,将有关项目的数据保存在内存中。运行Gradle与守护进程构建没有区别,进行简单地配置后无论你是否要使用它 都将由Gradle自行的处理。

6.1 启用守护进程

Gradle Daemon在默认情况下是不启用的,但是我们建议开发者的设备始终启用它(但是对于持续集成服务器,将其禁用)。启用守护进程有几种方法,但最常见的方法是添加该行

org.gradle.daemon =true

到文件/.gradle/gradle.properties下进行配置, 所在位置取决于您的系统,通常如下:

  • C:\Users\ (Windows Vista&7+
  • /Users/ (Mac OS X)
  • /home/ (Linux)

注:<USER_HOME>为当前用户的主目录,比如:C:\Users\Administrator那么这个<USER_HOME>指的就是Administrator。

如果该文件不存在,只需使用文本编辑器创建。您可以在下面的FAQ中找到启用(和禁用)守护进程的其他方法的详细信息。该部分还包含关于守护进程如何工作的更多详细信息。

一旦以这种方式全局启用了守护进程,不管特定构建使用的Gradle版本如何,所有的构建速度都将提升。

6.2 停止现有的守护进程

如前所述,守护进程是一个后台进程。但是,您不需要担心该后台进程对性能的影响,每个守护进程在三小时不活跃的情况下会自行停止。如果您因为一些原因想要停止守护进程,请使用该命令为:gradle –stop

这将终止所有用于执行命令的相同版本的Gradle启动的守护进程。如果安装了Java Development Kit(JDK),则可以通过运行jps命令轻松验证守护程序是否已停止。您将看到任何正在运行的名为GradleDaemon的守护进程。

6.3 常问问题

6.3.1 启用Gradle Daemon的方法有哪些?
有两种建议的方式来持续为一个环境启用守护进程:

  • 通过环境变量 - 将标志添加-Dorg.gradle.daemon=true到GRADLE_OPTS环境变量
  • 通过属性文件 -添加org.gradle.daemon=true到/gradle.properties文件
请注意,<GRADLE_USER_HOME>默认为<USER_HOME>/.gradle,<USER_HOME>为当前用户的主目录,此位置可以通过-g和--gradle-user-home命令行开关以及GRADLE_USER_HOME环境变量和org.gradle.user.homeJVM系统属性进行配置。

两种方法都有相同的效果,根据个人喜好来使用。大多数Gradle用户选择第二种方法,并将条目添加到用户gradle.properties文件。
在Windows上,启用命令为:

(if not exist "%USERPROFILE%/.gradle" mkdir "%USERPROFILE%/.gradle") && (echo org.gradle.daemon=true >> "%USERPROFILE%/.gradle/gradle.properties")  

也就相当于,在C:\Users\.gradle文件下的gradle.properties(如果没有进行创建)中配置echo org.gradle.daemon=true
在Linux环境下

touch ~/.gradle/gradle.properties && echo "org.gradle.daemon=true" >> ~/.gradle/gradle.properties  

一旦以这种方式为构建环境启用了守护进程,所有构建都将隐式使用Daemon。
在个人的构建使用命令行界面时可以调用–daemon和–no-daemon命令行开关来启用和禁用守护程序。通常情况下,为一个环境(比如一个用户账号)启用守护进程会更方便,这样所有的版本都可以使用守护进程而不需要记住提供–daemon交换机

6.3.2 我如何禁用Gradle守护进程?
Gradle守护进程默认是不启用的。但是,一旦启用,有时需要禁用某些项目或某些构建时可以使用–no-daemon命令行开关进行强制禁用

该命令行很少使用,但是在调试某些构建或者Gradle插件的问题时有时会很有用。考虑到构建环境,该命令行开关的优先级最高。

6.3.3 如何抑制“please consider using the Gradle Daemon”消息?

Gradle可能会在构建结束时发出警告,提示您使用Gradle守护程序。为了避免这个警告,你可以通过上面的方法来启用守护进程,或者明确禁用守护进程。你可以明确地通过使用禁用守护进程–no-daemon如上所述命令行开关,或着开启的方法之一,但org.gradle.daemon属性的值应为false,而不是true。

由于不建议使用守护进程连续集成构建,所以如果CI环境变量存在,Gradle将不会发出消息。

6.3.4 为什么我的机器上有多个守护进程?

Gradle将创建一个新的守护进程有几个原因,而不是使用已经运行的守护进程。基本规则是:如果没有可用的空闲或兼容的守护进程,Gradle将启动一个新的守护进程。Gradle会杀死已经闲置3个小时以上的守护进程,所以你不必担心手动清理它们。


一个空闲的守护进程是一个目前没有执行构建或做其他有用的工作。

兼容
一个兼容的守护进程是可以(或可以做到)满足所要求的构建环境的要求的守护进程。用于执行构建的Java运行时是构建环境的示例方面。另一个示例是构建运行时所需的一组JVM系统属性。

守护进程可能无法满足所请求的构建环境的某些方面。如果守护程序正在Java 7环境下运行,但所请求的环境需要Java 8,则守护进程不兼容,必须启动另一个。而且,一旦JVM启动,Java运行时的某些属性就不能被改变。例如不能改变-Xmx1024m正在运行的JVM 的内存分配,默认文本编码,缺省语言环境等。

“requested build environmen”通常是由构建客户端(例如Gradle命令行客户端,IDE等)环境以及通过命令行开关和设置明确构建的。有关如何指定和控制构建环境的详细信息,请参见第11章 “构建环境”

以下JVM系统属性实际上是不可变的。如果请求的构建环境需要这些属性中的任何一个,并且当 Daemon的JVM所具有的属性值与其不同时,则守护程序将不兼容。

  • file.encoding
  • user.language
  • user.country
  • user.variant
  • java.io.tmpdir
  • javax.net.ssl.keyStore
  • javax.net.ssl.keyStorePassword
  • javax.net.ssl.keyStoreType
  • javax.net.ssl.trustStore中
  • javax.net.ssl.trustStorePassword中
  • javax.net.ssl.trustStoreType
  • com.sun.management.jmxremote

    以下由启动参数控制的JVM属性也是不可变的。所请求的构建环境和守护进程环境的相应属性必须完全匹配,以使守护进程兼容。

  • 最大堆大小(即-Xmx JVM参数)
  • 最小堆大小(即-Xms JVM参数)
  • 引导类路径(即-Xbootclasspath参数)
  • “断言”状态(即-ea参数)

Gradle版本和编译环境的版本不同是另一个方面。守护进程耦合到特定的Gradle运行时,在使用不同Gradle版本的会话期间处理多个Gradle项目是拥有多个运行中的守护进程的常见原因。

6.3.5 Daemon 使用多少内存,我可以给它多一点?
如果请求的构建环境没有指定最大堆大小,守护进程将使用最多1GB的堆。它将使用您的JVM的默认最小堆大小。1GB对于大多数版本来说已经足够了。更大的构建与数百个子项目,大量的配置和源代码可能需要,或性能更好,更多的内存。

要增加守护程序可以使用的内存量,请将相应的标志指定为所请求的生成环境的一部分。有关详细信息,请参阅第11章“构建环境 ”

6.3.6 我怎样才能停止Daemon ?

不活动3小时后,守护进程将自动终止。如果您希望在此之前停止守护进程,则可以通过操作系统终止进程或运行gradle –stop命令。该–stop开关使得Gradle请求运行该命令的相同Gradle版本的所有正在运行的Daemon进程自行终止。

6.3.7 Daemon 有什么问题?
在守护进程日益发展的过程中,相当大的工程努力已经使守护进程变得健壮,透明和不显眼。但是,守护进程偶尔会被损坏或耗尽。Gradle构建执行来自多个源的任意代码。虽然Gradle本身是专门为Daemon设计的并且经过严格测试,但是用户构建脚本和第三方插件可能会通过内存泄漏或全局状态损坏等缺陷来破坏守护进程的稳定性。

通过运行不能正确释放资源的构建,也可能会破坏守护进程的稳定性(通常会构建环境)。在使用Microsoft Windows时,这是一个特别棘手的问题,因为它对读取或写入后无法关闭文件的程序宽容。

Gradle会主动监视堆的使用情况,并尝试检测泄漏是否开始耗尽守护进程中可用的堆空间。当它检测到堆空间的问题时,Gradle守护进程将完成当前正在运行的构建,并在下一个构建中重新启动守护进程。此监视默认启用,但可以通过将org.gradle.daemon.performance.enable-monitoring系统属性设置为false 来禁用。

如果怀疑守护进程变得不稳定,可能会被简单地杀死。回想一下,–no-daemon可以为构建指定开关,以防止使用守护进程。这对于诊断守护进程是否真的是问题的罪魁祸首可能是有用的

6.4 何时不应该使用Gradle守护进程?

建议在所有开发人员环境中使用守护进程并且不要启用用于持续集成的守护进程并构建服务器环境。

守护进程使构建更快,当人坐在构建前面时,这一点尤为重要。对于CI构建,稳定性和可预测性是至关重要的。对于每个构建使用全新的运行时(即进程)更加可靠,因为运行时与以前的构建完全隔离

6.5 工具和IDE
IDE和其他工具用于与Gradle集成 的Gradle Tooling API(请参阅第13章,使用Tooling API嵌入Gradle)始终使用Gradle Daemon来执行构建。如果从内部执行Gradle构建,则您使用的是Gradle守护程序,无需为您的环境启用它。

但是,除非您为您的环境明确启用了Gradle守护程序,否则命令行中的构建不会使用Gradle守护程序。

6.6 Gradle Daemon如何更快地构建?
Gradle守护进程是一个长期的构建过程。在构建之间,它等待下一个构建。这具有明显的好处,只需要将Gradle一次加载到多次构建中,而不是每次构建一次。这本身就是一个重要的性能优化,但这并不是停止的地方。

现代JVM性能的一个重要部分是运行时代码优化。例如,HotSpot(Oracle提供的用作OpenJDK基础的JVM实现)在代码运行时对其进行优化。优化是渐进的而不是瞬时的。也就是说,代码在执行过程中被逐步优化,这意味着后续的构建可以更快地完成,纯粹是由于这个优化过程。HotSpot的实验表明,它需要5到10之间的构建优化来稳定。守护程序的第一次构建和第十次构建时间之间的差异可能相当大。

守护进程还更有效的允许跨内存缓存。例如,构建所需的类(例如,插件,构建脚本)可以在构建之间保存在内存中。同样,Gradle可以维护内存缓存的构建数据,如任务输入和输出的散列,用于增量构建。

6.6.1 潜在的未来增强

目前,守护进程通过有效地支持内存缓存以及JVM优化器使代码更快,使构建更快。在未来的Gradle版本中,守护进程将变得更加智能,并且抢先进行工作。例如,假定构建即将运行,并且将需要新更改或添加的依赖关系,它可以在编译构建脚本之后立即开始下载依赖关系。

Gradle Daemon还有很多其他的方法可以在未来的Gradle版本中实现更快的构建

<think>好的,用户遇到了Android Studio中Gradle卡在Starting Gradle Daemon的问题,需要解决。首先,我得回忆一下相关的解决方案。根据之前的引用内容,特别是引用3和引用4,用户可能已经尝试过调整环境变量中的Java版本,修改仓库地址或者添加镜像源。不过我需要结合常见的解决方法,系统地整理步骤。 首先,Gradle卡住通常和网络问题、Gradle配置、JDK版本或资源不足有关。用户提到环境变量中将Java 1.8优先级调高,这可能是因为Gradle版本与JDK不兼容。需要确认项目所需的Gradle插件版本对应的JDK版本,比如新版本的Gradle可能需要JDK 11或更高,而旧项目可能还在用JDK 8。这里可能存在混淆,用户可能错误地降级了JDK导致问题。 其次,检查Gradle的配置,比如是否使用了正确的镜像仓库,比如阿里云的maven镜像,这样可以加速依赖下载。引用4中提到添加mavenCentral()、jcenter()等,但有时候这些仓库可能访问慢,换成国内镜像会更好。 另外,Gradle Daemon的启动问题也可能与内存设置有关,调整gradle.properties中的内存参数,比如增大Xmx值,可能有助于解决卡顿。还有可能是Gradle缓存损坏,需要清理缓存或重新生成项目。 另外,用户可能没有正确配置离线模式,或者项目中的Gradle版本与本地不匹配,导致重复下载。检查Gradle Wrapper的配置,确保使用的Gradle版本与插件兼容,引用1中提到插件和Gradle版本需要匹配。 还有可能防火墙或代理设置阻止了Gradle的正常连接,需要检查网络设置或尝试关闭代理。另外,用户可能没有正确配置SDK路径或者JDK路径,导致Gradle无法正常启动Daemon,引用3中提到重新设置JDK路径可能有帮助。 综合这些可能性,我需要分步骤给出解决方案,从最简单的网络配置开始,逐步深入。同时需要提醒用户检查版本兼容性,清理缓存,调整内存设置等。可能还需要指导如何修改Gradle文件,添加镜像源,或者调整JDK设置。确保用户能逐步排查问题,找到适合自己的解决方法。</think>### 逐步解决方案:Android Studio Gradle 卡在 "Starting Gradle Daemon" 以下是分步骤的解决方案,按优先级排序: #### 1. **检查JDK版本兼容性** - **现象**:Gradle Daemon 启动失败可能与JDK版本不匹配有关(例如项目需要JDK 11+但环境变量中优先级最高的是JDK 1.8)。 - **操作**: 1.Android Studio中,打开 `File > Project Structure`,检查项目使用的JDK路径是否与Gradle版本兼容[^3]。 2. 在终端输入 `java -version` 确认当前环境变量中的JDK版本。若需切换版本,调整环境变量优先级或通过Android Studio手动指定JDK路径(例如设为JDK 11或17)[^3]。 #### 2. **配置国内镜像加速依赖下载** - **现象**:因网络问题导致Gradle无法下载依赖。 - **操作**: 1. 修改项目根目录的 `build.gradle`,在 `repositories` 中添加阿里云镜像: ```groovy allprojects { repositories { maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/google' } mavenCentral() google() } } ``` 2. 同步后若仍卡顿,尝试在 `gradle.properties` 中添加代理配置(如有需要)[^4]。 #### 3. **清理Gradle缓存** - **现象**:缓存损坏导致Daemon无法启动。 - **操作**: 1. 关闭Android Studio,手动删除以下目录: - Windows: `C:\Users\<用户名>\.gradle\caches` - macOS: `~/.gradle/caches` 2. 重新打开项目,等待Gradle重新下载依赖。 #### 4. **调整Gradle内存配置** - **现象**:内存不足导致Daemon启动缓慢。 - **操作**: 1. 在项目根目录的 `gradle.properties` 中添加: ```properties org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m ``` 2. 重启Android Studio并同步项目。 #### 5. **强制使用离线模式(临时)** - **现象**:依赖下载失败时快速验证问题。 - **操作**: 1.Android Studio中打开 `File > Settings > Build, Execution, Deployment > Gradle`。 2. 勾选 `Offline work`,点击 `Apply`。 3. 同步项目,若成功则说明问题出在网络或仓库配置。 #### 6. **降级Gradle版本** - **现象**:新版Gradle与项目插件不兼容。 - **操作**: 1. 修改项目根目录的 `gradle-wrapper.properties`,指定兼容版本: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip ``` 2. 同步后检查 `Android Gradle Plugin` 版本是否匹配(参考官方版本对照表)[^1]。 #### 7. **禁用防病毒软件/防火墙** - **现象**:安全软件拦截Gradle进程。 - **操作**:临时关闭防火墙或添加Gradle相关进程(如 `java.exe`)到白名单。 --- ### 总结流程图 ```mermaid graph TD A[卡在Starting Gradle Daemon] --> B{检查JDK版本} B -->|不兼容| C[调整JDK路径或版本] B -->|兼容| D{检查网络/镜像} D -->|网络问题| E[配置国内镜像或代理] D -->|正常| F{检查缓存} F -->|缓存损坏| G[清理Gradle缓存] F -->|正常| H{检查内存配置} H -->|内存不足| I[增大Xmx值] H -->|正常| J[降级Gradle版本或适配插件] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值