正如我在this post中看到的那样,Java 8
目前尚未正式支持Android
。所以我很感兴趣是否可以使用Android
和Java 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 API
,DateTime API
和其他功能。想象一下,如果我们使用*.jar
(无Java 8
代码)构建Android
文件。我认为我们不能将这样的*.jar
文件用作Android
模块的依赖项,因为ART
或Dalvik
不支持它的字节码,而只是JVM
{1}} Java 8
。
答案 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年更新