ChatGPT解决这个技术问题 Extra ChatGPT

是否可以使用 Java 8 进行 Android 开发?

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

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

我不知道官方声明,但我已经让 Java 8(编辑:JDK 8)与 Android SDK 一起正常工作。 Windows 8.1 64 位在这里。
@HoangHuynh 您可以使用 JDK 6 或更高版本进行 Android 开发。但是,编译支持 Java 版本 6(如果是 KitKat,则支持 7)。我认为OP的意思也适用于java版本(不是JDK)
Android N 正式支持 Java 8。android-developers.blogspot.com/2016/03/…

e
ekcr1

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,只有新的语法糖。

如果您想使用 lambda(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 的支持。
E
Eng. Samer T

爪哇 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 的老开发人员,google stops support Eclipse Android Developer tools

如果您安装了 Java 8 JDK,请尝试一下,如果出现任何问题,请尝试在 Eclipse 中从窗口菜单 → 首选项 → Java → 编译器将编译器设置为 1.6。 Java 7 也可以:

https://i.stack.imgur.com/SCTyV.png

如果您的目标是 Android 5.0 或更高版本,则需要 Java 7 或更高版本。

安装多个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。
A
Axifive

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

下面是我最近遵循的为 Android 开发运行 lambda 表达式的完整指南。最后提到了本指南的原始来源。

在本指南中,将演示一种将一些 Java 8 功能引入 Android 开发工具的方法,特别针对 Eclipse IDE。但是,将在本指南中描述的步骤也可能适用于 Google 的新开发环境 Android Studio。它基于 JetBrains 流行的 IntelliJ Idea IDE 的社区版,最近在 2014 年 7 月上旬由 Google 升级到其“测试版”,略早于编写本指南。 Eclipse 至少在一段时间内仍将是主要的开发环境,考虑到大多数 Android 项目都是使用 Eclipse 开发的,一种将 Java 8 新特性(如 lambda 表达式)引入 ADT 的方法似乎对开发人员非常有用。 Android 开发基于一个名为 Apache Harmony Project 的自定义 Java 实现,该实现于 2011 年终止。Android 开发中最常用的 Java 语法是 Java 6 (v1.6),Java 7 (v1.7) 也部分支持KitKat 版本 (Android 4.4.+)。因此,如果不对开发工具进行一些调整,就不能直接在 Android 应用程序开发中使用 Java 8 功能(如 lambda 表达式)。幸运的是,这些构造基本上是一些“语法糖”的增强,它为开发人员提供了诸如“匿名类”之类的缺点,它们可以被翻译成 Java 6 或 Java 7 类。最近有一种将 Java 8 源代码转换为较低 Java 版本的方法称为 RetroLambda。该库使开发人员可以在 Java 7 甚至更低版本上使用 lambda 表达式运行 Java 8 代码。不幸的是,RetroLambda 目前不支持除 lambda 表达式之外的 Java 8 功能,但 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 Tools 和 Android SDK Tools 文件夹(例如 D:\adt\sdk\tools 和 D:\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.1 和 Android Support Library。取消选择其他所有内容并安装这两个软件包。

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

强烈建议安装以下工具:

Eclipse Kepler Java 8 支持:它使 Eclipse 能够识别新的 Java 8 语法扩展,并使您摆脱 Java 代码编辑器中恼人的红点。它可以通过 Help -> Install New Software in Eclipse 安装。在 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 虚拟设备的一个很好的替代品。 AVD 非常麻烦,而且它会无缘无故地崩溃。 Genymotion 让您使用由 Oracle VirtualBox 执行的 CyanogenMod 图像准备 Android VD。它的单用户许可证是免费的,可以从 http://www.genymotion.com 下载。只需要登录,也可以集成到 Eclipse 中。详情可参见:

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

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

https://i.stack.imgur.com/iow9j.png

它可能被视为在基于 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/

点击下载

在 Previous Releases 下选择 1.10 版本并下载 gradle-1.10-all.zip 或 gradle-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 App

填写出现的表格,如下所示:

https://i.stack.imgur.com/JVoe4.png

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

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

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

在builders文件夹下创建以下批处理文件: - gradle_build.cmd - gradle_post_build.cmd - gradle_clean.cmd

填写这些批处理文件如下:

gradle_build.cmd:

https://i.stack.imgur.com/8cUqV.png

gradle_post_build.cmd:

https://i.stack.imgur.com/5zYJt.png

gradle_clean.cmd:

https://i.stack.imgur.com/YBqEe.png

取消选择项目 -> 自动构建菜单选项

右键单击项目并选择 Properties -> Builders 并取消选择 ADT 提供的所有默认构建器

单击同一窗口中的新建按钮并选择程序,然后单击确定

将出现新的构建器配置窗口。按如下方式填写其选项卡:

Main 新构建器配置选项卡

https://i.stack.imgur.com/w1Rw4.png

Refresh 新构建器配置选项卡

https://i.stack.imgur.com/YpGL5.png

Environment 新构建器配置选项卡

https://i.stack.imgur.com/0OSHU.png

Build Options 新构建器配置选项卡

https://i.stack.imgur.com/5BoyE.png

创建名为 Gradle_Post_Build 的第二个构建器,它使用 gradle_post_build.cmd 作为其程序。此构建器的所有其他设置必须与之前创建的构建器完全相同。此构建器将负责将构建过程创建的工件复制到 bin 文件夹中。

创建名为 Gradle_Cleaner 的第三个构建器,它使用 gradle_clean.cmd 作为其程序。只有在最后一个选项卡中运行构建器设置必须设置为在清洁期间。此构建器的所有其他设置必须与第一个构建器完全相同。顾名思义,这个构建器将负责清理由构建过程创建的工件。

HelloLambda 项目的新建设者

https://i.stack.imgur.com/0DC3V.png

右键单击项目并选择导出

选择 Android -> Generate Gradle Build Files 并点击 Next

在下一个窗口中选择项目,然后单击完成

转到项目的根文件夹并删除文件 gradlew 和 gradlew.bat。同时删除 gradle 文件夹

切换回 Eclipse 并选择 Project -> Clean 菜单选项。填写显示如下的表格:

Clean Project 窗口

https://i.stack.imgur.com/Yn4Sz.png

单击确定并等待清洁过程完成

在 MainActivity 类中调用 setContentView 函数之后添加下面给出的 Java 代码片段:

https://i.stack.imgur.com/XqeCX.png

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

https://i.stack.imgur.com/GSS1F.png

右键单击项目并选择 Properties -> Java Compiler 选项并将所有合规级别设置为 Java 8。这将使 Eclipse 识别新的 Java 8 结构,如 lambda 表达式。

在通知窗口中单击否

右键单击项目并选择构建项目。 Eclipse 将开始构建项目。

https://i.stack.imgur.com/1JNEM.png

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

构建\源\buildConfig\调试

构建\源\r\调试

https://i.stack.imgur.com/q5Yiv.png

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

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

HelloLambda 应用程序

https://i.stack.imgur.com/9paAZ.png

您可能会在 LogCat 窗口中观察到带有简单 lambda 表达式的代码片段可以正常工作

https://i.stack.imgur.com/6lYDI.png

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


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

按照此链接获取新的更新。 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 Plugin for Gradle。如果您尚未安装 Android N Preview SDK,请参阅设置为 Android N 开发。

支持的 Java 8 语言功能和 API

Android 当前不支持所有 Java 8 语言功能。但是,在开发面向 Android N Preview 的应用程序时,现在可以使用以下功能:

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 并且一切正常。
s
sivi

是的,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 插件。

https://i.stack.imgur.com/XVIKB.png


使用 apk 打包 Scala 会很重
请参阅此解决方案以获取更新的 android studio 2.0,因为他们已对有限的配置选项进行了更新。
A
Adam Burley

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

从 Android SDK 版本 19 开始,您可以使用 Java 7 功能by doing this。还没有完全支持 Java 8。


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

原生 Java 8 登陆 Android!最后!

从每个模块的 build.gradle 文件中删除 Retrolambda 插件和 retrolambda 块:要禁用 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!


J
Jason

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

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

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


目前它仍然有很多问题,例如 Instant Run 不适用于 lambda:如果您更改 lambda 函数中的某些代码,它不会接受更改。
S
Sri Harsha Chilakapati

我们可以通过以下方式使用 Java 8:

在 build.gradle (Project: myProject) 添加以下类路径 'me.tatarka:gradle-retrolambda:xxx' //xxx 是最新版本 在 build.gradle (Module: myModule) 添加以下应用插件:'me.tatarka.retrolambda' compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }


与推荐复古 lambda 的第一个答案有什么不同?
@MaartenBodewes 似乎指出它比公认的答案要简单得多。参考medium.com/android-news/…
不要使用它。插件有问题
I
Idolon

更新 2020/01/17

Android Studio 4.0 包括对使用多种 Java 8 语言 API 的支持,通过使用称为脱糖的技术,无需为您的应用提供最低 API 级别:
{1 }

此版本支持以下 API 集: 顺序流 (java.util.stream) java.time java.util.function 的子集 java.util.{Map,Collection,Comparator} 的最新添加选项 (java.util .Optional、java.util.OptionalInt 和 java.util.OptionalDouble) 和其他一些对上述 API 有用的新类 java.util.concurrent.atomic 的一些补充(AtomicInteger、AtomicLong 和 AtomicReference 上的新方法) ConcurrentHashMap(带有错误修复对于 Android 5.0)为了支持这些语言 API,D8 编译了一个单独的库 DEX 文件,其中包含缺少的 API 的实现并将其包含在您的应用程序中。脱糖过程会重写您的应用程序代码,以在运行时使用此库。要启用对这些语言 API 的支持,请在模块的 build.gradle 文件中包含以下内容: true // 将 Java 兼容性设置为 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
K
Khemraj Sharma

简单的方法

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

通过按 Ctrl + Shift + Alt + S 或 File > Project Structure 打开项目结构

通过按 Ctrl + Shift + Alt + S

或文件 > 项目结构

如图所示,在 Project Structure 对话框中将 Source Compatibility 和 Target Compatibility 更新为 1.8(单击 File > Project Structure)。

https://i.stack.imgur.com/bf2FY.png

或者你可以使用 gradle

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

同步项目。就是这样!

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


这个解决方案对我有用:stackoverflow.com/a/55467237/4698320
n
nPn

大约 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


a
asozcan

最新消息:

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

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


A
Ahmad Aghazadeh

添加此配置 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 的支持的正确方法。缺点是启用千斤顶时即时运行当前不会运行。
不要全力支持。
s
stamanuel

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


A
Ajay S

是的。我们将很快使用 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


Y
YuvrajsinhJadeja

将此行添加到模块 lvl buildgradel

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }


t
tyler

更新 2019/10/28

Android Studio 4.0 解决了这个 issue

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


C
Community

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

安卓工作室 2.1:

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

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

在 Android Studio 2.1 之前:

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

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

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

如果您想了解有关使用 gradle-retrolambda 的更多信息,this answer gives a lot of detail on doing that


嗨法博德!我正在使用 AndroidStudio 2.2.2 我的 "SDK Location"(这是在 Mac FWIW 上)只是说"/Users/me/Library/Android/sdk"我在使用 Java8 - 如何使用 Java8?谢谢!
B
BlackHatSamurai

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

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

支持 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 工具链。这个新的 Android 工具链将 Java 语言源代码编译为 Android 可读的 DEX 字节码,拥有自己的 .jack 库格式,并作为单个工具的一部分提供大多数工具链功能:重新打包、收缩、混淆和 multidex。以下是用于构建 Android DEX 文件的两个工具链的比较: 传统 javac 工具链:javac (.java → .class) → dx (.class → .dex) 新 Jack 工具链:Jack (.java → .jack → .dex )


n
nPn

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

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

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


R
Richard

添加以下内容为我解决了这个问题(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
    ...
}

O
OneCricketeer

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

文件 --> 项目结构

https://i.stack.imgur.com/udegk.png

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

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


B
Bora Savkar

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

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

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


重复的答案,低质量
z
zackygaurav

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

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

解决方案:点击文件 -> 项目结构 -> 模块 -> 属性选项卡。将源兼容性和目标兼容性更改为 1.8 (Java 8)

https://i.stack.imgur.com/rb3bE.png


B
Bijay Budhathoki

是的,您可以在 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


H
Himesh Perera

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


P
PRANAV SINGH

容易记住的答案

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

https://i.stack.imgur.com/b20jx.png