【问题标题】:Is it possible to use Java 8 for Android development?是否可以使用 Java 8 进行 Android 开发?
【发布时间】:2014-06-12 15:26:04
【问题描述】:

在网上搜索,不清​​楚Android开发是否支持Java 8。

在我下载/设置 Java 8 之前,能否有人指出我在任何“官方”文档中指出 Java 8 支持或不支持 Android 开发。

【问题讨论】:

标签: java android java-8 android-gradle-plugin


【解决方案1】:

容易记住的答案

在 android studio 点击项目结构图标然后进入 Modules/app 然后将 Source Compatibility 和 Target Compatibility 更改为 1.8 并点击 Ok。

【讨论】:

    【解决方案2】:

    您确实可以使用 gradle-retrolamba gradle build 依赖项来使用 Java 8 进行 Android 开发。

    以下是我最近为 Android 开发运行 lambda 表达式所遵循的完整指南。文末提到了本指南的原始出处。

    在本指南中,将一些 Java 8 功能引入 将演示Android开发工具,具体针对 Eclipse IDE。但是,将在本指南中描述的步骤也可能适用于谷歌的新发展 环境,Android Studio。它基于社区版 JetBrains 流行的 IntelliJ Idea IDE,它最近已经 谷歌于 2014 年 7 月上旬升级到其“测试版” 在编写本指南之前。 Eclipse 将继续保持领先地位 开发环境,至少有一段时间,并考虑到 事实上,大多数 Android 项目都是使用 Eclipse 开发的, 将新的 Java 8 特性(如 lambda 表达式)引入的方法 ADT 似乎对开发人员非常有用。

    Android 开发基于一个名为 Apache Harmony 项目于 2011 年终止。 Android 开发中常用的 Java 语法是 Java 6 (v1.6) 和 KitKat 版本也部分支持 Java 7 (v1.7) (安卓 4.4.+)。因此,Java 8 的 lambda 表达式等特性 不能直接在Android App Development中使用 对开发工具进行一些调整。幸运的是,这些 结构基本上是一些“语法糖”增强 给开发人员诸如“匿名类”之类的缺点 并且它们可以被翻译成 Java 6 或 Java 7 类。

    一种将 Java 8 源代码转换为较低 Java 的最新方法 版本称为 RetroLambda。该库使开发人员运行 Java 8 代码在 Java 7 甚至更低版本上带有 lambda 表达式。 不幸的是,除了 lambda 表达式之外,Java 8 的特性并没有 RetroLambda 目前支持,但 lambda 表达式的概念 是 Java 8 平台上最大的飞跃,它是一个很好的工具 无论如何都是 Android 开发者。

    关于这个库的详细信息可以在它的 GitHub 页面上找到:

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

    另外,另一个开发者为 RetroLambda 创建的 Gradle 插件 允许在 Java 或 Android 中实现基于 Gradle 的构建 项目。但是,开发人员只提到了集成这个 Android Studio 环境中的插件。详细信息可以在其上找到 GitHub页面:

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

    在基于 Eclipse 的开发中使用这些基础架构 环境不能直接接近,但它是可行的,并且将是 在本指南中进行了演示。

    准备

    本指南假设读者对 Android 开发有基本的了解,并且它基于 ADT 版本 22.6.2,因为最近的 ADT 版本 23.0.2 似乎存在布局文件夹创建等问题。有关此问题的详细信息,请参阅以下链接:

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

    本指南中的步骤将针对 Windows 8.1 64 位 开发机器给出,但它们可以很容易地适应其他平台。新的构建系统Gradle 将用于构建/清理过程,还将提供其安装过程。此外,JDK 8JDK 7 必须在开发机器上共存。必须按照以下步骤进行安装:

    • 转到 JDK 8 早期访问预览页面http://jdk8.java.net
    • 下载 JDK 8u20 并安装。 JRE 8 安装不是必须的,可以跳过
    • 转到JDK 7最新稳定版页面http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
    • 下载 JDK 7u65 并安装。再次不需要安装 JRE 7,可以跳过
    • 将 JDK 8 主文件夹和 JDK 8 bin 文件夹添加到您的 %PATH% 变量中
    • 使用JDK 8主文件夹的路径值创建一个新的环境变量JAVA_HOME
    • 使用JDK 8主文件夹的路径值再次创建一个新的环境变量JAVA8_HOME
    • 使用JDK 7主文件夹的路径值创建一个新的环境变量JAVA7_HOME
    • 打开终端窗口并运行 java -version 命令并验证 Java 8 是否已启动并正在运行
    • 在同一窗口中运行javac -version 命令并验证JDK 8 Java 编译器是否也已启动并运行

    现在,必须从以下链接下载 ADT-22.6.2:

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

    • 下载 ADT 并将其内容解压缩到一个文件夹中,例如D:\adt
    • 使用 ADT 安装文件夹的路径值定义一个名为 ANDROID_HOME 的新环境变量,例如D:\adt\sdk
    • 添加您的 Android SDK Platform ToolsAndroid SDK Tools 文件夹,例如D:\adt\sdk\toolsD:\adt\sdk\platform-tools,到你的 %PATH% 变量
    • 如果您愿意,可以创建 Eclipse IDE 的快捷方式。它位于您的 ADT 安装文件夹下,例如D:\adt\eclipse
    • 运行 Eclipse IDE 并创建一个工作区,例如D:\adt\workspace
    • 点击工具栏上的Android SDK Manager按钮
    • 仅选择 Android SDK Build tools Rev. 19.1Android Support Library。取消选择其他所有内容并安装这两个包。

    如果一切顺利,ADT 将启动并运行。

    还强烈建议安装以下工具:

    • Eclipse Kepler Java 8 支持:它使 Eclipse 能够识别新的 Java 8 语法扩展,并使您摆脱 Java 代码编辑器中烦人的 red dots。它可能通过 Eclipse 中的Help -> Install New Software 安装。在Work with字段中输入http://download.eclipse.org/eclipse/updates/4.3-P-builds/并继续安装。

    • Nodeclipse/Enide Gradle:主要用于高亮Groovy语言关键字。 Groovy 用作 Gradle 构建脚本的 DSL。这个插件可以通过Eclipse Marketplace安装。但是,ADT-22.6.2 中的 Eclipse 不附带 Eclipse Marketplace Client。因此,您首先需要通过 Eclipse 中的Install New Software 工具安装Eclipse Marketplace Client。在Work with字段中输入http//:download.eclipse.org/mpc/kepler/并继续安装。安装Eclipse Marketplace Client后,可以在Eclipse Marketplace Client中搜索Nodeclipse/Enide Gradle进行安装。

    • Genymotion 虚拟设备:它可以很好地替代 ADT 附带的默认 Android Virtual Device。 AVD 非常麻烦,而且它会无缘无故地崩溃。 Genymotion 让您使用由Oracle VirtualBox 执行的CyanogenMod 图像准备Android VD。它的单用户许可证是免费的,可以从http://www.genymotion.com 下载。只需要登录,也可以集成到 Eclipse 中。详情请见:

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

    以下是基于 Android 4.3 的 CyanogenMod 虚拟设备的屏幕截图,

    它可能被视为在基于 x86 或 x64 的个人计算机上运行的成熟 Android 设备。为了在此虚拟设备上使用 Google PlayStore 等 Google 服务,必须将其使用的 Android 版本的 gapps 映像刷到设备上。可以从 CyanogenMod 网站下载适合设备的 gapps 图像:

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

    Gradle 安装是可选的,因为它也由 Android SDK 本身提供,但强烈建议单独安装。可以按照以下步骤进行安装:

    • 转到 Gradle 网站:http://www.gradle.org/

    • 点击Downloads

    • Previous Releases 下选择 1.10 版本并下载 gradle-1.10-all.zipgradle-1.10-bin.zip

    • 将其内容解压缩到一个文件夹中,例如D:\adt\gradle

    • 使用 Gradle 安装文件夹的路径值定义一个名为 GRADLE_HOME 的新环境变量,例如D:\adt\gradle

    • 添加您的 Gradle 二进制文件文件夹,例如D:\adt\gradle\bin,到你的 %PATH% 变量

    • 打开终端窗口并运行gradle -v 命令并验证它是否已启动并正在运行 如果您已成功达到这一点,则意味着您已准备好使用 Java 8 功能创建您的第一个 Android 应用程序。

    演示应用

    将创建一个简单的应用程序来演示上一节中描述的工具的用法。 您可以简单地按照下面给出的步骤来深入了解在 Android 开发者工具中使用 lambda 表达式:

    • 运行 Eclipse IDE 并通过选择 File -> New -> Other -> Android -> Android Application Project 创建一个新的 Android 应用程序
    • 如下所示填写出现的表格:

    • 只需单击以下表单上的Next 按钮,然后单击最后一个表单上的Finish 按钮。等到 ADT 完成加载项目

    • 右键单击项目并选择New -> Folder并将其命名为builders

    • 右键单击gen (Generated Java Files) 文件夹并将其删除。 Gradle 很快会为我们生成相同的文件,我们会将它们添加到由默认 Ant 构建器创建的 projects build path. The gen` 文件夹中,不再需要该文件夹下的工件,该文件夹下的工件将被废弃

    • builders文件夹下创建以下批处理文件:

      - gradle_build.cmd
      - gradle_post_build.cmd
      - gradle_clean.cmd
      
    • 按如下方式填写这些批处理文件:

    gradle_build.cmd:

    gradle_post_build.cmd:

    gradle_clean.cmd:

    • 取消选择Project -> Build Automatically 菜单选项
    • 右键单击项目并选择Properties -> Builders 并取消选择ADT 提供的所有默认构建器
    • 单击同一窗口中的New 按钮并选择Program 并单击OK
    • 将出现新的构建器配置窗口。填写其标签如下:

    Main 新生成器配置选项卡

    Refresh 新生成器配置选项卡

    Environment 新生成器配置选项卡

    Build Options 新生成器配置选项卡

    • 创建名为Gradle_Post_Build 的第二个构建器,它使用gradle_post_build.cmd 作为其程序。此构建器的所有其他设置必须与之前创建的构建器完全相同。此构建器将负责将构建过程创建的工件复制到 bin 文件夹中。
    • 创建名为Gradle_Cleaner 的第三个构建器,它使用gradle_clean.cmd 作为其程序。只有最后一个选项卡中的Run the builder 设置必须设置为During a Clean。此构建器的所有其他设置必须与第一个构建器完全相同。顾名思义,此构建器将负责清理由构建过程创建的工件。

    HelloLambda 项目的新建设者

    • 右键单击项目并选择Export
    • 选择Android -> Generate Gradle Build Files并点击Next
    • 在下一个窗口中选择项目并点击Finish
    • 转到项目的根文件夹并删除文件gradlewgradlew.bat。同时删除gradle文件夹
    • 切换回 Eclipse 并选择 Project -> Clean 菜单选项。填写如下所示的表格:

    Clean Project窗口

    • 点击OK,等待清理过程完成
    • MainActivity 类中调用setContentView 函数后添加下面给出的Java 代码sn-p:

    • build.gradle 文件的开头更改为sourceCompatibility 部分,如下所示:

    • 右键单击项目并选择 Properties -> Java Compiler 选项并将所有合规级别设置为 Java 8。这将使 Eclipse 识别新的 Java 8 结构,如 lambda 表达式。
    • 在通知窗口中点击No
    • 右键单击项目并选择Build project。 Eclipse 将开始构建项目。

    构建过程

    • 右键单击项目并转到Properties -> Java Build Path。将以下文件夹添加到构建路径(也如下图所示):

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

    Eclipse 现在能够识别R.javabuildConfig.java 文件,并且不会显示任何red dots,它表示与项目的资源文件相关的错误。

    • 通过右键单击项目然后选择Run As -> Run Configurations,为您的Android 目标平台创建一个新的Run Configuration。例如,这个演示应用程序在 Genymotion VD 上如下所示:

    HelloLambda 应用程序

    您可以在LogCat 窗口中观察到带有简单 lambda 表达式的代码 sn-p 可以正常工作

    来源:Using Java 8 Lambda Expressions in Android Developer Tools

    【讨论】:

    • 但是您可以使用 Android 调试器调试此代码吗?我的猜测是堆栈/行号不兼容。似乎是在 Android 上使用 Java 8 开发的一个主要缺点。
    • @Zombies 是的,您仍然可以调试它。一切正常。
    【解决方案3】:

    Android Gradle 插件 3.0.0 及更高版本支持所有 Java 7 语言功能和 Java 8 语言功能的子集,这些功能因平台版本而异。使用 Android Gradle 插件 4.0.0 及更高版本构建应用时,您可以使用多种 Java 8 语言 API,而无需为应用设置最低 API 级别。

    本页介绍了您可以使用的 Java 8 语言功能、如何正确配置您的项目以使用它们,以及您可能遇到的任何已知问题。

    因为这篇文章会对你有所帮助。我会把这里的链​​接放在下面 https://developer.android.com/studio/write/java8-support

    【讨论】:

      【解决方案4】:

      添加 Java 8 支持的最简单方法

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

      只需将其添加到您的 build.gradle 文件中即可。

      【讨论】:

      • 重复答案,低质量
      【解决方案5】:

      2020 年 1 月 17 日更新

      Android Studio 4.0 包括对使用多种 Java 8 语言 API 的支持,通过使用称为去糖的技术,无需为您的应用提供最低 API 级别:
      https://developer.android.com/studio/preview/features#j8-desugar

      此版本支持以下 API 集:

      • 顺序流 (java.util.stream)
      • java.time 的子集
      • java.util.function
      • 最近添加到java.util.{Map,Collection,Comparator}
      • 可选(java.util.Optionaljava.util.OptionalIntjava.util.OptionalDouble)和其他一些对 以上API
      • java.util.concurrent.atomic 的一些补充(AtomicIntegerAtomicLongAtomicReference 上的新方法)
      • ConcurrentHashMap(修复了 Android 5.0 的错误)

      为了支持这些语言 API,D8 编译了一个单独的库 DEX 包含缺失 API 的实现的文件,包括 它在你的应用程序中。脱糖过程将您的应用程序代码重写为 而是在运行时使用这个库。

      要启用对这些语言 API 的支持,请在 你模块的build.gradle 文件:

      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'
      }
      

      2017 年的原帖

      Android Studio 3.0 开始为一些 Java 8 语言功能提供内置支持,这些功能包括:

      • Lambda 表达式
      • 方法参考
      • 类型注释(信息在编译时可用,但在运行时不可用)
      • 重复注释
      • 默认和静态接口方法

      此外,从 API 级别 24 开始,以下 Java 8 API 可用:

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

      除此之外,try-with-resources 支持已扩展到所有 Android API 级别。

      承诺将来会添加更多 Java 8 功能。

      要开始使用受支持的 Java 8 语言功能,请更新 Android 插件到 3.0.0-alpha1(或更高版本)并将以下内容添加到您的 模块的 build.gradle 文件:

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

      更多详情请访问:
      https://developer.android.com/studio/write/java8-support.html

      【讨论】:

      • 我不明白的是,android studio 与 java8 支持有什么关系(intellij 以前没有它)?!这是否意味着如果我在终端上使用 gradle 来编译它不会编译的项目?!
      • @cesarferreira 您需要将 Android 插件更新到最新版本(目前为 2.4.0-alpha6)。请检查答案中的引号。
      • 将它添加到我正在使用的模块(不是应用程序)中是关键。添加到应用模块没有帮助。
      • 那么我们也可以在 API 21 中使用 Java 8 吗?
      • @H.Karatsanov 是的,您可以在 API 21 中使用 Java 8 语言功能,并且可以借助 Android Studio 4.0+ 中提供的脱糖功能使用提到的 Java 8 API
      【解决方案6】:

      是的,您可以在 Android Studio 中使用 Java 8 语言功能,但版本必须为 3.0 或更高版本。阅读这篇文章,了解如何在 android studio 中使用 java 8 功能。

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

      【讨论】:

        【解决方案7】:

        2019 年 10 月 28 日更新

        Android Studio 4.0 解决了这个问题issue

        D8 编译器在编译时将 Java 8 本机 API 的反向移植修补到您的 APK 中,您的应用将在运行时使用该代码,而不是本机 API。该过程称为desugaring

        【讨论】:

          【解决方案8】:

          简单的方法

          您可以为 android 项目启用 java 1.8 支持。

          • 打开项目结构

            • 通过按 Ctrl + Shift + Alt + S

            • File > Project Structure

          • 在项目结构对话框中将 Source CompatibilityTarget Compatibility 更新为 1.8,如图所示(单击 File > Project Structure) .

          或者你可以使用gradle

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

          同步项目。就是这样!

          注意:可以为 Android Studio 3.0.0 或更高版本启用 Java 1.8 支持。如需进一步阅读,请参阅Documentation

          【讨论】:

          【解决方案9】:

          上述所有解决方案似乎都不适用于 2019 最新的 Android Studio 3.4+

          我想出了一个完美的最新解决方案,可以将您的 Android 项目迁移或升级到 Java 8

          解决方案: 点击文件 -> 项目结构 -> 模块 -> 属性选项卡。

          Source CompatibilityTarget Compatibility 更改为 1.8 (Java 8)

          【讨论】:

            【解决方案10】:

            将此行添加到模块 lvl buildgradel

            compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

            【讨论】:

              【解决方案11】:

              Android Studio 现在支持 Java 8 的一个子集。只需从下面的窗口进行源和目标兼容性调整:

              文件 --> 项目结构

              更多信息在下面的链接中给出。

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

              【讨论】:

                【解决方案12】:

                2017 年 11 月 4 日更新 - Android Studio 3.0 现在原生支持 Java 8。 现在不再需要 gradle-retrolambda。见https://developer.android.com/studio/write/java8-support.html

                如果您使用gradle-retrolambda,上述链接还包括迁移说明。原答案如下:


                Android 不支持 Java 8。它只支持 Java 7(如果你有 kitkat)并且仍然没有 invokedynamic,只有新的语法糖。

                如果您想使用 lambdas,Android 中 Java 8 的主要功能之一,您可以使用gradle-retrolamba。它是一个集成了 retrolambda 的 gradle 构建依赖项,retrolambda 是一种将 Java 8 字节码转换回 Java 6/7 的工具。基本上,如果您在 Android Studio 中设置编译器来编译 Java 8 字节码,从而允许 lambda,它会将其转换回 Java 6/7 字节码,然后再转换为 dalvik 字节码。如果您想在 Android 中尝试一些 JDK 8 功能来代替官方支持,这是一个 hack。

                【讨论】:

                • 让它工作起来有点困难,但一旦我真正遵循了正确的指示,它就会很好地工作。 Eclipse 用户注意:Eclipse 不能很好地处理这个问题,我建议迁移到 Android Studio(我会想念 Eclipse,但现在必须这样!)
                • Nitpick:Android 不支持 Java 7 中的 multi-catch 子句。
                • 支持Multi-catch,只有Android不支持的JDK7特性是try-with-resources
                • Java 7 适用于所有版本的 Android。一个例外:try-with-resources 仅在 Kitkat 之后有效。
                • @Simon André Forsberg(注意:不要脸的插件!) - 至于不支持 Java 8 流 API,您可以在 sourceforge.net/projects/streamsupport 使用我的库 - 它明确解决了对 Android 的支持。
                【解决方案13】:

                原生 Java 8 登陆 Android!终于!

                从每个模块的 build.gradle 文件:

                要禁用 Jack 并切换到默认工具链,只需删除 模块的 build.gradle 文件中的 jackOptions 块

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

                从 Android Studio 3.0 开始,Android 现在原生支持 Java 8 语言功能:

                • Lambda 表达式
                • 方法参考
                • 类型注解(目前类型注解信息在运行时不可用,仅在编译时可用);
                • 重复注释
                • 默认和静态接口方法(API 级别 24 或更高,不支持即时运行);

                此外,从最低 API 级别 24 开始,以下 Java 8 API 可用:

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

                将这些行添加到应用程序模块的 build.gradle 以告知项目语言级别:

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

                通过将以下内容添加到您的 gradle.properties 文件中来禁用对 Java 8 语言功能的支持:

                android.enableDesugar=false
                

                你已经完成了!您现在可以使用本机 java8!

                【讨论】:

                  【解决方案14】:

                  点击此链接获取最新更新。 Use Java 8 language features

                  旧答案

                  截至 Android N preview 发布 Android 支持 Java 8有限功能,请参阅Java 8 Language Features

                  要开始使用这些功能,您需要下载并设置 Android Studio 2.1 和 Android N Preview SDK,其中包括 需要 Jack 工具链和更新的 Android 插件 for Gradle。如果你 尚未安装 Android N Preview SDK,请参阅Set Up to Develop for Android N

                  支持的 Java 8 语言功能和 API

                  Android 目前不支持所有 Java 8 语言功能。 但是,现在在开发应用程序时可以使用以下功能 针对 Android N 预览版:

                  Default and static interface methods

                  Lambda expressions(也适用于 API 级别 23 及更低级别)

                  Repeatable annotations

                  Method References(也适用于 API 级别 23 及更低级别)

                  Android 支持一些额外的 Java 8 功能,您可以在Java 8 Language Features 中查看完整的详细信息

                  更新

                  注意:Android N 的 lambda 表达式实现基于 匿名类。这种方法允许他们倒退 在早期版本的 Android 上兼容和可执行。去测试 早期版本的 lambda 表达式,记得去你的 build.gradle 文件,并将 compileSdkVersion 和 targetSdkVersion 设置为 23 或更低。

                  更新 2

                  现在 Android Studio 3.0 稳定版支持Java 8 libraries and Java 8 language features(没有 Jack 编译器)。

                  【讨论】:

                  • 我什么都不懂。 minSdkVersion有什么要求吗?
                  • 我认为只有 lambda 表达式是向后兼容的,其他 Java 8 特性只能在 N(或未来版本)上工作。我没有对此进行测试,但这是我从 Android 文档中了解到的。因此,对于 Java 8 功能 minSdkVersion 是 N,而不是 lambda 表达式
                  • 所以......再过几年,直到 N 成为仪表板的领导者。 :(
                  • 不幸的是,是的。或者直到 Android 以某种方式提供像 lambda 一样的向后兼容性
                  • @WindRider,您可以使用 minSdkVersion 15 及更高版本。目前我在我的带有 Lambdas 的 Android 项目中使用 minSdkVersion 17,一切正常。
                  【解决方案15】:

                  java 8

                  Android 支持所有 Java 7 语言功能和 Java 8 语言功能的子集,这些功能因平台版本而异。

                  检查支持java 8的哪些特性

                  Use Java 8 language features

                  我们决定将对 Java 8 语言功能的支持直接添加到当前的 javac 和 dx 工具集中,并弃用 Jack 工具链。有了这个新的方向,依赖于 Java 类文件格式的现有工具和插件应该可以继续工作。展望未来,Android 构建系统将原生支持 Java 8 语言功能。我们的目标是在未来几周内将其作为 Android Studio 的一部分推出,我们希望尽早与您分享这一决定。

                  Future of Java 8 Language Feature Support on Android

                  Eclipse 用户:

                  对于喜欢 Eclipse 的老开发者,google stops support Eclipse Android Developer tools

                  如果你安装了 Java 8 JDK,那就试试看,如果出现任何问题,尝试在 Eclipse 中从窗口菜单 → PreferencesJava 将编译器设置为 1.6 → 编译器。 Java 7 也可以使用:

                  如果您的目标是 Android 5.0 和 更高。

                  安装多个JDK并尝试。

                  【讨论】:

                  • Java 8 是否改变了字节码的工作方式?如果没有,理论上使用任何版本的 Java 都应该没问题,只要它可以编译。
                  • 正确的问题是:如果你使用java 8 中不存在的java 7 中的新特性来构建android 应用程序,可以吗?为了安全起见,请遵循官方指示。
                  • @BenC.R.Leggiero Java 8 中没有新的字节码,但是指令的含义和结构发生了变化stackoverflow.com/questions/28228450/…stackoverflow.com/questions/16143684/…
                  • 请不要在您的答案中发布“更新 N”。重写它以获取最新信息。否则,SO 将在几年内像它所取代的论坛一样难以获取信息。
                  • 答案需要更新。从 Android Studio 3.0 和 Gradle Plugin 3.0 起将支持 Java 8。
                  【解决方案16】:

                  添加以下内容为我解决了这个问题(Android Studio 2.3.2):

                  build.gradle(项目)

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

                  build.gradle(模块: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
                      ...
                  }
                  

                  【讨论】:

                    【解决方案17】:

                    我在 3 年前问过这个问题,显然这些年来答案已经发生了变化。正如上面许多人已经回答的那样,在过去的某个时候,答案变成了Yes。我从未更新接受的答案,因为它当时是正确的答案。 (我不确定 Stack Overflow 的政策是什么)

                    我只是想为仍在搜索此主题的人添加另一个答案。截至 2017 年 5 月 17 日,Google 还宣布 Kotlin 也是 Android 开发的官方语言。

                    我还没有找到官方新闻稿,但我确实观看了一些 Google I/O videos 宣布它的地方。这是 Kotlin 团队在公告中发布的博客 post 的链接。

                    【讨论】:

                      【解决方案18】:

                      是的。我们很快就会使用 Java 8!

                      我们决定将对 Java 8 语言功能的支持直接添加到当前的 javac 和 dx 工具集中,并弃用 Jack 工具链。有了这个新的方向,依赖于 Java 类文件格式的现有工具和插件应该可以继续工作。展望未来,Android 构建系统将原生支持 Java 8 语言功能。我们的目标是在未来几周内将其作为 Android Studio 的一部分推出,我们希望尽早与您分享这一决定。

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

                      【讨论】:

                        【解决方案19】:

                        Google 刚刚宣布 Android 将原生支持 Java 8,并且将弃用 Jack 工具链:

                        我们决定将对 Java 8 语言功能的支持直接添加到当前的 javac 和 dx 工具集中,并弃用 Jack 工具链。有了这个新的方向,依赖于 Java 类文件格式的现有工具和插件应该可以继续工作。展望未来,Android 构建系统将原生支持 Java 8 语言功能。我们的目标是在未来几周内将其作为 Android Studio 的一部分推出,我们希望尽早与您分享这一决定。

                        更多信息在这里: https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

                        【讨论】:

                          【解决方案20】:

                          是的,Android 现在支持 Java 8 (24.1.17)

                          现在可以了

                          但是您需要让您的设备 rom 在 java 1.8 上运行并启用“jackOptions”来运行它。 Jack 是运行 Java 8 的新 Android 编译器的名称

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

                          将这些行添加到 build_gradle

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

                          Java 8 似乎是 Android Studio 2.0 的运行 Java 引擎, 但是经过我检查它仍然不接受java 8的语法,你现在不能从android studio中选择编译器。但是,如果您需要在您的 android 客户端中使用函数式编程机制,您可以使用 scala 插件。

                          【讨论】:

                          • Scala 与 apk 一起打包会很重
                          • 请参阅此解决方案以获取更新的 android studio 2.0,因为他们已对有限的配置选项进行了更新。
                          【解决方案21】:

                          我想我会为那些寻找更新的东西的人发布一个更新的答案。

                          目前,Android 和 Android Studio 支持 Java 8 功能的子集。根据位于on their website 的Android 文档,谷歌表示:

                          对 Java 8 语言功能的支持需要一个名为 Jack 的新编译器。 Jack 仅在 Android Studio 2.1 及更高版本上受支持。所以如果你想使用 Java 8 语言特性,你需要使用 Android Studio 2.1 来构建你的应用程序。

                          如果您已经安装了 Android Studio,请确保通过点击帮助 > 检查更新(在 Mac 上,Android Studio > 检查更新)更新到最新版本。如果您的工作站上尚未安装 IDE,请在此处下载 Android Studio。

                          支持的 Java 8 语言功能和 API

                          Android 不支持所有 Java 8 语言功能。但是,在开发面向 Android 7.0(API 级别 24)的应用时,可以使用以下功能:

                          • 默认和静态接口方法 Lambda 表达式(也可用于 API 级别 23 及更低级别)
                          • 可重复的注释
                          • 方法参考(也可用于 API 级别 23 及更低级别)
                          • 类型注释(API 级别 23 及更低级别也可用)

                          此外,还提供以下 Java 8 语言 API:

                          反射和语言相关的 API:

                          • java.lang.FunctionalInterface
                          • java.lang.annotation.Repeatable
                          • java.lang.reflect.Method.isDefault() 和与可重复注解关联的反射 API,例如 AnnotatedElement.getAnnotationsByType(Class)

                          实用程序 API:

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

                          为了使用新的 Java 8 语言功能,您还需要使用Jack toolchain。这个新的 Android 工具链将 Java 语言源代码编译为 Android 可读的 DEX 字节码,拥有自己的 .jack 库格式,并将大多数工具链功能作为单个工具的一部分提供:重新打包、收缩、混淆和 multidex。

                          以下是用于构建 Android DEX 文件的两个工具链的比较:

                          Legacy javac toolchain:
                              javac (.java → .class) → dx (.class → .dex)
                              New Jack toolchain:
                              Jack (.java → .jack → .dex)
                          

                          【讨论】:

                            【解决方案22】:

                            Android 使用从 Java 6 分支出来的 Java。

                            从 Android SDK 版本 19 开始,您可以使用 Java 7 功能by doing this。不完全支持 Java 8(目前)。

                            【讨论】:

                            • 你是救生员。你知道是否还有一些东西可以以类似的方式实现 try-with-resources?
                            • @galets 目前还没有办法,但我敢打赌谷歌会在未来的某个时候添加它。更多信息,请参阅:stackoverflow.com/questions/16921337/…
                            【解决方案23】:

                            添加此配置 build.gradle 并同步 gradle:

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

                            【讨论】:

                            • 这是为 Android 项目添加对 Java 8 支持的正确方法。缺点是启用 jack 时即时运行当前不会运行。
                            • 不完全支持。
                            【解决方案24】:

                            我在 Stack Overflow 上给 similar question 写了一个 similar answer,但这是答案的一部分。

                            Android Studio 2.1:

                            新版 Android Studio (2.1) 支持 Java 8 功能。这是Android Developers blogspot post的摘录:

                            ...Android Studio 2.1 版本包括对新的Jack compiler 的支持和对Java 8 的支持。

                            ...

                            要在使用 N Developer Preview 进行开发时使用 Java 8 语言功能,您需要使用 Jack 编译器。新建项目向导 [File→ New→ Project] 为针对 N 的项目生成正确的配置。


                            Android Studio 2.1 之前的版本:

                            Android 尚不支持 Java 1.8(它只支持最高 1.7),因此您不能使用 Java 8 的功能,如 lambda。

                            This answer gives more detail on Android Studio's compatibility;它指出:

                            如果你想使用 lambdas,Android 中 Java 8 的主要特性之一,你可以使用 gradle-retrolamba

                            如果您想了解更多关于使用gradle-retrolambdathis answer gives a lot of detail on doing that的信息。

                            【讨论】:

                            • 嗨法博德!我正在使用 AndroidStudio 2.2.2 我的 "SDK Location"(这是在 Mac FWIW 上)只是说 "/Users/me/Library/Android/sdk" 我在使用 Java8 - 如何使用 Java8?谢谢!
                            【解决方案25】:

                            最新消息:

                            Google 宣布 Android N 和 Android Studio 2.1+ 平台将支持 Java 8。还发布了稳定版的 studio 2.1。

                            最后我们可以使用 lambda 表达式了。 for 循环中不再有列表过滤器。好啦。

                            【讨论】:

                              【解决方案26】:

                              Android 从 Android N 开始正式支持 Java 8。

                              Feature announcements are here,Java 8 语言公告是:

                              改进的 Java 8 语言支持 - 我们很高兴将 Java 8 语言功能引入 Android。使用 Android 的 Jack 编译器,您可以 现在使用许多流行的 Java 8 语言特性,包括 lambdas 和 更多,早在 Gingerbread 的 Android 版本上。新功能 帮助减少样板代码。例如,lambdas 可以替换 提供事件侦听器时的匿名内部类。一些Java 8 语言特性——如默认和静态方法、流和 功能接口——现在也可以在 N 及更高版本上使用。和 杰克,我们期待着更密切地跟踪 Java 语言 同时保持向后兼容性。

                              【讨论】:

                              • 目前仍然有很多错误,例如 Instant Run 不适用于 lambda:如果您更改 lambda 函数中的某些代码,它不会接受更改。
                              【解决方案27】:

                              大约 2 年前,当我问这个问题时,答案确实是“官方”不,但正如 ekcr1 的回答所指出的那样,如果您使用retrolamba,您可以获得最受期待的功能之一(lambdas)。当时我还在用eclipse,因为Android Studio处于“预览”模式,所以我从来没有走这条路。

                              今天,我认为“官方”的答案仍然是否定的,虽然 Retrolamba 似乎仍然是一个不错的选择,但对于那些愿意走“非官方”路线的人来说,还有另一种选择,即 Kotlin。

                              今天 Kotlin 达到了 1.0.0。对于那些不熟悉 Kotlin 的人,可以在他们的网站上找到更多信息:

                              https://kotlinlang.org

                              或观看杰克·沃顿 (Jake Wharton) 演讲的 utube 视频

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

                              【讨论】:

                                【解决方案28】:

                                我们可以使用 Java 8:

                                1. 在 build.gradle (Project: myProject) 中添加以下内容

                                  classpath 'me.tatarka:gradle-retrolambda:x.x.x' //x.x.x is recent version
                                  
                                2. 在 build.gradle (Module: myModule) 中添加以下内容

                                  apply plugin: 'me.tatarka.retrolambda'
                                  
                                  compileOptions {
                                      sourceCompatibility JavaVersion.VERSION_1_8
                                      targetCompatibility JavaVersion.VERSION_1_8
                                  }
                                  

                                【讨论】:

                                • 第一个推荐retro lambda的答案有什么不同?
                                • @MaartenBodewes 似乎指出它比公认的答案要简单得多。参考medium.com/android-news/…
                                • 不要使用它。插件有问题
                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2020-03-17
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多