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 API
、DateTime API
和其他特征。想象一下,如果我们用 Java 8
构建了 *.jar
文件(没有 Android
代码)。我认为我们不能使用这样的 *.jar
文件作为 Android
模块的依赖项,因为它的字节码不会被 ART
或 Dalvik
支持,但只有 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 年更新
正如我在 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 API
、DateTime API
和其他特征。想象一下,如果我们用 Java 8
构建了 *.jar
文件(没有 Android
代码)。我认为我们不能使用这样的 *.jar
文件作为 Android
模块的依赖项,因为它的字节码不会被 ART
或 Dalvik
支持,但只有 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 年更新