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

Is it possible to use Java 8 for Android development?

提问人:nPn 提问时间:4/27/2014 最后编辑:EnzokienPn 更新时间:11/4/2021 访问量:296645

问:

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

在我下载/安装 Java 8 之前,有人可以指出任何“官方”文档,说明 Android 开发支持或不支持 Java 8。

java-8 android-gradle-插件

评论

21赞 Hoang Huynh 4/27/2014
我不知道官方声明,但我有 Java 8 (编辑:JDK 8) 与 Android SDK 配合得很好。Windows 8.1 64位在这里。
2赞 Aboalnaga 4/27/2014
这篇文章中有一个讨论:Android 的 Java 版本与 Java SE 版本有什么关系?
2赞 waqaslam 4/27/2014
@HoangHuynh您可以使用 JDK 6 或更高版本进行 Android 开发。但是,编译支持 Java 版本 6(如果是 KitKat,则支持 7)。我认为 OP 的意思也适用于 java 版本(不是 JDK)
13赞 Jason 3/10/2016
Java 8 在 Android N 中正式支持。 android-developers.blogspot.com/2016/03/...
2赞 Ray Tayek 4/30/2016
也许很快:developer.android.com/preview/j8-jack.html

答:

196赞 Eng. Samer T 4/27/2014 #1

Java 8 版本

Android 支持所有 Java 7 语言功能以及部分 Java 8 语言功能,这些功能因平台版本而异。

检查 java 8 的哪些特性

使用 Java 8 语言功能

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

Android 上 Java 8 语言功能支持的未来

Eclipse 用户:

对于喜欢 Eclipse 的老开发者,google 停止支持 Eclipse Android 开发者工具

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

Eclipse Preferences -> Java -> Compiler

如果您以 Android 5.0 和 高等。

安装多个 JDK 并尝试。

评论

2赞 Ky - 3/12/2015
Java 8 是否改变了字节码的工作方式?如果没有,理论上使用任何版本的 Java 都应该没问题,只要它能编译即可。
6赞 Eng. Samer T 3/13/2015
正确的问题是:如果你使用 Java 8 中不存在的 Java 7 中不存在的新功能来构建 Android 应用程序,可以吗?为了安全起见,请遵循官方说明。
12赞 phuclv 3/15/2015
@BenC.R.Leggiero Java 8 中没有新的字节码,但指令的含义和结构 stackoverflow.com/questions/28228450/ 发生了变化...... stackoverflow.com/questions/16143684/......
19赞 Aleksandr Dubinsky 3/8/2016
请不要在您的答案中发布“更新 N”。重写它以获得最新信息。否则,几年后,SO 将像它所取代的论坛一样难以从中获取信息。
1赞 Юрій Мазуревич 10/22/2017
答案需要更新。从 Android Studio 3.0 和 Gradle Plugin 3.0 开始支持 Java 8。
354赞 ekcr1 4/27/2014 #2

更新 2017/11/04 - Android Studio 3.0 现在原生支持 Java 8。 现在不再需要了。查看 https://developer.android.com/studio/write/java8-support.htmlgradle-retrolambda

如果您使用的是 ,上面的链接还包括迁移说明。原文答案如下: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 功能来代替官方支持,这是一个黑客。

评论

13赞 Simon Forsberg 4/28/2014
让它工作有点困难,但一旦我真正遵循了正确的说明,它就运行良好。Eclipse用户注意:Eclipse不能很好地工作,我建议迁移到Android Studio(我会想念Eclipse,但现在必须这样!
2赞 csvan 6/5/2014
吹毛求疵:Android 不支持 Java 7 中的 multi-catch 子句。
11赞 Matthieu Harlé 7/23/2014
支持多重捕获,只有 Android 不支持的 JDK7 功能是 try-with-resources
12赞 Dmitry Zaytsev 8/21/2014
Java 7 适用于所有版本的 Android。一个例外:仅从 Kitkat 开始工作。try-with-resources
2赞 Stefan Zobel 5/28/2015
@Simon André Forsberg(注意:无耻的插件!) - 至于不支持 Java 8 流 API,你可以在 sourceforge.net/projects/streamsupport 使用我的库 - 它明确解决了对 Android 的支持。
19赞 chaqke 10/21/2014 #3

Android 使用的 Java 是从 Java 6 分支而来的。

从 Android SDK 版本 19 开始,您可以通过这样做来使用 Java 7 功能。尚不完全支持 Java 8。

评论

1赞 galets 11/26/2014
你是救命恩人。您知道是否也有类似的东西可以以类似的方式实现 try-with-resources?
0赞 chaqke 12/3/2014
@galets目前还没有办法,但我敢打赌谷歌在未来的某个时候会添加它。其他信息,请参阅:stackoverflow.com/questions/16921337/...
102赞 Sufiyan Ghori 2/8/2015 #4

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

以下是我最近运行 lambda 表达式进行 Android 开发的完整指南。本指南的原始来源在末尾提到。

在本指南中,一种将某些 Java 8 特性引入的方法 将演示 Android 开发工具,专门针对 Eclipse IDE。但是,本指南中将介绍的步骤也可能适用于Google的新起义发展 环境,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) 和 Java 7 (v1.7) 在 KitKat 版本上也部分受支持 (安卓 4.4.+)。因此,Java 8 具有类似 lambda 表达式的特性 不能直接在 Android 应用程序开发中使用,否则 对开发工具进行一些调整。幸运的是,这些 结构基本上是一些“句法糖”增强,其中 给开发人员提供诸如“匿名类”之类的缺点 它们可以翻译成 Java 6 或 Java 7 类。

将 Java 8 源代码转换为低级 Java 的最新方法 versions 称为 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 位开发计算机提供,但它们可以很容易地适应其他平台。新的构建系统将用于构建/清理过程,还将提供其安装程序。此外,两者必须在开发计算机上共存。安装它们时必须遵循以下步骤:GradleJDK 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 8 是否已启动并正在运行java -version
  • 在同一窗口中运行命令,并验证 JDK 8 Java 编译器是否也已启动并运行javac -version

现在,必须从以下链接下载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_HOMED:\adt\sdk
  • 添加您的和文件夹,例如 和 ,添加到您的变量Android SDK Platform ToolsAndroid SDK ToolsD:\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 代码编辑器中的烦人。它可能在 Eclipse 中安装。在字段中输入 http://download.eclipse.org/eclipse/updates/4.3-P-builds/ 并继续安装。red dotsHelp -> Install New SoftwareWork with

  • Nodeclipse/Enide Gradle:主要用于突出显示 Groovy 语言关键字。Groovy 用作 Gradle 构建脚本的 DSL。这个插件可以通过 安装。但是,ADT-22.6.2 中的 Eclipse 不附带 .因此,您首先需要通过Eclipse中的工具进行安装。在字段中输入 http//:d ownload.eclipse.org/mpc/kepler/ 并继续安装它。安装后,您可以在 中搜索并安装它。Eclipse MarketplaceEclipse Marketplace ClientEclipse Marketplace ClientInstall New SoftwareWork withEclipse Marketplace ClientNodeclipse/Enide GradleEclipse Marketplace Client

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

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

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

enter image description here

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

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

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

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

  • 点击Downloads

  • 在选择版本 1.10 下,下载 gradle-1.10-all.zip 或 gradle-1.10-bin.zip Previous Releases

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

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

  • 将 Gradle 二进制文件文件夹(例如 )添加到变量中D:\adt\gradle\bin%PATH%

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

演示应用程序

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

  • 运行 Eclipse IDE 并通过选择File -> New -> Other -> Android -> Android Application Project
  • 填写如下所示的表格:

enter image description here

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

  • 右键单击项目,然后选择并命名它New -> Folderbuilders

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

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

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

gradle_build.cmd:

enter image description here

gradle_post_build.cmd:

enter image description here

gradle_clean.cmd:

enter image description here

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

主要新构建器配置的选项卡

enter image description here

刷新新构建器配置的选项卡

enter image description here

环境新构建器配置的选项卡

enter image description here

构建选项新构建器配置的选项卡

enter image description here

  • 创建第二个用作其程序的生成器,称为该生成器。此构建器的所有其他设置必须与之前创建的构建器完全相同。此生成器将负责将生成过程创建的工件复制到文件夹中。Gradle_Post_Buildgradle_post_build.cmdbin
  • 创建第三个用作其程序的构建器。只有最后一个选项卡中的设置必须设置为 。此生成器的所有其他设置必须与第一个生成器完全相同。顾名思义,此生成器将负责清理生成过程创建的工件。Gradle_Cleanergradle_clean.cmdRun the builderDuring a Clean

HelloLambda 项目的新构建者

enter image description here

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

清洁项目

enter image description here

  • 单击并等待清洁过程完成OK
  • 在类中调用函数后立即添加下面给出的 Java 代码片段:setContentViewMainActivity

enter image description here

  • 将文件的开头更改为该部分,如下所示:build.gradlesourceCompatibility

enter image description here

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

构建过程 enter image description here

  • 右键单击该项目,然后转到 。将以下文件夹添加到生成路径(也如下图所示):Properties -> Java Build Path

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

enter image description here

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

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

HelloLambda 应用程序

enter image description here

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

enter image description here

来源:在 Android 开发者工具中使用 Java 8 Lambda 表达式

评论

0赞 Zombies 5/17/2015
但是,您是否能够使用 Android 调试器调试此代码?堆栈/行号不兼容是我的猜测。这似乎是在 Android 上使用 Java 8 进行开发的主要缺点。
2赞 Korniltsev Anatoly 7/5/2015
@Zombies 是的,您仍然可以调试它。一切正常。
23赞 sivi 11/25/2015 #5

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

enter image description here

评论

1赞 TechSpellBound 1/16/2016
Scala 与 apk 打包会非常繁重
0赞 Gaurav Sharma 10/26/2016
有关更新的 android studio 2.0,请参阅此解决方案,因为他们对有限的配置选项进行了更新。
12赞 Vishal Raj 12/21/2015 #6

我们可以通过以下方式使用 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
    }
    

评论

1赞 Maarten Bodewes 1/4/2016
与推荐复古 lambda 的第一个答案有什么不同?
2赞 TechSpellBound 1/16/2016
@MaartenBodewes 似乎指出它已经变得比公认的答案简单得多。请参阅 medium.com/android-news/...
0赞 Akshay Mukadam 2/5/2016
不要使用它。插件有问题
5赞 nPn 2/16/2016 #7

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

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

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

https://kotlinlang.org

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

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

14赞 Jason 3/10/2016 #8

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

特性发布在这里,Java 8 语言发布是:

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

评论

0赞 adriendenat 5/11/2017
目前它仍然很有问题,例如 Instant Run 不适用于 lambda:如果您更改 lambda 函数中的某些代码,它不会进行更改。
43赞 user4774371 3/10/2016 #9

点击此链接获取最新更新。使用 Java 8 语言功能

旧答案

从 Android N 预览版开始,Android 支持 Java 8 的有限功能,请参阅 Java 8 语言功能

要开始使用这些功能,您需要下载并设置 Android Studio 2.1 和 Android N 预览版 SDK,其中包括 需要 Jack 工具链和更新的 Android Plugin for Gradle。如果你 尚未安装 Android N 预览版 SDK,请参阅设置以进行开发 适用于 Android N

支持的 Java 8 语言特性和 API

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

默认和静态接口方法

Lambda 表达式(也可用于 API 级别 23 及更低级别)

可重复的注释

方法参考(也可用于 API 级别 23 及更低级别)

Android 还支持一些额外的 Java 8 功能,您可以从 Java 8 语言功能中看到完整的详细信息

更新

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

更新 2

现在 Android Studio 3.0 稳定版支持 Java 8 库和 Java 8 语言功能(没有 Jack 编译器)。

评论

0赞 WindRider 3/11/2016
我不明白什么。对 ?minSdkVersion
0赞 3/11/2016
我认为只有 lambda 表达式是向后兼容的,其他 Java 8 功能只能在 N(或未来版本)上运行。我没有测试过这个,但这是我从 Android 文档中理解的。因此,对于 Java 8 功能,minSdkVersion 是 N,而不是 lambda 表达式
0赞 WindRider 3/12/2016
所以。。。再过几年,直到 N 成为仪表板的领导者。:(
0赞 3/12/2016
不幸的是,是的。或者直到 Android 以某种方式提供像 lambda 这样的向后兼容性
1赞 YYamil 2/8/2017
@WindRider,您可以使用 minSdkVersion 15 及更高版本。目前,我正在使用 Lambdas 在我的 Android 项目中使用 minSdkVersion 17,一切正常。
16赞 Dhaval Jivani 3/10/2016 #10

原生 Java 8 登陆 android!最后!

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

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

要开始使用受支持的 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.函数
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType(类)
  • 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!

4赞 asozcan 4/27/2016 #11

最新消息:

谷歌宣布,在 Android N 和 Android Studio 2.1+ 中,平台将支持 Java 8。此外,还发布了 studio 2.1 的稳定版本。

最后,我们可以使用 lambda 表达式。for 循环中不再有列表筛选器。霍里伊。

1赞 Farbod Salamat-Zadeh 4/28/2016 #12

我在 Stack Overflow 上写了一个类似的问题,但这是该答案的一部分。

Android Studio 2.1:

新版本的 Android Studio (2.1) 支持 Java 8 功能。以下是 Android 开发者博客文章的摘录:

...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),因此您不能使用 lambda 等 Java 8 功能。

此答案提供了有关 Android Studio 兼容性的更多详细信息;它指出:

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

如果您想了解更多关于使用的信息,这个答案提供了很多关于这样做的细节gradle-retrolambda

评论

0赞 Fattie 12/4/2016
嗨,法博德!我正在使用 AndroidStudio 2.2.2 我的(这是在 Mac FWIW 上)只是说我在使用 Java8 - 如何使用 Java8??谢谢!"SDK Location""/Users/me/Library/Android/sdk"
4赞 Ahmad Aghazadeh 9/15/2016 #13

添加此配置 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
    }
}

评论

1赞 Ionut Negru 10/14/2016
这是为 Android 项目添加对 Java 8 支持的正确方法。缺点是启用 jack 时,即时运行当前不会运行。
0赞 Ahmad Aghazadeh 10/14/2016
不要完全支持。
1赞 BlackHatSamurai 12/14/2016 #14

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

目前,Android 和 Android Studio 支持 Java 8 功能的一部分。根据其网站上的 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(类)

实用程序 API:

  • java.util.函数
  • java.util.stream

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

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

Legacy javac toolchain:
    javac (.java → .class) → dx (.class → .dex)
    New Jack toolchain:
    Jack (.java → .jack → .dex)
2赞 stamanuel 3/15/2017 #15

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

2赞 Ajay S 3/16/2017 #16

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

12赞 Volo 4/6/2017 #17

更新 2020/01/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}
  • 可选的 (和 ) 和其他一些对 以上 APIjava.util.Optionaljava.util.OptionalIntjava.util.OptionalDouble
  • 对 (上 和 的新方法java.util.concurrent.atomicAtomicIntegerAtomicLongAtomicReference)
  • 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()

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

未来将添加更多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

评论

0赞 cesarferreira 4/20/2017
我不明白的是,android studio 与 java8 支持有什么关系(intellij 以前没有)?!这是否意味着如果我在终端上使用 gradle 编译项目,它将无法编译?!
1赞 Volo 4/20/2017
@cesarferreira您需要将Android插件更新到最新版本(目前)。请检查答案中的报价块。2.4.0-alpha6
0赞 Surekha 2/6/2020
将它添加到我正在使用的模块(不是应用程序)中是问题所在。添加到应用程序模块没有帮助。
0赞 H.Karatsanov 7/3/2020
那么我们也可以在 API 21 中使用 Java 8 吗?
1赞 Volo 7/4/2020
@H.Karatsanov 是的,您可以在 API 21 中使用 Java 8 语言功能,并且可以在 Android Studio 4.0+ 中提供的脱糖的帮助下使用提到的 Java 8 API
1赞 nPn 5/18/2017 #18

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

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

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

1赞 Richard 6/3/2017 #19

添加以下内容为我解决了问题(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
    ...
}
1赞 Fio 1/25/2018 #20

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

文件 --> 项目结构

Adjustment Window

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

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

6赞 Khemraj Sharma 9/12/2018 #21

简单易行

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

  • 开放式项目结构

    • 要么按Ctrl + Shift + Alt + S

    • 文件>项目结构

  • 在“项目结构”对话框中将“兼容性”和“目标兼容性”更新为 1.8,如下所示(单击“文件”>“项目结构”)。

image

或者你可以使用 gradle

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

同步项目。就是这样!

注意:可以在 Android Studio 3.0.0 或更高版本中启用 Java 1.8 支持。有关进一步阅读,请参阅文档

评论

0赞 Däñish Shärmà 7/30/2019
这个解决方案对我有用:stackoverflow.com/a/55467237/4698320
2赞 YuvrajsinhJadeja 4/2/2019 #22

将此行添加到模块 lvl build gradel 中

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

0赞 zackygaurav 7/11/2019 #23

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

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

溶液:单击“文件”-“>”项目结构“-”>模块“-”>属性“选项卡。

将”源兼容性“和”目标兼容性“更改为 1.8 (Java 8)

enter image description here

2赞 Tyler 10/29/2019 #24

更新 2019/10/28

Android Studio 4.0 解决了这个问题。

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

0赞 Bijay Budhathoki 1/8/2020 #25

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

1赞 Bora Savkar 5/23/2020 #26

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

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

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

评论

1赞 JanPl 5/23/2020
重复的答案,低质量
1赞 Himesh Perera 3/5/2021 #27

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

0赞 PRANAV SINGH 11/4/2021 #28

容易记住的答案

在android studio中,单击项目结构图标,然后进入模块/应用程序,然后将Source Compatibility和Target Compatibility更改为1.8,然后按Ok。