当前位置: 首页 > 知识库问答 >
问题:

安卓开发有没有可能使用Java 8呢?

韩彬
2023-03-14

搜索网页,目前还不清楚Android开发是否支持Java 8。

在我下载/安装Java 8之前,有没有人可以告诉我任何一个“官方”文档,说Java 8是或不是支持Android开发。

共有3个答案

萧辰沛
2023-03-14

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

下面是我最近遵循的运行用于Android开发的lambda表达式的完整指南。本指南的原始出处在末尾提到。

在本指南中,将演示一种将一些Java 8特性带入Android开发工具的方法,具体针对Eclipse IDE。然而,本指南将描述的步骤也可能适用于Google新的uprising开发环境Android Studio。它是基于JetBrains的流行IntelliJ Idea IDE的社区版,最近谷歌在2014年7月初将其升级为“测试版”,稍早于本指南的编写。Eclipse仍将是最重要的开发环境,至少在一段时间内如此。考虑到大多数Android项目都是使用Eclipse开发的,一种将新的Java 8特性(如lambda表达式)引入ADT的方法似乎对开发人员非常有用。

Android的开发基于一个名为Apache Harmony项目的自定义Java实现,该项目早在2011年就被终止了。Android开发中最常用的Java语法是Java 6(V1.6),Java 7(V1.7)在KitKat版(Android4.4.+)上也得到部分支持。因此,像lambda表达式这样的Java 8功能不能在Android应用程序开发中直接使用,而需要对开发工具进行一些调整。幸运的是,这些构造基本上是一些“语法糖”增强,给开发者带来了“匿名类”之类的缺点,它们可以被翻译成Java 6或Java 7类。

最近一种将Java 8源代码翻译成低Java版本的方法叫做retrolambda。这个库使开发者在Java 7甚至更低的版本上运行带有lambda表达式的Java 8代码。不幸的是,除了lambda表达式之外,Java 8的其他功能目前还不被RetroLambda支持,但是lambda表达式的概念是Java 8平台上最大的飞跃,而且对于Android开发者来说,它是一个很棒的工具。

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

https://github.com/orfjackal/retrolambda#入门

另外,另一个开发人员为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将用于构建/清理过程,并提供其安装程序。此外,JDK8JDK7必须在开发计算机上共存。安装时必须遵循以下步骤:

  • 转到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 8bin文件夹添加到%path%变量
  • 使用JDK 8主文件夹路径的值创建新的环境变量java_home
  • 使用JDK 8主文件夹路径的值再次创建新的环境变量java8_home
  • 使用JDK 7主文件夹路径的值创建新的环境变量java7_home
  • 打开终端窗口,运行Java版本命令,并验证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
  • Andoid SDK Platform ToolsAndoid 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代码编辑器中摆脱烦人的红点。可以通过Eclipse中的help->Install New software安装它。在使用字段中输入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。在使用字段中输入http//:download.eclipse.org/mpc/kepler/并继续安装它。安装Eclipse Marketplace Client之后,您可以在Eclipse Marketplace Client中搜索Nodeclipse/Enide Gradle并安装它。

    Genymotion虚拟设备:它是ADT附带的默认Android虚拟设备的一个很好的替代。AVD是烦人的笨重,它一直无缘无故地崩溃。Genymotion使您可以使用cyanogenmod映像准备Android VD,这些映像由Oracle VirtualBox执行。它的单一用户许可证是免费的,可以从http://www.genymotion.com下载。只需要一个登录名,它也可以集成到Eclipse中。详情请参阅:

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

    下面是一个基于Android4.3的CyanogenMod虚拟设备的截图,

    它可以被认为是一个完全成熟的Android设备,运行在基于x86或x64的个人电脑上。为了在这台虚拟设备上使用谷歌服务,如Google PlayStore,必须将其使用的Android版本的Gapps映像闪烁到设备上。设备的正确gapps映像可以从CyanogenMod网站下载:

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

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

    >

  • 请访问Gradle网站:http://www.cradle.org/

    单击下载

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

    • 运行Eclipse IDE并通过选择文件->新建->其他->Android->Android应用程序项目
    • 创建一个新的Android应用程序
    • 填写以下表格:

    >

  • 只需单击以下表单上的下一步按钮,然后单击最后一个表单上的完成按钮。等待ADT完成加载项目
  • 右键单击项目,然后选择新建->文件夹并将其命名为builders
  • 右键单击Gen(生成的Java文件)文件夹并将其删除。Gradle将很快为我们生成相同的文件,我们将把它们添加到项目的构建路径中。不再需要默认Ant构建器创建的gen`文件夹,该文件夹下的工件将过时
  • builders文件夹下创建以下批处理文件:

    • gradle_build.cmd
    • gradle_post_build.cmd
    • gradle_clean.cmd

    按以下方式填写这些批处理文件:

    gradle_build.cmd:

    gradle_post_build.cmd:

    gradle_clean.cmd:

    • 取消选择项目->自动生成菜单选项
    • 右键单击项目并选择属性->生成器并取消选择ADT提供的所有默认生成器
    • 单击同一窗口中的新建按钮,选择程序并单击确定
    • 将出现新的生成器配置窗口。按以下方式填写其选项卡:

    新生成器配置的选项卡

    新生成器配置的刷新选项卡

    新生成器配置的环境选项卡

    新生成器配置的生成选项选项卡

    • 创建名为gradle_post_build的第二个生成器,该生成器使用gradle_post_build.cmd作为其程序。此生成器的所有其他设置必须与先前创建的生成器完全相同。此构建器将负责将构建过程创建的构件复制到bin文件夹中。
    • 创建名为gradle_clean的第三个生成器,该生成器使用gradle_clean.cmd作为其程序。在清理过程中,只能将最终选项卡中的运行生成器设置设置为。此生成器的所有其他设置必须与第一个生成器完全相同。该生成器将负责清理由生成过程创建的工件,顾名思义。

    Hellolambda项目的新生成器

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

    清理项目窗口

    • 单击确定并等待清理过程完成
    • MainActivity类中调用SetContentView函数之后添加下面给出的Java代码段:

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

    • 右键单击项目并选择属性->Java编译器选项,并将所有符合性级别设置为Java 8。这将使Eclipse识别新的Java 8构造,如lambda表达式
    • 在通知窗口中单击
    • 右键单击项目,然后选择生成项目。Eclipse将开始构建该项目。

    >

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

    • build\source\buildconfig\debug
    • 生成\source\r\debug

    Eclipse现在能够识别r.javabuildconfig.java文件,并且不会显示任何表示与项目的资源文件相关的错误的红点

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

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

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

  • 梁兴修
    2023-03-14

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

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

    安卓系统不支持Java 8。它最多只支持Java 7(如果您有kitkat的话),而且它仍然没有invokedynamic,只有新语法sugar。

    如果你想在安卓系统中使用Java 8的一大特性之一lambdas,你可以使用gradle-retrolamba。它是一个gradle构建依赖项,集成了retrolambda,一个将Java 8字节码转换回Java 6/7的工具。基本上,如果您将Android Studio中的编译器设置为编译Java 8字节码,从而允许lambda,它会将其转换回Java 6/7字节码,然后再将其转换为dalvik字节码。如果你想在Android中试用一些JDK8特性来代替官方支持,那就麻烦了。

    何勇
    2023-03-14

    Android支持所有Java 7语言特性,以及一个因平台版本而异的Java 8语言特性的子集。

    检查支持Java 8的哪些功能

    使用Java 8语言特性

    我们已经决定将对Java 8语言特性的支持直接添加到当前的javac和dx工具集中,而不推荐使用Jack工具链。有了这个新的方向,依赖于Java类文件格式的现有工具和插件应该会继续工作。下一步,Java 8语言功能将由Android build系统提供原生支持。我们的目标是在未来几周内推出这款产品作为Android Studio的一部分,我们希望尽早与大家分享这一决定。

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

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

    如果您安装了Java 8 JDK,那么试试看,如果出现任何问题,尝试将编译器设置为1.6在Eclipse从窗口菜单首选项Java编译器。Java 7号也会起作用:

    如果您的目标是Android5.0或更高版本,则需要Java 7或更高版本。

    安装多个JDK并尝试。

     类似资料:
    • 我需要在SE环境中使用没有CDI容器的Jersey 2.28(带Jetty)。我的所有设置都在web.xml中: 以下是我使用的依赖项: 我得到的是: 我知道Jersey可以与不同的DI容器一起使用,例如Weld、HK2等,但是否可以不使用DI容器?如果是,那又是怎样做的呢?

    • 我读到这个关于Java的和之间的区别的问题,后者已经有几年的历史了。让我吃惊的是,只有一个问题提到了使用的任何缺点;也就是说,如果使用大量CPU,加速比就会降低。 假设您不在某种特殊的单线程环境中,是否应该始终选择?有什么理由不这样做吗?请注意,上面问题的一个答案提到,如果元素少于4096个,将直接调用。

    • 面经攒人品 上来手撕两个 1.实现一个堆排序 2.一个单链表怎么判断存在环 后面问一点项目相关和八股 1.右值引用 2.内存泄漏 3.new和malloc 3.线程有几种状态,状态之间是怎么流转的 4.说说11中的智能指针,shared_ptr和unique_ptr的区别 5.STL中push_back和emplace_back的区别详细说一下 6.场景题:读写由不同线程来进行,说一下应该怎么避免

    • #23届找工作求助阵地# 因为我一问三不知面试官只能一直引导我有没有熟悉的,有些问题忘了()只答出来四次挥手和一点点进程线程的区别()大概还是根据你说你会的回答 自我介绍 说一下对安卓开发有什么了解 (根据你说的提问) 说不出来就有引导提问,听说过就具体聊一下相关知识,其实大概率也是八股,我就是没背() : 对布局类型的了解(相对布局、约束布局、线性布局) activity的调用和编程 装箱和拆箱

    • 有没有可能,没有应用服务器发送推送通知使用fire-base实时数据库和通知在Android?

    • 假设我有一个< code>json数组数组 我想将其分解为<code>ArrayList