As I've seen in this post, Java 8
is not officially supported by Android
right now. So I'm interested if it is possible to build Android
module with Java 7
and Java
module (as a dependency) with Java 8
.
As an example, I'm trying to create a Gradle
project that will contain one Android
module and one Java
module as a dependency.
With the following compileOptions
set for both modules, everything works fine.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
But if I try to change compileOptions
for my Java
module to
compileJava {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
I get the following error:
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
So the question, is that actually possible to have Android
module compiled with 1.7
version and dependent Java
module compiled with 1.8
? And if not, so why?
UPDATE:
Retrolamba for Gradle
(mentioned by @Saeed) is good, however they have only support of lambdas, so not access to Stream API
, DateTime API
and other features. Imagine if we have *.jar
file built with Java 8
(no Android
code). I think that we can't use such *.jar
file as a dependency for Android
module, because it's bytecode will not be supported by ART
or Dalvik
, but only by JVM
for Java 8
.
Android can support java 1.7 since API 19 (as you see in this 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.
I think if we want to use java 1.8 as compileOptions
maybe android run time can't understand some new features in java 8 like lambda so gradle doesn't allow you to compile your code and you got that exception.
So you need a bytecode transformer to use
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Read this tutorial .It converts your bytecodes to be compatible with java 7.I've tested this before and it works for me.
Update 2016
Android N introduces support for Java 8 language features.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With