使用Java 8模块Gradle Android Project

Yur*_*kov 7 java android gradle java-8 android-gradle-plugin

正如我在这篇文章中看到的那样,Java 8现在还没有正式支持Android.所以我很感兴趣是否可以Android使用Java 7Java模块(作为依赖项)构建模块Java 8.

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将模块更改compileOptionsJava

compileJava {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

那么问题是,实际上可以用Android编译的1.7版本和依赖Java模块编译模块1.8吗?如果没有,为什么呢?

更新:

RetrolambaGradle(由@Saeed提到)是很好的,但是他们有lambda表达式的唯一支持,所以不能访问Stream API,DateTime API以及其他功能.想象一下,如果我们有*.jar文件构建Java 8(没有Android代码).我认为我们不能将这样的*.jar文件用作Android模块的依赖项,因为它的字节码不会被ART或支持Dalvik,而只能由JVMfor支持Java 8.

Sae*_*umi 12

从API 19开始,Android可以支持java 1.7(正如你在本文档中看到的那样,没有提到java 1.8),而且它不使用JVM并使用ART或Dalvik,所以它生成Dalvik字节码.

我想如果我们想使用java 1.8,因为compileOptionsandroid运行时可能无法理解java 8中的一些新功能,例如lambda,所以gradle不允许你编译你的代码而你得到了那个例外.

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
Run Code Online (Sandbox Code Playgroud)

阅读本教程.它将您的字节码转换为与java 7兼容.我之前已经测试过,它对我有用.

2016年更新

Android N 引入了对Java 8语言功能的支持.