当前JDK版本1.8存在一个bug,导致Room无法进行增量操作。

24

我们正在尝试改进我们的多模块Android应用程序的构建时间,我们已经尝试启用增量KAPT注释处理编译。

  • Android Studio版本:v3.5.2
  • Room版本:v2.2.1
  • Gradle版本:v5.4.6
  • Android Gradle插件版本:v3.5.2
  • Kotlin版本:v1.3.50

gradle.properties:

org.gradle.daemon=true
org.gradle.caching=true
org.gradle.parallel=true

kapt.incremental.apt=true
kapt.use.worker.api=true
kapt.include.compile.classpath=false

android.databinding.incremental=true

build.gradle(在每个使用Room的模块内):

kapt {
    arguments {
        arg("room.incremental", "true")
    }
}

然而,当尝试使用gradlew assemble -scan 命令来基准测试构建时间时,Gradle会抛出以下错误:

warning: Current JDK version 1.8.0_201-b09 has a bug (https://bugs.openjdk.java.net/browse/JDK-8007720) that prevents Room from being incremental. Consider using JDK 11+ or the embedded JDK shipped with Android Studio 3.5+.
ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1
[WARN] Incremental annotation processing requested, but support is disabled because the following processors are not incremental: androidx.room.RoomProcessor (DYNAMIC).

我尝试在“项目结构”窗口中将Open JDK 11设置为项目的默认JDK,但它没有起作用,并且抱怨它不是JDK 8。这个设置出了什么问题?


你尝试过使用Android Studio内置的JDK吗? - EpicPandaForce
如果您正在从命令行运行 gradlew assemble -scan,请确保您的 JAVA_HOME 环境变量也指向您在 Android Studio 中设置的相同 JDK11。 - DanyBoricua
@EpicPandaForce 是的,同样的问题。Dany,我甚至不能在AS中设置JDK 11,因为它不允许我在“项目结构”窗口中选择JDK 11文件夹位置。 - Bogdan Zurac
5个回答

15

你需要使用内嵌AS的JDK来解决这个问题。请确保使用AS 3.5以上版本。 在项目结构中 -> SDK位置 请确保JDK指向与AS一起提供的JDK。 /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home 然后你需要重新启动AS。

如果你是从终端运行,请确保$JAVA_HOME包含正确的路径。

我猜Android Studio还不支持JDK 11。 我也尝试使用最新的JDK 8(231,与AS 3.5使用的202不同),但它会导致此问题。


2
我已经在使用嵌入式SDK,但那是Java 8。所以它没有帮助。 - Bogdan Zurac
所以我不明白,你是否遇到了我在问题中提到的错误? - Bogdan Zurac
这个可以工作:https://scans.gradle.com/s/qhvdmbsh5b2h6#infrastructure但是使用这个不行: https://scans.gradle.com/s/uqatyhc5f7lpu#infrastructure - Doni
2
请查看 https://dev59.com/81YN5IYBdhLWcg3wQWIV#47728957 以获取嵌入式JDK路径。(C:\ Program Files \ Android \ Android Studio \ jre) - CoolMind
4.2开始,Android Studio使用JDK 11并将其作为嵌入式使用,但警告仍然存在,以下是我在日志中得到的内容:> Task :app:kaptQaDebugKotlin warning: 当前JDK版本 `11.0.8+10-b944.6916264` 存在一个错误 (https://bugs.openjdk.java.net/browse/JDK-8007720),防止Room进行增量。考虑使用JDK 11+或随Android Studio 3.5+一起提供的嵌入式JDK。[WARN] 请求增量注释处理,但由于以下处理器不是增量的,因此不支持:androidx.room.RoomProcessor(DYNAMIC)。 - Akbolat SSS
显示剩余4条评论

4

编译时,会有一个警告:

当前JDK版本存在一个漏洞(https://bugs.openjdk.java.net/browse/JDK-8007720),导致Room无法增量。考虑使用JDK 11+或与Android Studio 3.5+一起提供的嵌入式JDK。注意:1 使用以下内容编写了GeneratedAppGlideModule:[][WARN] 增量注释处理已请求,但由于以下处理器不是增量处理器而被禁用:androidx.room.RoomProcessor(DYNAMIC)。

然后我从Oracle网站下载了JDK 8(8u261)(需要注册,因此请查找直接链接)。

安装后,将JAVA_HOME系统变量更改为新路径:

enter image description here

然后重新编译应用程序。甚至不需要重新启动。

更新

一个月后,我再次看到了同样的警告。然后阅读了被接受的答案并 发现 了在 Android Studio 中嵌入的 Java: C:\Program Files\Android\Android Studio\jre

文件 > 项目结构...,然后选择 SDK 位置,在字段 JDK 位置 中写入该路径。重新启动 AS。


嗯,我也遇到了这个错误,但我不知道该如何修复。路径和你的一样。https://stackoverflow.com/q/67408778/11110509 - DIRTY DAVE
1
@DIRTYDAVE,是的,JRE路径可行。我不记得为什么又改回了JDK。可能出现了一些小的编译问题。但你当然可以保留JRE路径。 - CoolMind
路径应该包含在上面的答案中。 - Lance
@Lance,抱歉,什么路径?如果您愿意,您可以编辑任何答案。 - CoolMind
@CoolMind - 你在回答中提到的路径应该被列为被采纳的答案。 - Lance
@Lance,同意你的观点,谢谢!但是在这种情况下,他的解决方案会得到积分,而我的不会 :)。 - CoolMind

2

前往项目结构 > SDK位置,然后进入Gradle设置。

设置gradle jdk


1
使用 Room 2.2.5 而非 2.2.6。保留 html。
kapt "androidx.room:room-compiler:2.2.5"
implementation "androidx.room:room-runtime:2.2.5"
implementation "androidx.room:room-ktx:2.2.5"

0

将我的shell中的$JAVA_HOME设置为/Applications/AndroidStudio.app/Contents/jre/jdk/Contents/Home对我很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接