Gradle Android 项目 Java 8 个模块

Gradle Android Project with Java 8 module

正如我在 this post 中看到的那样,Java 8 目前尚未得到 Android 的官方支持。所以我很感兴趣是否可以使用 Java 7 构建 Android 模块,使用 Java 8.

构建 Java 模块(作为依赖项)

例如,我正在尝试创建一个 Gradle 项目,它将包含一个 Android 模块和一个 Java 模块作为依赖项。 为两个模块设置以下 compileOptions,一切正常。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

但是如果我尝试将 Java 模块的 compileOptions 更改为

compileJava {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}

我收到以下错误:

Error:Execution failed for task ':fc-android:preDexFreeDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 1

那么问题来了,是否真的可以用 1.7 版本编译 Android 模块,用 1.8 编译依赖 Java 模块?如果不是,那为什么呢?

更新:

Retrolamba for Gradle(@Saeed 提到)很好,但是它们只支持 lambda,因此无法访问 Stream APIDateTime API 和其他特征。想象一下,如果我们用 Java 8 构建了 *.jar 文件(没有 Android 代码)。我认为我们不能使用这样的 *.jar 文件作为 Android 模块的依赖项,因为它的字节码不会被 ARTDalvik 支持,但只有 JVM 对于 Java 8.

Android 可以支持 java 1.7,因为 API 19(如您在此 doc there is no mention of java 1.8) and also it doesn't use JVM and using ART or Dalvik instead ,So it generates Dalvik bytecode 中所见。

我想如果我们想把java 1.8 当作compileOptions 来使用,可能android 运行 时间无法理解java 8 中的一些新特性像 lambda 所以 gradle 不允许你编译你的代码,你得到了那个异常。

所以你需要一个字节码转换器来使用

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

阅读此 tutorial。它将您的字节码转换为与 java 兼容 7.I 之前测试过它并且对我有用。

2016 年更新

Android N introduces support for Java 8 language features.