Android 使用 Java 8 语言功能

作者: echoMuJS | 来源:发表于2018-09-17 12:05 被阅读25次

此文完全来源于谷歌开发者网站的文档,介绍你可以使用的 Java 8 语言功能、如何正确配置项目以使用这些功能以及您可能遇到的任何已知问题。(传送门直达:使用 Java 8 语言功能

Android Studio 3.0 及以上版本支持所有 Java 7 语言功能,以及部分 Java 8 语言功能(具体因平台版本而异)。

注:在开发 Android 应用时,可以选择使用 Java 8 语言功能。 您可以将项目的源代码和目标代码兼容性值保留为 Java 7,但仍须使用 JDK 8 进行编译。

Android Studio 为使用部分 Java 8 语言功能及利用这些功能的第三方库提供内置支持。

如图 1 所示,默认工具链对 javac 编译器的输出执行字节码转换(称为 desugar),从而实现新语言功能。 Jack 不再受支持,您需要首先停用 Jack 才能使用默认工具链内置的 Java 8 支持。

图 1. 采用 desugar 字节码转换的 Java 8 语言功能支持

要开始使用受支持的 Java 8 语言功能,请更新 Android 插件3.0.0(或更高版本)。

然后,针对使用(包括在源代码中或通过依赖项使用)Java 8 语言功能的每个模块,在其 build.gradle 文件中添加以下代码:

android {
...
// Configure only for each module that uses Java 8
// language features (either in its source code or
// through dependencies).
compileOptions {
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
  }
}

注:如果 Android Studio 检测到您的项目使用的是 Jack、RetrolambdaDexGuard,IDE 则会使用由这些工具提供的 Java 8 支持。 但您可以考虑 迁移至默认工具链

支持的 Java 8 语言功能和 API

虽然 Android Studio 并非支持所有 Java 8 语言功能,但未来发布的 IDE 版本将会增加更多功能。 目前,部分功能和 API 已可使用,具体取决于您所使用的 minSdkVersion,详见下表:

Java 8 语言功能 兼容的 minSdkVersion
Lambda 表达式 任意。 然而,只有在 Lambda 采集的所有值可序列化时才支持 Lambda 序列化。
函数引用 任意。
类型注解 任意。 然而,类型注解信息仅在编译时可用,在运行时不可用。 此外,在 API 级别 24 及更低级别中,平台支持 TYPE,而不支持 ElementType.<wbr style="box-sizing: inherit;">TYPE_USEElementType.<wbr style="box-sizing: inherit;">TYPE_PARAMETER
默认和静态接口函数 任意。
重复注解 任意。
Java 8 Language API 兼容的 minSdkVersion
java.lang.annotation.Repeatable API 级别 24 或更高级别。
AnnotatedElement.getAnnotationsByType(Class) API 级别 24 或更高级别。
java.util.stream API 级别 24 或更高级别。
java.lang.FunctionalInterface API 级别 24 或更高级别。
java.lang.reflect.Method.isDefault() API 级别 24 或更高级别。
java.util.function API 级别 24 或更高级别。

除了上述 Java 8 语言功能和 API 之外,Android Studio 3.0 及更高版本还将对 try-with-resources 的支持扩展到所有级别的 Android API。

Desugar 目前暂不支持 MethodHandle.invokeMethodHandle.invokeExact。 如果您的源代码或任一模块依赖项使用了其中一种函数,则需指定 minSdkVersion 26 或更高版本。 否则会出现以下错误:

<pre class="prettyprint" style="box-sizing: inherit; background: rgb(247, 247, 247); color: rgb(55, 71, 79); font: 400 14px/20px &quot;Roboto Mono&quot;, monospace; padding: 8px; margin: 16px 0px; overflow-x: auto; position: relative; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">`Dex:  Error converting bytecode to dex:  Cause: signature-polymorphic method called without --min-sdk-version >=  26` </pre>

在某些情况下,即使您的模块包含在库依赖项中,也可能不会使用 invokeinvokeExact 函数。 因此,要继续使用 minSdkVersion 25 或更低版本的库,请通过启用代码压缩 移除未使用的函数。 如果这种方法无效,可考虑使用一个替代库,该库不使用未受支持的函数。

相关文章

  • 在 Android 中使用 Java8 的特性!

    根据 Android 官网的说明,在开发面向 Android N 的应用时,可以使用 Java8 语言功能。目前 ...

  • Android 使用 Java 8 语言功能

    此文完全来源于谷歌开发者网站的文档,介绍你可以使用的 Java 8 语言功能、如何正确配置项目以使用这些功能以及您...

  • AndroidStudio中使用Java8

    Android Studio 3.0 及以上版本已经支持所有 Java 7 语言功能,以及部分 Java 8 语言...

  • 【Android】 Android使用Java 8 语言功能注意

    Android studio 3.0以前,如果我们要使用Java 8的语言功能如Lamb表达式,我们需要这么配置:...

  • Android开发使用Java8新特性

    Android 支持所有 Java 7 语言功能,以及一部分 Java 8 语言功能(具体因平台版本而异)。本文介...

  • AndroidStudio配置使用lambda

    官网说明要开始使用受支持的 Java 8 语言功能,请更新 Android 插件到 3.0.0(或更高版本)。 然...

  • Lambda in Android

    Android 如何实现支持 lambda 表达式 lambda 表达式是 java 8 新引入的语言特性,使用了...

  • Android开发规范

    一、Java语言规范 详见:Android开发java编写规范 二、Android资源文件命名与使用 1. 【推荐...

  • Java Annotation

    Java注解 作为Android开发者,本身语言基础是基于Java的。我们平时在使用的Android Suppor...

  • 测试之monkey

    简述: Monkey起源: Monkey程序由Android系统自带,使用Java语言写成,在Android文件系...

网友评论

    本文标题:Android 使用 Java 8 语言功能

    本文链接:https://www.haomeiwen.com/subject/cjgknftx.html