首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“为什么选择Apache Harmony”或"How to use Java 8 on Android“

“为什么选择Apache Harmony”或"How to use Java 8 on Android“
EN

Stack Overflow用户
提问于 2013-06-04 23:08:15
回答 2查看 13.9K关注 0票数 64

到目前为止,我们大多数人都听说过Java 8将带来的很酷的功能,但Android不会支持它。这是因为谷歌在安卓上使用了Apache Harmony。这就是阻止我们( android应用程序开发人员)使用lambdas、接口中的默认实现、在字符串上切换等等来改进代码的原因。当然,我们会处理一段时间,但如果我们在应用程序中使用的一些库开始使用Java 8特性怎么办?据我所知,这是行不通的(如果错了,请纠正我)。这造成了Standard-Java和Android-Java之间的不兼容。这不可能是谷歌想要的,或者至少我想不出一个原因,为什么一家正在开发一个被广泛采用的操作系统的公司,不会永远停留在旧的Java版本上。

问题:

  • 他们为什么使用Apache Harmony?
  • 为什么他们不能采用更新版本的Java?
  • 如果他们不想要甲骨文的Java,为什么不能使用OpenJDK的子集(此处许可noob )?
  • 您是否知道有计划更新已使用的Java版本?<代码>H210<代码>H111您是否知道在当前的安卓系统上使用Java 8类的任何方法?<代码>H212<代码>F213
EN

回答 2

Stack Overflow用户

发布于 2014-10-05 06:59:51

你知道在当前的安卓系统上使用Java8类的方法吗?

有几个库支持Java 8 API的部分(请参阅下面的更新部分,了解最新Android版本对这些API的本地支持):

针对Android

  • Stream support优化的Java8日期和时间API的
  • ThreeTenABP后端是Java8 java.util.function (功能接口)和java.util.stream (流) API的后端,适用于Java6或7的用户,并补充了java.util.concurrent的精选功能,这些功能在Java6中并不存在。

您可以使用retrolambda (以及gradle-retrolambda插件)在Android开发中使用lambda。

更新

Java Studio3.0开始提供对8语言特性的内置支持,这些特性包括:

静态接口Lambda expressions

  • Method references

  • Type批注(信息在编译时可用,但在runtime)

  • Repeating annotations

  • Default和静态接口方法中不可用

另外,从API level 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()

接口级别26 (Android O)增加了对java.time接口的支持。

更新2020/01/17

Android Studio4.0支持使用多种Java8语言的API,通过使用名为desugaring的技术,无需对您的应用程序要求最低API级别:

https://developer.android.com/studio/preview/features#j8-desugar

此版本支持以下API集:

java.util.{Map,Collection,Comparator}

  • Optionals中java.time

  • java.util.function

  • Recent添加的AtomicReference)

  • ConcurrentHashMap子集(java.util.Optionaljava.util.OptionalIntjava.util.OptionalDouble)和其他一些有用的新类
  • Sequential streams
  • java.util.concurrent.atomic的一些添加( AtomicInteger、<代码>D82和Android 5.0的错误修复)<代码>H287<代码>F288

为了支持这些语言API,D8编译一个单独的库DEX文件,该文件包含缺少的API的实现,并将其包含在您的应用程序中。去丑化过程会在运行时重写你的应用程序的代码,而不是使用这个库。

要启用对这些语言API的支持,请在模块的build.gradle文件中包含以下内容:

android { defaultConfig { //将minSdkVersion设置为20或更低时需要multiDexEnabled true } compileOptions { //启用新语言API支持的标志coreLibraryDesugaringEnabled true //将Java兼容性设置为Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }}依赖项{ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4‘}

更多的技术细节可以在Jake的文章中找到:

票数 12
EN

Stack Overflow用户

发布于 2015-12-30 19:42:35

更新。

安卓计划使用OpenJDK。可能是因为他们的想法和您一样,并且想要使用Java8的特性。请参阅this

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16921337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档