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

nPn*_*nPn 594 java android java-8 android-gradle-plugin

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

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

ekc*_*cr1 347

更新2017/11/04 - Android Studio 3.0现在已经 gradle-retrolambda不再需要Java 8的本机支持.请参阅https://developer.android.com/studio/write/java8-support.html

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


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

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

  • 让它运作起来有点困难,但是一旦我真正遵循了正确的指令,它就能很好地运作.Eclipse用户请注意:Eclipse不能很好地使用它,我建议迁移到Android Studio(我会想念Eclipse,但这就是它现在的方式!) (13认同)
  • Java 7适用于所有版本的Android.一个例外:`try-with-resources`仅在Kitkat之后起作用. (12认同)
  • 支持Multi-catch,只有Android不支持JDK7功能才是try-with-resources (11认同)
  • Nitpick:Android不支持Java 7的多捕获子句. (2认同)
  • @SimonAndréForsberg(警告:无耻插件!) - 至于不支持Java 8流API,你可以在https://sourceforge.net/projects/streamsupport上使用我的库 - 它明确地解决了对Android的支持. (2认同)
  • @Donato AFAIK,从API级别22(Android 5.1)开始,是的.但有传言说这可能会改变.见http://sseblog.ec-spride.de/2015/03/lambda-expressions-android/ (2认同)

Eng*_*r T 185

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的老开发者,谷歌停止支持Eclipse Android Developer工具

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

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

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

安装多个JDK并尝试.

  • 请不要在答案中发布"更新N".重写它以获得最新信息.否则,SO将在几年内难以从其取代的论坛获取信息. (16认同)
  • @ BenC.R.Leggiero在Java 8中没有新的字节码,但是指令的含义和结构已经改变了/sf/ask/1975991531/ -to-upgrade-many-libraries-when-we-u?lq = 1 /sf/ask/1130057911/ 7-JVM (12认同)
  • 正确的问题是:如果你使用Java 7中的新功能在java 7中不存在构建android应用程序,那么可以吗?为了安全起见,请遵循官方指示. (6认同)
  • Java 8是否改变了字节码的工作方式?如果没有,理论上只要编译就可以使用任何版本的Java. (2认同)

Suf*_*ori 99

您确实可以使用gradle-retrolambagradle构建依赖关系来使用Java 8进行Android开发.

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

在本指南中,将演示一种将一些Java 8功能引入Android开发工具的方法,特别针对 Eclipse IDE.但是,本指南中将描述的步骤也可能适用于Google的新起义开发环境Android Studio.它基于JetBrains的流行IntelliJ Idea IDE的社区版本,并且最近在2014年7月初由谷歌升级为其"beta"版本,稍早于本指南编写之前.Eclipse将至少在一段时间内仍然是着名的开发环境,并且考虑到大多数Android项目都是使用Eclipse开发的,将一种新的Java 8特性(如lambda表达式)引入ADT的方法似乎对开发人员非常有用.

Android Development基于一个名为Apache Harmony Project的自定义Java实现,该实现于2011年终止.Android Development中最常用的Java语法是Java 6(v1.6),Java 7(v1.7)也部分支持KitKat版(Android 4.4.+).因此,如果不对开发工具进行一些调整,则不能在Android应用程序开发中直接使用像lambda表达式这样的Java 8功能.幸运的是,这些构造基本上是一些"语法糖"增强功能,它们为开发人员提供了诸如"匿名类"之类的缺点,并且可以将它们翻译成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插件允许基于Gradle的构建在Java或Android项目中实现.但是,开发人员只提到将此插件集成到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.1并且Android Support Library仅限.取消选择其他所有内容并安装这两个软件包.

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

强烈建议安装以下工具:

  • Eclipse Kepler Java 8支持:它使Eclipse能够识别新的Java 8语法扩展,并使您red dots在Java代码编辑器中摆脱烦恼.它可能是通过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使您可以使用CyanogenModOracle VirtualBox执行的映像来准备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网站: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二进制文件夹添加D:\adt\gradle\bin到您的%PATH%变量中
  • 打开终端窗口并运行gradle -v命令并验证它是否已启动并运行如果您已成功完成此操作,则表示您已准备好使用Java 8功能创建第一个Android应用程序.

演示应用程序

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

  • 运行Eclipse IDE并选择创建一个新的Android App File -> New -> Other -> Android -> Android Application Project
  • 填写如下所示的表格:

在此输入图像描述

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

在此输入图像描述

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

HelloLambda应用程序

在此输入图像描述

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

在此输入图像描述

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

  • 这可能是我见过的最长的答案 (26认同)
  • @Zombies是的,你仍然可以调试它.一切正常. (2认同)

小智 42

请点击此链接获取最新信息.使用Java 8语言功能

老答案

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

要开始使用这些功能,您需要下载并设置Android Studio 2.1 和Android N预览SDK,其中包括所需的Jack工具链和更新的Gradle Android插件.如果您尚未安装Android N Preview 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编译器).


siv*_*ivi 20

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

现在有可能

但是你需要在java 1.8上运行你的设备rom并启用"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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


cha*_*qke 19

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

从Android SDK版本19开始,您可以通过执行此操作来使用Java 7功能.尚未完全支持Java 8(尚未).


Dha*_*ani 15

原生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(类)
  • java.lang.reflect.Method.isDefault()

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

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
Run Code Online (Sandbox Code Playgroud)

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

android.enableDesugar=false
Run Code Online (Sandbox Code Playgroud)

你完成了!你现在可以使用原生java8了!


Jay*_*Jay 14

Android OFFICIALLY从Android N开始支持Java 8.

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

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


Vis*_*Raj 12

我们可以使用Java 8:

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

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

    apply plugin: 'me.tatarka.retrolambda'
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • @MaartenBodewes似乎指出它已经变得比接受的答案简单得多.请参阅https://medium.com/android-news/retrolambda-on-android-191cc8151f85#.3l4s6mq6s (2认同)

Ido*_*lon 7

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
  }
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请访问:https:
//developer.android.com/studio/write/java8-support.html


Khe*_*raj 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
   }
Run Code Online (Sandbox Code Playgroud)

同步项目。就是这样!

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


nPn*_*nPn 5

差不多两年前,当我问这个问题时,答案确实是"正式"否定,但正如ekcr1的回答所指出的,如果你使用retrolamba,你可以得到一个最受期待的功能(lambdas).当时我还在使用eclipse,因为Android Studio处于"预览"模式,所以我从未尝试过这条道路.

今天,我认为"官方"答案仍然没有,虽然retrolamba似乎仍然是一个很好的方式,但对于那些愿意采取某种"非官方"路线的人来说,还有另一种选择,即Kotlin.

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

https://kotlinlang.org

或观看杰克沃顿给出的这个演讲视频

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


归档时间:

查看次数:

265273 次

最近记录:

5 年,10 月 前