Is it possible to use Java 8 for Android development?
Asked Answered
S

28

635

Searching the web, it is not clear if Java 8 is supported for Android development or not.

Before I download/setup Java 8, can some one point me at any "official" documentation that says Java 8 is or is not supported for Android development.

Specs answered 27/4, 2014 at 0:40 Comment(10)
I don't know about official statement but I've got Java 8 (edit:JDK 8) working fine with Android SDK for me. Windows 8.1 64 bit here.Doc
There have been a discussion going at this post How does Android's Java version relate to a Java SE version?Ruckman
@HoangHuynh are you referring to JDK 8?Renatarenate
@Renatarenate yes I meant JDK 8.Doc
@HoangHuynh you may use JDK 6 or above for Android development. However, the compilation supports Java version 6 (and 7 in case of KitKat). I think what the OP meant is also for java version (not JDK)Renatarenate
Java 8 is OFFICIALLY supported in Android N. android-developers.blogspot.com/2016/03/…Began
it's work perfectly in my java 8 and with windows 10Sechrist
maybe soon: developer.android.com/preview/j8-jack.htmlKirkman
Oracle has stopped providing dowload link to JDK7Pastorale
jack is now officially deprecated and java8 features are about to be added directly into the standard toolchain: android-developers.googleblog.com/2017/03/…Nanci
C
196

java 8

Android supports all Java 7 language features and a subset of Java 8 language features that vary by platform version.

To check which features of java 8 are supported

Use Java 8 language features

We've decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.

Future of Java 8 Language Feature Support on Android

Eclipse Users:

For old developers who prefer Eclipse, google stops support Eclipse Android Developer tools

if you installed Java 8 JDK, then give it a try, if any problems appears try to set the compiler as 1.6 in Eclipse from window menu → PreferencesJavaCompiler. Java 7 will works too:

Eclipse Preferences -> Java -> Compiler

Java 7 or higher is required if you are targeting Android 5.0 and higher.

install multiple JDK and try.

Considerable answered 27/4, 2014 at 1:10 Comment(10)
This has changed now. You can use Java 7 as well. As long as you don't use try with resources.Triode
Did Java 8 change the way the bytecode works? If not, it should be fine to use any version of Java, theoretically, as long as it compiles.Duplicature
the correct question is: what if you use new features in java 8 not exists in java 7 to build android app, is it ok? to be on safe side follow official instructions.Considerable
@BenC.R.Leggiero there's no new bytecode in Java 8, but the instructions' meanings and structures were changed #28228950 #16144184Karame
Please do not post "Update N" in your answer. Rewrite it to have up-to-date information. Otherwise, SO will in a few years be as difficult to get information from as the forums it superseded.Jukebox
As I understand it, It says Android N is supporting Java 8, so it means APIs < Android N doesn't have it. Is this correct?Aerophone
Jack toolchain is now deprecated as per this announcement. Replacement is in the works.Alumroot
This answer needs to be updated. The first sentence "I think it is too early to say if Java 8 is suitable for Android development" is completely outdated an links to old data. The "Updated" stuff is also very old.Facesaving
Not all Java 7 features are available in Android. Like the package java.nio.file. It will be available in Android O as I understand ?Fit
Answer need to be update. Java 8 will is supported as of Android Studio 3.0 and Gradle Plugin 3.0.Alpers
M
354

UPDATE 2017/11/04 - Android Studio 3.0 now has native support for Java 8. gradle-retrolambda is now no longer needed. See https://developer.android.com/studio/write/java8-support.html

The above link also includes migration instructions if you are using gradle-retrolambda. Original answer below:


Android does not support Java 8. It only supports up to Java 7 (if you have kitkat) and still it doesn't have invokedynamic, only the new syntax sugar.

If you want to use lambdas, one of the major features of Java 8 in Android, you can use gradle-retrolamba. It's a gradle build dependency that integrates retrolambda, a tool that converts Java 8 bytecode back to Java 6/7. Basically, if you set the compiler in Android Studio to compile Java 8 bytecode, thus allowing lambdas, it'll convert it back to Java 6/7 bytecode which then in turn gets converted to dalvik bytecode. It's a hack for if you want to try out some JDK 8 features in Android in lieu of official support.

Map answered 27/4, 2014 at 2:14 Comment(10)
It was a bit of a struggle to get it working, but once I actually followed the right instructions it worked nicely. Note to Eclipse users: Eclipse doesn't work well with this, I suggest migrating to Android Studio (I will miss Eclipse, but that's the way it has to be for now!)Empathize
Nitpick: multi-catch clauses from Java 7 are NOT supported by Android.Upturn
Multi-catch is supported, only JDK7 feature not supported by Android is try-with-resourcesMolybdate
Java 7 working with all versions of Android. One exception: try-with-resources works only since Kitkat.Headstrong
try-with-resources is supported on API level 19 and higherBriefcase
Also note that although retrolambda is working for lambda syntax, it does not support the Java 8 stream API.Empathize
Lambda still not included in 5.1 LollipopLinus
@Simon André Forsberg (caution: shameless plug!) - as to not supporting the Java 8 stream API, you could make use of my library at sourceforge.net/projects/streamsupport - it explicitly addresses support for Android.Sometime
@Donato AFAIK, as of API level 22 (Android 5.1), yes. But there are rumours that this might change. See sseblog.ec-spride.de/2015/03/lambda-expressions-androidSometime
You don't need to use retrolamba anymore, with Android N lambdas are natively supported. Just follow these steps: developer.android.com/guide/platform/j8-jack.html#configurationIngenuous
C
196

java 8

Android supports all Java 7 language features and a subset of Java 8 language features that vary by platform version.

To check which features of java 8 are supported

Use Java 8 language features

We've decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.

Future of Java 8 Language Feature Support on Android

Eclipse Users:

For old developers who prefer Eclipse, google stops support Eclipse Android Developer tools

if you installed Java 8 JDK, then give it a try, if any problems appears try to set the compiler as 1.6 in Eclipse from window menu → PreferencesJavaCompiler. Java 7 will works too:

Eclipse Preferences -> Java -> Compiler

Java 7 or higher is required if you are targeting Android 5.0 and higher.

install multiple JDK and try.

Considerable answered 27/4, 2014 at 1:10 Comment(10)
This has changed now. You can use Java 7 as well. As long as you don't use try with resources.Triode
Did Java 8 change the way the bytecode works? If not, it should be fine to use any version of Java, theoretically, as long as it compiles.Duplicature
the correct question is: what if you use new features in java 8 not exists in java 7 to build android app, is it ok? to be on safe side follow official instructions.Considerable
@BenC.R.Leggiero there's no new bytecode in Java 8, but the instructions' meanings and structures were changed #28228950 #16144184Karame
Please do not post "Update N" in your answer. Rewrite it to have up-to-date information. Otherwise, SO will in a few years be as difficult to get information from as the forums it superseded.Jukebox
As I understand it, It says Android N is supporting Java 8, so it means APIs < Android N doesn't have it. Is this correct?Aerophone
Jack toolchain is now deprecated as per this announcement. Replacement is in the works.Alumroot
This answer needs to be updated. The first sentence "I think it is too early to say if Java 8 is suitable for Android development" is completely outdated an links to old data. The "Updated" stuff is also very old.Facesaving
Not all Java 7 features are available in Android. Like the package java.nio.file. It will be available in Android O as I understand ?Fit
Answer need to be update. Java 8 will is supported as of Android Studio 3.0 and Gradle Plugin 3.0.Alpers
I
102

You can indeed use gradle-retrolamba gradle build dependency to use Java 8 for Android Development.

Below is the complete guide that I have recently followed to run lambda expressions for Android development. The original source of this guide is mentioned at the end.

In this guide, a method for bringing some Java 8 features into Android Development Tools will be demonstrated, specifically aiming at Eclipse IDE. However, steps which will be described throughout this guide might also be adapted to Google’s new uprising development environment, Android Studio. It is based on the community edition of popular IntelliJ Idea IDE by JetBrains and it has recently been upgraded to its ‘beta’ version by Google in early July 2014, slightly before this guide was written. Eclipse will remain as the prominent development environment, at least for a while, and considering the fact that most Android projects have been developed using Eclipse, a method for bringing new Java 8 features like lambda expressions into ADT seems to be quite useful for developers.

Android Development is based on a custom Java implementation called Apache Harmony Project which was terminated back in 2011. The most commonly used Java syntax in Android Development is Java 6 (v1.6) and Java 7 (v1.7) is also partially supported on the KitKat edition (Android 4.4.+). Therefore, Java 8 features like lambda expressions cannot be used directly in the Android App Development without applying some tweaks into the development tools. Luckily, these constructs are basically some ‘syntactic sugar’ enhancements which give developers the shortcomings of things like ‘anonymous classes’ and they can be translated into Java 6 or Java 7 classes.

A recent approach for translating a Java 8 source code into lower Java versions is called RetroLambda. This library makes developers run Java 8 code with lambda expressions on Java 7 or even lower. Unfortunately, Java 8 features other than lambda expressions are not supported by RetroLambda for now but the concept of lambda expressions is the biggest leap on Java 8 platform and it’s a great tool for Android developers anyway.

Details about this library can be found on its GitHub page:

https://github.com/orfjackal/retrolambda#getting-started

Also, a Gradle plugin for RetroLambda created by another developer allows Gradle-based builds to be implemented in Java or Android Projects. However, the developer only mentions about integrating this plugin into Android Studio environment. Details can be found on its GitHub page:

https://github.com/evant/gradle-retrolambda

Using these infrastructures within an Eclipse-based development environment cannot be approached directly but it’s doable and will be demonstrated throughout this guide.

Preparation

This guide assumes that the reader has a basic understanding of Android Development and it is based on ADT version 22.6.2 because recent ADT version 23.0.2 seems to have problems like layout folder creation. Details about this issue can be found under the following link:

http://code.google.com/p/android/issues/detail?id=72591

Steps in this guide will be given for a Windows 8.1 64-bit development machine but they can easily be adapted to other platforms. The new build system Gradle will be used for build/clean processes and its installation procedure will also be provided. Also, both JDK 8 and JDK 7 must coexist on the development machine. Steps given below must be followed to install them:

  • Go to JDK 8 early access preview page http://jdk8.java.net
  • Download JDK 8u20 and install it. JRE 8 installation is not necessary and it can be skipped
  • Go to JDK 7 latest stable release page http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
  • Download JDK 7u65 and install it. JRE 7 installation is again not necessary and it can be skipped
  • Add JDK 8 home folder and JDK 8 bin folder to your %PATH% variable
  • Create a new environment variable JAVA_HOME with the value of the path of JDK 8 home folder
  • Create a new environment variable JAVA8_HOME again with the value of the path of JDK 8 home folder
  • Create a new environment variable JAVA7_HOME with the value of the path of JDK 7 home folder
  • Open a terminal window and run java -version command and verify that Java 8 is up and running
  • Run javac -version command in the same window and verify that JDK 8 Java compiler is also up and running

Now, ADT-22.6.2 must be downloaded from the following link:

http://dl.google.com/android/adt/22.6.2/adt-bundle-windows-x86_64-20140321.zip

  • Download ADT and unzip its contents into a folder, e.g. D:\adt
  • Define a new environment variable called ANDROID_HOME with the value of the path of your ADT installation folder, e.g. D:\adt\sdk
  • Add your Android SDK Platform Tools and Android SDK Tools folders, e.g. D:\adt\sdk\tools and D:\adt\sdk\platform-tools, to your %PATH% variable
  • Create a shortcut to Eclipse IDE if you like. It is located under your ADT installation folder, e.g. D:\adt\eclipse
  • Run Eclipse IDE and create a workspace, e.g. D:\adt\workspace
  • Click on the Android SDK Manager button which is located on the toolbar
  • Select Android SDK Build tools Rev. 19.1 and Android Support Library only. Un-select everything else and install these two packages.

If everything goes well, ADT will be up and running.

The installation of the following tools is also highly recommended:

  • Eclipse Kepler Java 8 Support: It makes Eclipse recognize new Java 8 syntax extensions and makes you get rid of annoying red dots in your Java code editor. It might be installed through Help -> Install New Software in Eclipse. Enter http://download.eclipse.org/eclipse/updates/4.3-P-builds/ into the Work with field and continue to install it.

  • Nodeclipse/Enide Gradle: It is mainly used to highlight Groovy language keywords. Groovy is used as the DSL for Gradle build scripts. This plugin can be installed through Eclipse Marketplace. However, Eclipse within ADT-22.6.2 does not come along with Eclipse Marketplace Client. Therefore, you will first need to install Eclipse Marketplace Client by means of Install New Software tool in Eclipse. Enter http//:download.eclipse.org/mpc/kepler/ into the Work with field and continue to install it. After installing Eclipse Marketplace Client, you may search for Nodeclipse/Enide Gradle in the Eclipse Marketplace Client and install it.

  • Genymotion Virtual Device: It is a great replacement of the default Android Virtual Device which comes along with ADT. AVD is annoyingly cumbersome and it keeps on crashing for no reason. Genymotion makes you prepare Android VD's using CyanogenMod images which are executed by Oracle VirtualBox. Its single user license is for free and it can be downloaded from http://www.genymotion.com. Only a login is required and it can also be integrated into Eclipse. Details can be found under:

https://cloud.genymotion.com/page/doc/#collapse8

Below is a screenshot of an Android 4.3 based CyanogenMod virtual device,

enter image description here

It might be considered as a fully-fledge Android device running on a x86 or x64 based personal computer. In order to use Google services like Google PlayStore on this virtual device, a gapps image for the Android version that it uses must be flashed onto the device. A proper gapps image for the device might be downloaded from CyanogenMod website:

http://wiki.cyanogenmod.org/w/Google_Apps

Gradle installation is optional since it is also provided by Android SDK itself but its separate installation is highly recommended. Installation of it might be conducted by following these steps:

  • Go to Gradle web site: http://www.gradle.org/

  • Click Downloads

  • Under Previous Releases choose version 1.10 and download either gradle-1.10-all.zip or gradle-1.10-bin.zip

  • Unzip its contents into a folder, e.g. D:\adt\gradle

  • Define a new environment variable called GRADLE_HOME with the value of the path of your Gradle installation folder, e.g. D:\adt\gradle

  • Add your Gradle binaries folder, e.g. D:\adt\gradle\bin, to your %PATH% variable

  • Open a terminal window and run gradle -v command and verify that it`s up and running If you have come up to this point successfully then it means that you are ready to create your first Android App using Java 8 features.

Demo App

A simple app will be created to demonstrate the usage of the tools which were described in the previous section. You may simply follow the steps given below to get an insight on using lambda expressions in Android Developer Tools:

  • Run Eclipse IDE and create a new Android App by selecting File -> New -> Other -> Android -> Android Application Project
  • Fill in the form that comes up as shown below:

enter image description here

  • Simply click the Next button on the following forms and click the Finish button on the last one. Wait till ADT finishes loading up the project

  • Right-click on the project and select New -> Folder and name it builders

  • Right-click on the gen (Generated Java Files) folder and delete it. Gradle will generate the same files for us soon and we will add them into the projects build path. The gen` folder created by the default Ant builder is no longer needed and the artifacts under that folder will be obsolete

  • Create following batch files under the builders folder:

    - gradle_build.cmd
    - gradle_post_build.cmd
    - gradle_clean.cmd
    
  • Fill in these batch files as follows:

gradle_build.cmd:

enter image description here

gradle_post_build.cmd:

enter image description here

gradle_clean.cmd:

enter image description here

  • Un-select Project -> Build Automatically menu option
  • Right-click on the project and select Properties -> Builders and un-select all default builders provided by ADT
  • Click the New button in the same window and select Program and click OK
  • New builder configuration window will appear. Fill in its tabs as follows:

Main Tab of the new Builder Configuration

enter image description here

Refresh Tab of the new Builder Configuration

enter image description here

Environment Tab of the new Builder Configuration

enter image description here

Build Options Tab of the new Builder Configuration

enter image description here

  • Create the second builder called Gradle_Post_Build that uses gradle_post_build.cmd as its program. All other settings of this builder must exactly be the same with the previously created builder. This builder will be responsible for copying the artifacts created by the build process into the bin folder.
  • Create the third builder called Gradle_Cleaner that uses gradle_clean.cmd as its program. Only Run the builder setting in the final tab must be set as During a Clean. All other settings of this builder must exactly be the same with the first builder. This builder will be responsible for cleaning the artifacts created by the build process as the name suggests.

New Builders of the HelloLambda Project

enter image description here

  • Right-click on the project and select Export
  • Select Android -> Generate Gradle Build Files and click Next
  • Select the project in the next window and click Finish
  • Go to your project's root folder and delete the files gradlew and gradlew.bat. Also delete gradle folder
  • Switch back to Eclipse and select Project -> Clean menu option. Fill in the form that shows up as follows:

Clean Project Window

enter image description here

  • Click OK and wait till the cleaning process completes
  • Add the Java code snippet given below right after the call to setContentView function in your MainActivity class:

enter image description here

  • Change the beginning of the build.gradle file till the sourceCompatibility section as follows:

enter image description here

  • Right-click on the project and select Properties -> Java Compiler option and set all compliance levels to Java 8. This will make Eclipse recognize new Java 8 constructs like lambda expressions.
  • Click No in the notification window
  • Right-click on the project and select Build project. Eclipse will start building the project.

Build Process enter image description here

  • Right-click on the project and go to Properties -> Java Build Path. Add the following folders to the build path (also shown in below image):

    • build\source\buildConfig\debug
    • build\source\r\debug

enter image description here

Eclipse will now be able to recognize R.java and buildConfig.java files and it will not display any red dots which denote errors related to the resource files of the project.

  • Create a new Run Configuration for your Android target platform by right-clicking on the project and then selecting Run As -> Run Configurations. For instance, this demo application looks like shown below on the Genymotion VD:

HelloLambda Application

enter image description here

You may observe in the LogCat window that the code snippet with a simple lambda expression works properly

enter image description here

Source: Using Java 8 Lambda Expressions in Android Developer Tools

Isodynamic answered 8/2, 2015 at 12:39 Comment(2)
But will you be able to debug this code using an Android debugger? The stacks/line numbers wouldn't be compatible is my guess. Seems like a major drawback to developing with Java 8 on Android.Cavie
@Cavie Yes you are still able to debug it. Everything works just fine.Fogarty
X
43

Follow this link for new updates. Use Java 8 language features

Old Answer

As of Android N preview release Android support limited features of Java 8 see Java 8 Language Features

To start using these features, you need to download and set up Android Studio 2.1 and the Android N Preview SDK, which includes the required Jack toolchain and updated Android Plugin for Gradle. If you haven't yet installed the Android N Preview SDK, see Set Up to Develop for Android N.

Supported Java 8 Language Features and APIs

Android does not currently support all Java 8 language features. However, the following features are now available when developing apps targeting the Android N Preview:

Default and static interface methods

Lambda expressions (also available on API level 23 and lower)

Repeatable annotations

Method References (also available on API level 23 and lower)

There are some additional Java 8 features which Android support, you can see complete detail from Java 8 Language Features

Update

Note: The Android N bases its implementation of lambda expressions on anonymous classes. This approach allows them to be backwards compatible and executable on earlier versions of Android. To test lambda expressions on earlier versions, remember to go to your build.gradle file, and set compileSdkVersion and targetSdkVersion to 23 or lower.

Update 2

Now Android studio 3.0 stable release support Java 8 libraries and Java 8 language features (without the Jack compiler).

Xerophagy answered 10/3, 2016 at 4:50 Comment(5)
I didn't understand something. Is there any requirement on the minSdkVersion?Oared
I think only lambda expressions are backward compatible, other Java 8 features will work only on N (or future version). I have not tested this but this is what I understand from Android docs. So, for Java 8 features minSdkVersion is N, other than lambda expressionXerophagy
So... another few years until N becomes leader in the dashboard. :(Oared
Unfortunately, yes. or until Android somehow provide backward compatibility like lambdaXerophagy
@WindRider, you can use minSdkVersion 15 and above. Currently I'm using minSdkVersion 17 in my Android project with Lambdas and everything is working.Ingenuous
F
23

Yes, Android Supports Java 8 Now (24.1.17)

Now it is possible

But you will need to have your device rom run on java 1.8 and enable "jackOptions" to run it. Jack is the name for the new Android compiler that runs Java 8

https://developer.android.com/guide/platform/j8-jack.html

add these lines to build_gradle

    android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Java 8 seem to be the running java engine of Android studio 2.0, But it still does not accept the syntax of java 8 after I checked, and you cannot chose a compiler from android studio now. However, you can use the scala plugin if you need functional programming mechanism in your android client.

enter image description here

Fadden answered 25/11, 2015 at 14:14 Comment(3)
Scala would be very heavy to package with the apkJudi
Please refer to this solution for updated android studio 2.0 as they've made updates to limited configurations options.Chubb
Jack is now deprecated, though the link does currently point to the updated docsUrticaceous
N
19

Android uses a Java that branches off of Java 6.

As of Android SDK version 19, you can use Java 7 features by doing this. No full support for Java 8 (yet).

Nysa answered 20/10, 2014 at 23:58 Comment(2)
you are a lifesaver. Do you know if there's also something that would implement try-with-resources in similar way?Footcandle
@Footcandle there is no way yet, but I would bet on Google adding it at some point in the future. Additional information, see: #16921837Nysa
T
16

Native Java 8 arrives on android! Finally!

remove the Retrolambda plugin and retrolambda block from each module's build.gradle file:

To disable Jack and switch to the default toolchain, simply remove the jackOptions block from your module’s build.gradle file

To start using supported Java 8 language features, update the Android plugin to 3.0.0 (or higher)

Starting with Android Studio 3.0 , Java 8 language features are now natively supported by android:

  • Lambda expressions
  • Method references
  • Type annotations (currently type annotation information is not available at runtime but only on compile time);
  • Repeating annotations
  • Default and static interface methods (on API level 24 or higher, no instant run support tho);

Also from min API level 24 the following Java 8 API are available:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType(Class)
  • java.lang.reflect.Method.isDefault()

Add these lines to your application module’s build.gradle to inform the project of the language level:

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

Disable Support for Java 8 Language Features by adding the following to your gradle.properties file:

android.enableDesugar=false

You’re done! You can now use native java8!

Thoughtless answered 10/3, 2016 at 12:20 Comment(0)
B
14

Android OFFICIALLY supports Java 8 as of Android N.

Feature announcements are here, the Java 8 language announcement is:

Improved Java 8 language support - We’re excited to bring Java 8 language features to Android. With Android's Jack compiler, you can now use many popular Java 8 language features, including lambdas and more, on Android versions as far back as Gingerbread. The new features help reduce boilerplate code. For example, lambdas can replace anonymous inner classes when providing event listeners. Some Java 8 language features --like default and static methods, streams, and functional interfaces -- are also now available on N and above. With Jack, we’re looking forward to tracking the Java language more closely while maintaining backward compatibility.

Began answered 9/3, 2016 at 18:44 Comment(1)
It's still pretty buggy at this date, for example Instant Run doesn't work with lambdas: if you change some code inside your lambda function, it won't take the change.Escamilla
S
12

We Can Use Java 8 using:

  1. In build.gradle (Project: myProject) add following

    classpath 'me.tatarka:gradle-retrolambda:x.x.x' //x.x.x is recent version
    
  2. In build.gradle (Module: myModule) add following

    apply plugin: 'me.tatarka.retrolambda'
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
Sonia answered 21/12, 2015 at 12:20 Comment(3)
What's different from the first answer that recommended retro lambda?Katowice
@MaartenBodewes Seems that pointed out that it has become much simpler than the accepted answer. Refer medium.com/android-news/…Judi
Don't use it. Plugin is buggyImplicit
Z
12

UPDATE 2020/01/17

Android Studio 4.0 includes support for using a number of Java 8 language APIs, by using technique called desugaring, without requiring a minimum API level for your app:
https://developer.android.com/studio/preview/features#j8-desugar

The following set of APIs is supported in this release:

  • Sequential streams (java.util.stream)
  • A subset of java.time
  • java.util.function
  • Recent additions to java.util.{Map,Collection,Comparator}
  • Optionals (java.util.Optional, java.util.OptionalInt and java.util.OptionalDouble) and some other new classes useful with the above APIs
  • Some additions to java.util.concurrent.atomic (new methods on AtomicInteger, AtomicLong and AtomicReference)
  • ConcurrentHashMap (with bug fixes for Android 5.0)

To support these language APIs, D8 compiles a separate library DEX file that contains an implementation of the missing APIs and includes it in your app. The desugaring process rewrites your app’s code to instead use this library at runtime.

To enable support for these language APIs, include the following in your module’s build.gradle file:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}

ORIGINAL POST FROM 2017

Android Studio 3.0 started to provide built-in support for some of Java 8 language features, which are:

  • Lambda expressions
  • Method references
  • Type Annotations (information is available at compile time, but not at runtime)
  • Repeating annotations
  • Default and static interface methods

Also starting from API level 24 the following Java 8 API are available:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType(Class)
  • java.lang.reflect.Method.isDefault()

Besides that, the try-with-resources support was extended to all Android API levels.

More Java 8 features are promised to be added in the future.

To start using supported Java 8 language features, update the Android plugin to 3.0.0-alpha1 (or higher) and add the following to your module’s build.gradle file:

android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

For more details visit:
https://developer.android.com/studio/write/java8-support.html

Zig answered 5/4, 2017 at 17:13 Comment(5)
What I don't get is, what does android studio has to do with java8 support (didn't intellij had it before)?! Does that mean that If I use gradle on the terminal to compile the project it wont compile?!Pending
@Pending You need to update the Android plugin to the latest version (which is at the moment 2.4.0-alpha6). Please check the quotation block in the answer.Zig
Adding it to the module(not app) I'm working in was the catch. Adding to app module didn't help.Byzantium
So can we use Java 8 in API 21 also?Czar
@Czar yes, you can use Java 8 language features in API 21 and you can use mentioned Java 8 APIs with the help of desugaring provided in Android Studio 4.0+Zig
L
6

Easy way

You can enable java 1.8 support for android project.

  • Open Project Structure

    • Either by pressing Ctrl + Shift + Alt + S

    • Or File > Project Structure

  • Update the Source Compatibility and Target Compatibility to 1.8 in the Project Structure dialog as shown (click File > Project Structure).

image

Or you can use gradle

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

Sync project. And that's it!

Note: Java 1.8 support can be enabled for Android Studio 3.0.0 or higher. See Documentation for further reading.

Libby answered 12/9, 2018 at 7:59 Comment(1)
This solution worked for me: https://mcmap.net/q/47828/-is-it-possible-to-use-java-8-for-android-developmentHewlett
S
5

When I asked this question almost 2 years ago the answer really was “officially” no, but as pointed out by ekcr1's answer you can get one of the most highly anticipated features (lambdas) to work if you use retrolamba. At the time I was still using eclipse, as Android Studio was in “preview” mode, so I never did pursue this path.

Today, I think the “official” answer is still no, and while retrolamba still seems like a good way to go, there is another option for those willing to go down a somewhat “unofficial” route can take, namely Kotlin.

Today Kotlin reached 1.0.0. For those not familiar with Kotlin, more info can be found at their website found here:

https://kotlinlang.org

or watch this utube video of a talk given by Jake Wharton

https://www.youtube.com/watch?v=A2LukgT2mKc

Specs answered 16/2, 2016 at 0:47 Comment(0)
N
4

Latest news:

Google announce that with Android N and Android Studio 2.1+, platform will support Java 8. Also stable version of studio 2.1 was released.

At last we can use lambda expressions. No more list filter in for loop. Horeeey.

Nephew answered 27/4, 2016 at 7:56 Comment(0)
S
4

Add this config build.gradle and sync gradle:

android {
    ...
    defaultConfig {
        ...
        jackOptions {
            enabled true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // or
        //sourceCompatibility 1.8
        //targetCompatibility 1.8
    }
}
Steelhead answered 15/9, 2016 at 9:59 Comment(2)
This is the correct way to add support for Java 8 for Android projects. The downside is that instant run doesn't currently run when jack is enabled.Layette
Don't full support.Steelhead
E
2

Google just announced that Java 8 will be natively support by Android and that the Jack toolchain will deprecate:

We've decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.

More Info here: https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

Elyn answered 15/3, 2017 at 7:38 Comment(0)
S
2

Yes. We will use Java 8 soon!

We've decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.

https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

Samellasameness answered 16/3, 2017 at 6:18 Comment(0)
C
2

addd this line into module lvl build gradel

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

Chong answered 2/4, 2019 at 5:1 Comment(0)
G
2

UPDATE 2019/10/28

Android Studio 4.0 solves this issue.

The D8 compiler patches a backport of the Java 8 native APIs into your APK at compile time and your app will use that code, instead of the native APIs, at runtime. The process is called desugaring.

Glazer answered 28/10, 2019 at 22:29 Comment(0)
M
1

I wrote a similar answer to a similar question on Stack Overflow, but here is part of that answer.

Android Studio 2.1:

The new version of Android Studio (2.1) has support for Java 8 features. Here is an extract from the Android Developers blogspot post:

... Android Studio 2.1 release includes support for the new Jack compiler and support for Java 8.

...

To use Java 8 language features when developing with the N Developer Preview, you need to use the Jack compiler. The New Project Wizard [File→ New→ Project] generates the correct configurations for projects targeting the N.


Prior to Android Studio 2.1:

Android does not support Java 1.8 yet (it only supports up to 1.7), so you cannot use Java 8 features like lambdas.

This answer gives more detail on Android Studio's compatibility; it states:

If you want to use lambdas, one of the major features of Java 8 in Android, you can use gradle-retrolamba

If you want to know more about using gradle-retrolambda, this answer gives a lot of detail on doing that.

Mezzosoprano answered 27/4, 2016 at 17:58 Comment(1)
Hi Farbod! I'm using AndroidStudio 2.2.2 My "SDK Location" (this is on a Mac FWIW) just says "/Users/me/Library/Android/sdk" Am I using Java8 - how to use Java8?? Thanks!Sweven
B
1

I figured I would post an updated answer for those looking at for something a little more current.

Currently Android and Android Studio are supporting a subset of Java 8 features. According to the Android documentation located on their website, Google says:

Support for Java 8 language features requires a new compiler called Jack. Jack is supported only on Android Studio 2.1 and higher. So if you want to use Java 8 language features, you need to use Android Studio 2.1 to build your app.

If you already have Android Studio installed, make sure you update to the latest version by clicking Help > Check for Update (on Mac, Android Studio > Check for Updates). If you don't already have the IDE installed on your workstation, download Android Studio here.

Supported Java 8 Language Features and APIs

Android does not support all Java 8 language features. However, the following features are available when developing apps targeting Android 7.0 (API level 24):

  • Default and static interface methods Lambda expressions (also available on API level 23 and lower)
  • Repeatable annotations
  • Method References (also available on API level 23 and lower)
  • Type Annotations (also available on API level 23 and lower)

Additionally, the following Java 8 language APIs are also available:

Reflection and language-related APIs:

  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.Method.isDefault() and Reflection APIs associated with repeatable annotations, such as AnnotatedElement.getAnnotationsByType(Class)

Utility APIs:

  • java.util.function
  • java.util.stream

In order to use the new Java 8 language features, you need to also use the Jack toolchain. This new Android toolchain compiles Java language sources into Android-readable DEX bytecode, has its own .jack library format, and provides most toolchain features as part of a single tool: repackaging, shrinking, obfuscation and multidex.

Here is a comparison of the two toolchains used to build Android DEX files:

Legacy javac toolchain:
    javac (.java → .class) → dx (.class → .dex)
    New Jack toolchain:
    Jack (.java → .jack → .dex)
Brigettebrigg answered 13/12, 2016 at 22:12 Comment(0)
S
1

I asked this question over 3 years ago and obviously the answers have changed over the years. As many above have already answered, as of sometime back, the answer became Yes. I have never updated the accepted answer because it was the correct answer at the time. (I am not sure what the Stack Overflow policy is on that)

I just wanted to add another answer for those who still search for this topic. As of 5/17/2017 Google also announced that Kotlin is also an official language for Android development.

I have not found an official press release, but I did watch some of the Google I/O videos where it was announced. Here is a link to a blog post by the Kotlin team on the announcement.

Specs answered 18/5, 2017 at 11:13 Comment(0)
R
1

Adding the following fixed the problem for me (Android studio 2.3.2):

build.gradle (Project)

buildscript {
repositories {
    ...
    jcenter()
}
dependencies {
    ...
    classpath 'me.tatarka:gradle-retrolambda:3.4.0' // DEPENDENCY
    ...
   }
}

build.gradle (Module: app)

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda' //PLUGIN

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    } // SET JAVA VERSION
    ...
}
Randolph answered 2/6, 2017 at 17:18 Comment(0)
U
1

A subset of Java 8 is supported now on Android Studio. Just make the Source and Target Compatibility adjustments from the window below:

File --> Project Structure

Adjustment Window

More information is given in the below link.

https://developer.android.com/studio/write/java8-support.html

Ultraviolet answered 25/1, 2018 at 14:29 Comment(0)
G
1

Easiest way to add Java 8 support

 compileOptions {
    targetCompatibility = '1.8'
    sourceCompatibility = '1.8'
 }

Just add it in your build.gradle file.

Gazo answered 23/5, 2020 at 14:56 Comment(1)
duplicated answer, low qualityDuplet
K
1

Android Gradle plugin 3.0.0 and later support all Java 7 language features and a subset of Java 8 language features that vary by platform version. When building your app using Android Gradle plugin 4.0.0 and higher, you can use a number of Java 8 language APIs without requiring a minimum API level for your app.

This page describes the Java 8 language features you can use, how to properly configure your project to use them, and any known issues you may encounter.

For this article will help you. I'll put the link here below down https://developer.android.com/studio/write/java8-support

Knockknee answered 5/3, 2021 at 7:16 Comment(0)
J
0

All the above solutions doesn't seem to work in 2019 with the latest Android Studio 3.4+.

I figured out a perfect and up to date solution to migrate or upgrade your Android Project to Java 8.

Solution: Click on File -> Project Structure -> Modules -> Properties tab.

Change the Source Compatibility and Target Compatibility to 1.8 (Java 8)

enter image description here

Jezreel answered 11/7, 2019 at 6:21 Comment(0)
C
0

Yes, you can use Java 8 Language features in Android Studio but the version must be 3.0 or higher. Read this article for how to use java 8 features in the android studio.

https://bijay-budhathoki.blogspot.com/2020/01/use-java-8-language-features-in-android-studio.html

Cootie answered 8/1, 2020 at 11:24 Comment(0)
L
0

EASY TO REMEMBER ANSWER

In android studio click on project structure icon then go inside Modules/app then change Source Compatibility and Target Compatibility to 1.8 and press Ok.

Ledge answered 3/11, 2021 at 18:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.