是否可以将Java 8用于Android开发?


609

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

在我下载/设置Java 8之前,可以说一下任何“官方”文档说Android 8是否支持Java 8。


21
我不知道官方声明,但是我已经将Java 8(编辑:JDK 8)与Android SDK配合使用了。Windows 8.1 64位在这里。
Hoang Huynh 2014年


2
@HoangHuynh,您可以使用JDK 6或更高版本进行Android开发。但是,该编译支持Java版本6(对于KitKat,则支持7)。我认为OP的意思也适用于Java版本(不是JDK)
waqaslam 2014年

13
Java的8正式支持Android中N. android-developers.blogspot.com/2016/03/...
周杰伦

Answers:


189

Java 8

Android支持所有Java 7语言功能以及部分Java 8语言功能,具体取决于平台版本。

检查支持Java 8的哪些功能

使用Java 8语言功能

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

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

Eclipse用户:

对于喜欢Eclipse的老开发人员,Google停止了对Eclipse Android Developer工具的支持

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

Eclipse首选项-> Java->编译器

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

安装多个JDK并尝试。


2
Java 8是否更改了字节码的工作方式?如果不是,从理论上讲,只要可以编译,就可以使用任何版本的Java。
Ben Leggiero

6
正确的问题是:如果您使用Java 8中的新功能,而Java 7中不存在该功能来构建android应用程序,那可以吗?为了安全起见,请遵循官方指示。
工程。Samer T 2015年

12
@ BenC.R.Leggiero有在Java中8没有新的字节码,但说明书的含义和结构被改变stackoverflow.com/questions/28228450/... stackoverflow.com/questions/16143684/...
phuclv

17
请不要在答案中发布“更新N”。重写它以获取最新信息。否则,SO将在几年内与其取代的论坛一样难以获得信息。
Aleksandr Dubinsky

1
答案需要更新。从Android Studio 3.0和Gradle Plugin 3.0开始将支持Java 8。
ЮрійМазуревич

350

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

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


Android不支持Java8。它仅支持Java 7(如果有kitkat),但仍然不具有invokedynamic,只有新的语法糖。

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


13
要使其正常工作需要一些努力,但是一旦我按照正确的说明进行操作,它就会很好地工作。给Eclipse用户的注意事项:Eclipse在此方面不能很好地工作,我建议迁移到Android Studio(我会想念Eclipse,但这是现在的方式!)
Simon Forsberg 2014年

2
Nitpick:Android不支持Java 7中的多捕获子句。
csvan

11
支持多捕获,仅Android不支持的JDK7功能是可尝试使用的资源
MatthieuHarlé2014年

12
Java 7适用于所有版本的Android。一个例外:try-with-resources仅自Kitkat开始有效。
德米特里·扎伊采夫2014年

2
@SimonAndréForsberg(警告:无耻的插件!)-关于不支持Java 8流API的问题,您可以使用sourceforge.net/projects/streamsupport上的我的库-它明确说明了对Android的支持。
Stefan Zobel,2015年

99

您确实可以使用gradle-retrolambagradle构建依赖项将Java 8用于Android开发。

以下是我最近遵循的用于运行Lambda表达式以进行Android开发的完整指南。最后提到了本指南的原始资料。

在本指南中,将展示一种将一些Java 8功能引入Android开发工具的方法,特别针对 Eclipse IDE。。但是,本指南中将介绍的步骤也可能适用于Google的新起义开发环境Android Studio。它基于JetBrains流行的IntelliJ Idea IDE的社区版本,并且在撰写本指南之前不久,它已于2014年7月由Google升级到其“测试版”版本。至少在一段时间内,Eclipse仍将作为主要的开发环境,并且考虑到大多数Android项目都是使用Eclipse开发的事实,一种将诸如lambda表达式之类的Java 8新功能引入ADT的方法对于开发人员而言似乎非常有用。

Android开发基于名为Apache Harmony Project的自定义Java实现,该实现于2011年终止。Android开发中最常用的Java语法是Java 6(v1.6)和Java 7(v1.7)。 KitKat版本(Android 4.4。+)。因此,如果不对开发工具进行一些调整,就不能直接在Android App开发中使用lambda表达式之类的Java 8功能。幸运的是,这些构造基本上是一些“语法糖”增强功能,这些功能为开发人员带来了诸如“匿名类”之类的缺点,并且可以将它们转换为Java 6或Java 7类。

将Java 8源代码转换为较低Java版本的最新方法称为RetroLambda。该库使开发人员可以在Java 7或更低版​​本的Java上运行带有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%变量中
  • JAVA_HOME使用JDK 8主文件夹的路径值创建一个新的环境变量
  • JAVA8_HOME再次使用JDK 8主文件夹的路径值创建一个新的环境变量
  • JAVA7_HOME使用JDK 7主文件夹的路径值创建一个新的环境变量
  • 打开终端窗口并运行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
  • ANDROID_HOME用ADT安装文件夹的路径值定义一个新的环境变量,例如D:\adt\sdk
  • 将您的Andoid SDK Platform ToolsAndoid 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.1Android Support Library唯一的。取消选择其他所有内容,然后安装这两个软件包。

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

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

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

  • Nodeclipse / Enide Gradle:主要用于突出显示Groovy语言关键字。Groovy用作Gradle构建脚本的DSL。该插件可以通过安装Eclipse Marketplace。但是,ADT-22.6.2中的Eclipse并未随附Eclipse Marketplace Client。因此,您首先需要Eclipse Marketplace Client通过Install New SoftwareEclipse中的工具进行安装。在Work with字段中输入http //:download.eclipse.org/mpc/kepler/ 并继续安装。安装完成后Eclipse Marketplace Client,你可以搜索Nodeclipse/Enide GradleEclipse Marketplace Client并安装它。

  • Genymotion虚拟设备:它是Android Virtual DeviceADT随附默认值的绝佳替代品。AVD非常烦人,并且无缘无故地崩溃。Genymotion使您可以使用Oracle VirtualBoxCyanogenMod执行的映像来准备Android VD 。它的单用户许可证是免费的,可以从http://www.genymotion.com下载。只需登录,它也可以集成到Eclipse中。详细信息可以在下面找到:

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

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

在此处输入图片说明

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

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

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

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

  • 请点击 Downloads

  • Previous Releases选择版本1.10下,下载gradle-1.10-all.zip或gradle-1.10-bin.zip
  • 将其内容解压缩到一个文件夹中,例如 D:\adt\gradle
  • GRADLE_HOME用Gradle安装文件夹的路径值定义一个新的环境变量,例如D:\adt\gradle
  • 将您的Gradle binaries文件夹添加D:\adt\gradle\bin%PATH%变量中
  • 打开一个终端窗口并运行gradle -v命令,并验证它是否已启动并正在运行。如果您成功完成了这一步,则意味着您已准备好使用Java 8功能创建第一个Android应用程序。

演示应用

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

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

在此处输入图片说明

  • 只需单击Next以下表单上的Finish按钮,然后单击最后一个表单上的按钮。等到ADT完成加载项目
  • 右键单击项目,然后选择New -> Folder并命名builders
  • 右键单击该gen (Generated Java Files)文件夹并将其删除。Gradle将很快为我们生成相同的文件,并将它们添加到s build path. The不再需要默认Ant构建器创建的project 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并等待清洁过程完成
  • setContentViewMainActivity类的函数调用之后,立即添加下面给出的Java代码段:

在此处输入图片说明

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

在此处输入图片说明

  • 右键单击该项目,然后选择Properties -> Java Compiler选项,并将所有符合性级别设置为Java8。这将使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 Configuration右键单击项目,然后选择,为您的Android目标平台创建一个新的Run As -> Run Configurations。例如,此演示应用程序看起来像下面在Genymotion VD上所示:

HelloLambda应用

在此处输入图片说明

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

在此处输入图片说明

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


但是您能够使用Android调试器调试此代码吗?我的猜测是堆栈/行号不兼容。似乎是在Android上使用Java 8开发的主要缺点。
僵尸

2
@Zombies是的,您仍然可以对其进行调试。一切正常。
Korniltsev Anatoly 2015年

42

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

旧答案

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

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

支持的Java 8语言功能和API

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

默认和静态接口方法

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编译器)。


我什么都不懂 有什么要求minSdkVersion吗?
WindRider

我认为只有lambda表达式是向后兼容的,其他Java 8功能只能在N(或将来的版本)上使用。我尚未对此进行测试,但这是我从Android文档中了解的内容。因此,对于Java 8功能,除了lambda表达式之外,minSdkVersion为N

所以...再过几年,直到N成为仪表板的领导者。:(
WindRider

不幸的是。或直到Android以某种方式提供向后兼容性(例如lambda)

1
@WindRider,您可以使用minSdkVersion 15及更高版本。目前,我在Lambdas的Android项目中使用minSdkVersion 17,一切正常。
YYamil

22

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

现在有可能

但是您将需要让您的设备在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插件。

在此处输入图片说明


1
Scala与apk打包在一起将非常沉重
TechSpellBound

请参阅此解决方案以了解更新的android studio 2.0,因为他们已经对有限的配置选项进行了更新。
Gaurav Sharma

19

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

由于Android的SDK版本19,您可以使用Java 7层的功能做这个。尚未完全支持Java 8。


1
你是救星。您是否知道还有其他类似方法可以实现try-with-resources?
galets 2014年

@galets还没有办法,但是我敢打赌Google会在将来的某个时候添加它。更多信息,请参见:stackoverflow.com/questions/16921337/...
chaqke

16

本机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!


14

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

功能公告在这里,Java 8语言公告是:

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


到目前为止,它仍然存在很多问题,例如Instant Run不适用于lambda:如果您在lambda函数中更改了一些代码,则不会进行更改。
adriendenat

12

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

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

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

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

1
与建议复古lambda的第一个答案有何不同?
Maarten Bodewes,2016年

2
@MaartenBodewes似乎指出,它已经比接受的答案简单得多。请参阅medium.com/android-news/…–
TechSpellBound

不要使用它。插件是越野车
阿克沙伊Mukadam

11

更新2020/01/17

Android Studio 4.0支持使用称为desugaring的技术来使用多种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

1
@cesarferreira您需要将Android插件更新到最新版本(目前是2.4.0-alpha6)。请检查答案中的引号。
Idolon

将其添加到我正在使用的模块(不是应用程序)中是个难处。添加到应用程序模块无济于事。
Surekha

6

简单的方法

您可以为Android项目启用Java 1.8支持。

  • 开放项目结构

    • 通过按 Ctrl + Shift + Alt + S

    • 要么 File > Project Structure

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

图片

或者你可以使用gradle

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

同步项目。就是这样!

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



5

当我在大约2年前问这个问题时,答案实际上是“官方”否,但是正如ekcr1的答案所指出的那样,如果您使用Retrolamba,则可以使用最受期待的功能之一(lambda)。当时我仍在使用eclipse,因为Android Studio处于“预览”模式,所以我从未尝试过这种方法。

今天,我认为“官方”答案仍然没有,尽管Retrolamba似乎仍然是一个不错的选择,但对于那些愿意走某种“非官方”路线的人,还有另一种选择,那就是科特林。

今天科特林达到了1.0.0。对于不熟悉Kotlin的人,可以在以下网站上找到更多信息:

https://kotlinlang.org

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

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


4

最新消息:

Google宣布,借助Android N和Android Studio 2.1+,该平台将支持Java8。Studio2.1的稳定版本也已发布。

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


4

添加此配置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
这是为Android项目添加对Java 8的支持的正确方法。不利的一面是,启用千斤顶时,即时运行当前不运行。
Ionut Negru

不要全力支持。
艾哈迈德·阿加扎德

2

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

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

此处的更多信息:https : //android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html


2

是。我们将很快使用Java 8!

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

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


2

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

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }


1

我对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编译器。新建项目向导[文件→新建→项目]为针对N的项目生成正确的配置。


在Android Studio 2.1之前:

Android尚不支持Java 1.8(仅支持1.7),因此您不能使用Java 8功能(如lambda)。

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

如果您想使用lambdas(Android 8中Java 8的主要功能之一),则可以使用gradle-retrolamba

如果您想了解更多有关使用的信息gradle-retrolambda此答案提供了很多有关此操作的详细信息


嗨,Farbod!我正在使用AndroidStudio 2.2.2我"SDK Location"(这是在Mac FWIW上)只是说"/Users/me/Library/Android/sdk" 我在使用Java8-如何使用Java8?谢谢!
Fattie

1

我想我会为那些正在寻找更多最新信息的人发布更新的答案。

当前,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(Class)

实用程序API:

  • java.util.function
  • 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)

1

我在3年前问这个问题,显然这些年来答案已经改变了。由于上面已经回答了许多问题,因此有时返回答案。我从未更新过接受的答案,因为当时它是正确的答案。(我不确定该使用什么堆栈溢出策略)

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

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


1

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

build.gradle(项目)

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

build.gradle(模块:应用程序)

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

更新2019/10/28

Android Studio 4.0解决了这个问题

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


0

上述所有解决方案似乎都无法在2019年与最新的Android Studio 3.4+一起使用

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

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

源兼容性目标兼容性更改为1.8(Java 8)

在此处输入图片说明



-1

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

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

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


重复的答案,低质量
JanPl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.