当前的 JDK 版本 1.8 有一个 bug 会阻止 Room 增量

Posted

技术标签:

【中文标题】当前的 JDK 版本 1.8 有一个 bug 会阻止 Room 增量【英文标题】:Current JDK version 1.8 has a bug that prevents Room from being incremental 【发布时间】:2020-03-08 09:22:32 【问题描述】:

我们正在尝试改进我们的多模块 android 应用的构建时间,并且我们已经达到了尝试启用增量 KAPT 注释处理编译的地步。

Android Studio 版本: v3.5.2 房间版: 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? 如果您从命令行运行 gradlew assemble -scan,请确保您的 JAVA_HOME 环境变量也指向您在 Android Studio 中设置的同一个 JDK11。 @EpicPandaForce 是的,同样的问题。 Dany,我什至无法在 AS 中设置 JDK 11,它不允许我在 Project Structure 窗口中选择 JDK 11 文件夹位置。 【参考方案1】:

您需要使用嵌入 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)但它导致了这个问题。

【讨论】:

我已经在使用嵌入式 SDK,但那是 Java 8。所以它没有帮助。 我认为是你的 1.8.0_201-b0 ,它不应该是 beta 版本,我的是 202 所以我不明白,你是不是遇到了我在问题中提到的错误? 是的,我在使用从 oracle web 下载的 JDK 231 时遇到了这个问题。然后可以通过从 android studio 切换回 JDK 来解决这个问题。您是从终端运行它还是在 Android Studio 上按播放?我的看起来像这样 JetBrains s.r.o OpenJDK Runtime Environment 1.8.0_202-release-1483-b49-5587405 查看 ***.com/questions/47728646/… 了解嵌入式 JDK 路径。 (C:\Program Files\Android\Android Studio\jre)【参考方案2】:

编译时,它向我显示了一个警告:

当前 JDK 版本有一个错误 (https://bugs.openjdk.java.net/browse/JDK-8007720) 阻止 Room 增量。考虑使用 JDK 11+ 或 Android Studio 3.5+ 附带的嵌入式 JDK。注意:1 使用:[][WARN] 编写了 GeneratedAppGlideModule 请求增量注释处理,但由于以下处理器不是增量的,因此禁用了支持:androidx.room .RoomProcessor(动态)。

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

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

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

更新

一个月后,我再次看到同样的警告。然后阅读接受的答案和found嵌入Android Studio的Java:C:\Program Files\Android\Android Studio\jre

File > Project Structure...,然后是SDK Location,然后在字段JDK location 中写入了该路径。重启了AS。

【讨论】:

嗯,我也遇到了这个错误,我不知道如何解决。路径和你的一样***.com/q/67408778/11110509 @DIRTYDAVE,是的,JRE 路径有效。我不记得为什么我又改用 JDK 了。可能出现了一些小的编译问题。但是你当然可以保留 JRE 路径。 路径应该包含在上面的答案中。 @Lance,对不起,什么路径?您可以根据需要编辑任何答案。 @CoolMind - 您在回答中提到的路径应该在接受的答案中提及。【参考方案3】:

转到项目结构 > SDK 位置,然后转到 Gradle 设置。

【讨论】:

【参考方案4】:

使用房间2.2.5而不是2.2.6

kapt "androidx.room:room-compiler:2.2.5"
implementation "androidx.room:room-runtime:2.2.5"
implementation "androidx.room:room-ktx:2.2.5"

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于当前的 JDK 版本 1.8 有一个 bug 会阻止 Room 增量的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 7 安装Java 1.8

JDK1.7&1.8源码对比分析集合ConcurrentHashMap

Linux 中的 JDK 1.7/1.8 中缺少 JavaFX?

sts问题合集

VSTS - Xamarin Proguard 版本和 JDK 1.8 的问题

Spark BUG实践(包含的BUG:ClassCastException;ConnectException;NoClassDefFoundError;RuntimeExceptio等。。。。)