使用 Java 8 语言功能


Android Studio 3.0 及以上版本支持所有 Java 7 语言功能,以及部分 Java 8 语言功能(具体因平台版本而异)。 本页介绍您可以使用的 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 语言功能和 API 之外,Android Studio 3.0 及更高版本还将对try-with-resources的支持扩展到所有级别的 Android API。

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

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

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

迁移至默认工具链

如果 Android Studio 检测到您的项目使用了 Jack、RetrolambdaDexGuard,IDE 则会使用由这些工具提供的 Java 8 支持。 但与默认工具链相比,这些工具缺乏部分功能和支持。 所以,请参照本节说明迁移至 Android Studio 的默认工具链。

从 Jack 迁移

根据此公告Jack 工具链已经被弃用。 如果您的项目依赖 Jack,则应执行迁移,以便享受到 Android Studio 默认工具链所内置的 Java 8 支持。 使用默认工具链还支持使用 Java 8 语言功能的第三方库、Instant Run以及依靠.class中间文件的工具。

要停用 Jack 并切换至默认工具链,只需从您的模块build.gradle文件中移除jackOptions块即可:

android {
    ...
    defaultConfig {
        ...
        // Remove this block.
        jackOptions {
            enabled true
            ...
        }
    }

    // Keep the following configuration in order to target Java 8.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

从 Retrolambda 迁移

与 Android Studio 的默认工具链相比,Retrolambda 缺少对使用 Java 8 语言功能的第三方库的支持。 要迁移到默认工具链,请从您的项目级build.gradle文件中移除 Retrolambda 依赖项:

buildscript {
  ...
   dependencies {
      // Remove the following dependency.
      classpath 'me.tatarka:gradle-retrolambda:<version_number>'
   }
}

同时移除每个模块build.gradle文件中的 Retrolambda 插件和retrolambda块:

// Remove the following plugin.
apply plugin: 'me.tatarka.retrolambda'
...
// Remove this block after migrating useful configurations.
retrolambda {
    ...
    // If you have arguments for the Java VM you want to keep,
    // move them to your project's gradle.properties file.
    jvmArgs '-Xmx2048m'
}

停用对 Java 8 语言功能的支持

如果您遇到与 Java 8 语言功能支持相关的问题,可在gradle.properties文件中加入以下代码来停用此支持:

android.enableDesugar=false
优质内容筛选与推荐>>
1、各种经济学教材(从初级到高级)的简介
2、成交量分析与运用
3、如何删除Windows 7系统中被占用的文件
4、Minimum Depth of Binary Tree
5、AOP---Unity使用初探


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn