正如我在这个职位中所看到的,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模块的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那么问题是,用1.7版本编译Android模块和用1.8编译依赖Java模块是否可能呢?如果没有,那为什么呢?
更新:
雷特朗巴 for Gradle (由@Saeed提到)很好,但是它们只支持lambda,所以不能访问Stream API、DateTime API和其他特性。想象一下,如果*.jar文件是用Java 8构建的(没有Android代码)。我认为我们不能将这样的*.jar文件用作Android模块的依赖项,因为它的字节码将不被ART或Dalvik所支持,而只被JVM用于Java 8。
发布于 2015-06-04 21:06:21
因为API 19 (正如您在这个文档中没有提到java1.8),Android可以支持Java1.7,而且它也不使用JVM,而是使用ART或Dalvik,所以它生成了Dalvik字节码。
我认为,如果我们想使用java1.8作为compileOptions,也许android运行时无法理解java 8中的一些新特性,比如lambda,所以gradle不允许您编译代码,并且得到了这个异常。
所以您需要一个字节码转换器来使用
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}阅读此教程 .It转换您的字节码,使其与java 7兼容。我以前对此进行过测试,它适用于我。
更新2016年
安卓N 介绍对Java 8语言特性的支持.
https://stackoverflow.com/questions/30652528
复制相似问题