使用Java 8模块Gradle Android Project

时间:2015-06-04 19:29:51

标签: java android gradle java-8 android-gradle

正如我在this post中看到的那样,Java 8目前尚未正式支持Android。所以我很感兴趣是否可以使用AndroidJava 7模块(作为依赖项)与Java构建Java 8模块。

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

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

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

所以问题是,实际上是否可以使用Android版本编译的1.7模块和使用Java编译的相关1.8模块?如果没有,为什么呢?

更新

<{1}} Gradle(由@Saeed提及)很好,但是他们只支持lambdas,因此无法访问Stream APIDateTime API和其他功能。想象一下,如果我们使用*.jar(无Java 8代码)构建Android文件。我认为我们不能将这样的*.jar文件用作Android模块的依赖项,因为ARTDalvik不支持它的字节码,而只是JVM {1}} Java 8

1 个答案:

答案 0 :(得分:12)

从API 19开始,Android可以支持java 1.7(正如你在doc中看到的那样,没有提到java 1.8)而且它也没有使用JVM并使用ART或Dalvik,所以它会生成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兼容。我之前已经对此进行了测试,它对我有效。

2016年更新

Android N introduces support for Java 8 language features