blob: 78252f08e8db4e7c5a76fc9bd400e3b85ed99486 [file] [log] [blame]
page.title=Java 8 Language Features
page.keywords="android N", "Java 8", "Jack"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li>
<a href="#supported-features">Supported Java 8 Language Features and APIs</a>
</li>
<li>
<a href="#configuration">Enabling Java 8 Features and the Jack Toolchain</a>
</li>
</ol>
</div>
</div>
<p>Android N introduces support for Java 8 language features
that you can use when developing apps that target Android N.
This page describes the new language features supported in the Android N
Preview, how to properly set up your project to use them, and any known
issues you may encounter.
</p>
<p>To start using these features, you need to download and set up Android
Studio 2.1 (preview) 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 <a href=
"{@docRoot}preview/setup-sdk.html">Set Up to Develop for Android N</a>.</p>
<p class="note">
<strong>Note:</strong> Using the new Java 8 language features is not a
requirement for developing apps that target the Android N platform. If you
don't want to write code with Java 8 language features, you can keep your
project's source and target compatibility values set to Java 7, but you still
must compile with JDK 8 to build against the Android N platform.
</p>
<h2 id="supported-features">
Supported Java 8 Language Features and APIs
</h2>
<p>
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:
</p>
<ul>
<li>
<a class="external-link" href=
"https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">Default
and static interface methods</a>
</li>
<li>
<a class="external-link" href=
"https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">
Lambda expressions</a>
</li>
<li>
<a class="external-link" href=
"https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">Repeatable
annotations</a>
</li>
</ul>
<p>
Additionally, the following Java 8 language feature APIs are now available:
</p>
<ul>
<li>Reflection and language-related APIs:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.lang.FunctionalInterface}
</li>
<li>{@code java.lang.annotation.Repeatable}
</li>
<li>{@code java.lang.reflect.Method.isDefault()}
</li>
<li>and Reflection APIs associated with repeatable annotations, such as
{@code AnnotatedElement.getAnnotationsByType(Class)}
</li>
</ul>
</li>
<li>Utility APIs:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.util.function}
</li>
</ul>
</li>
</ul>
<p class="note">
<strong>Note:</strong> 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 {@code
build.gradle} file, and set {@code compileSdkVersion} and {@code
targetSdkVersion} to 23 or lower.
</p>
<h2 id="configuration">
Enabling Java 8 Features and the Jack Toolchain
</h2>
<p>
In order to use the new Java 8 language features, you need to also use the
new <a class="external-link" href=
"https://source.android.com/source/jack.html">Jack toolchain</a>. This new
Android toolchain compiles Java language source into Android-readable dex
bytecode, has its own {@code .jack} library format, and provides most toolchain
features as part of a single tool: repackaging, shrinking, obfuscation and
multidex.
</p>
<p>Here is a comparison of the two toolchains used to build Android DEX files:</p>
<ul>
<li>Legacy javac toolchain:<br>
<b>javac</b> ({@code .java} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
.class} --&gt; {@code .dex})
</li>
<li>New Jack toolchain:<br>
<b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@code .dex})
</li>
</ul>
<h3>
Configuring Gradle
</h3>
<p>
To enable the Java 8 language features and Jack for your project, enter the
following in your module-specific {@code build.gradle} file:
</p>
<pre>
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
</pre>
<h3>
Known Issues
</h3>
<p>
Instant Run, introduced in Android Studio 2.0 (Beta), does not currently work
with Jack and will be disabled while using the new toolchain.
</p>
<p>Because Jack does not generate intermediate class files when compiling an
app, tools that depend on these files do not currently work with Jack. Some
examples of these tools are:</p>
<ul>
<li>Lint detectors that operate on class files
</li>
<li>Tools and libraries that require the app’s class files (such as
instrumentation tests with JaCoCo)
</li>
</ul>
<p>
Calls to an interface's default method on a <a class="external-link" href=
"https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html"><code>
Proxy</code></a> instance fail with an exception.
</p>
<p>If you find other problems while using Jack, <a href=
"http://tools.android.com/filing-bugs">please report bugs</a>.</p>