在同时使用 Terminal 和 Android Studio 开发和编译 Android 项目时,跑 gradle 任务经常有一个提示,类似:

Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use --status for details

这表示 Gradle 又开启了一个新的 Daemon,已经存在的没有被重用。

执行gradlew --status可以看到已经有3个Daemon 存活,对于我这台13年末产的老爷机来说是个严重的负担

1
2
3
4
5
6
7
$ ./gradlew --status
PID STATUS INFO
33346 IDLE 4.6
31842 IDLE 4.6
29669 IDLE 4.6
Only Daemons for the current Gradle version are displayed. See https://docs.gradle.org/4.6/userguide/gradle_daemon.html#sec:status

存在多个 Daemon 的原因

Gradle 官方给的解释是:

  1. Gradle 版本不一样,比如一个项目用了 Gradle 4.4 而另一个用了 Gradle 4.6;
  2. Java 版本不一样,比如一个项目使用 JDK 7 而另一个则是 JDK 8 执行的 Gradle;
  3. Daemon JVM 参数不一样,比如一个项目指定了 -Xmx1024m 而另一个 -Xmx2048m
  4. 存在的 Daemon 都处于 BUSY 状态,比如Android Studio 和 Terminal 同时跑 Gradle 任务。

如何共用一个Daemon

针对上述原因,可以得到以下方案:

对于同一个项目来说,使用同一个 JDK 执行 Gradle即可;如果是多个项目则另外需要指定使用同一个版本的gradle、并设置同样的 JVM 参数。

如何让 Android Studio 和 Terminal 使用同一个 JDK

Android Studio 使用的其实是内置的 Open JDK,而 Terminal 则使用的机子上安装的 JDK

1
2
3
4
5
6
7
8
$ /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/jre/bin/java -version
openjdk version "1.8.0_152-release"
OpenJDK Runtime Environment (build 1.8.0_152-release-915-b08)
OpenJDK 64-Bit Server VM (build 25.152-b08, mixed mode)
$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)

这里,我将 Android Studio 的 JDK 路径改为机子上安装的 JDK:

MacOS 上可以使用 /usr/libexec/java_home 命令获取 JDK 的安装路径

1
2
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home

Android Studio 中 File -> Project StructureUse embeded JDK 勾掉,并修改为本机的JDK路径即可

JDK location