"为何选择Apache Harmony"或"如何在Android上使用Java 8"

til*_*ner 64 java apache android java-8

我们大多数人现在已经听说过Java 8将带来的酷炫功能,但Android不会支持它.这是因为Google使用Apache Harmony for Android.这就是让我们(Android应用程序开发人员)改进我们的代码与lambdas,接口中的默认实现,切换字符串等等.当然,我们会处理一段时间,但如果我们在应用程序中使用的某些库开始使用Java 8功能呢?据我所知,这不起作用(如果错误,请纠正我).这会在Standard -Java和Android -Java 之间产生不兼容性.它不可能是谷歌的意图,或者至少我不能想到一个公司,开发一个广泛采用的操作系统,不会永远留在旧的 Java版本的原因.

问题:

  • 他们为什么使用Apache Harmony?
  • 为什么他们不能采用更新版本的java?
  • 如果他们不想要Oracle的Java,为什么他们不能使用OpenJDK的子集(这里的许可noob)?
  • 您是否知道有任何更新已用Java版本的计划?
  • 您知道在当前Android系统上使用Java 8类的任何方法吗?

Ste*_*n C 55

他们为什么使用Apache Harmony?

因为Sun拒绝以可接受的条款向Google提供Sun(现在的Oracle)Java许可.谷歌和Sun谈判,但他们最终放弃了交易.

Nitpick:事实上,Android库并不是Apache Harmony.他们最初是以和谐为基础的,但这两个代码库已经分道扬.. 此外,Apache Harmony项目于2011年11月正式"退役".

为什么他们不能采用更新版本的java?

首先,Android不运行Java(tm).它在具有不同指令集的虚拟机上运行与Java相同的语言,其类库在功能上等同于Java类库的子集(+特定于Android的库).

从技术角度来看,他们可以......但只有在为Android平台实施Java 7和Java 8语言功能,库功能等方面付出了大量工作.

更新 - 从Android 19(KitKat)和Eclipse ADT 22.6开始,Android现在支持Java 7语言扩展; 请参阅http://tools.android.com/recent/eclipseadt226preview

如果他们不想要Oracle的Java,他们为什么不能使用OpenJDK的子集?

我认为切换到OpenJDK不会改变任何东西.Oracle Java和OpenJDK的相同度为99.9%.

无论如何,可能存在许可和相关的法律问题.(为了感受到这一点,请阅读甲骨文与谷歌的诉讼......这将具有吸引力.)

更有可能的是,谷歌没有看到足够的商业价值来抵消改变所需的(大规模)努力,以及它对Android生态系统造成的破坏......它已经受到碎片问题的困扰.

您是否知道有任何更新已用Java版本的计划?

不,我没有.这并不意味着没有计划,但如果有计划,它们就不公开.

您知道在当前Android系统上使用Java 8类的任何方法吗?

你可以移植它们.或者至少,您可以尝试移植它们.(某些Java API与JVM的本机代码端有密切关系......这可能会导致移植问题.)

  • @StackOverflowException - 你想念我的观点.我的观点是,由于Oracle和OpneJDK如此接近,如果他们移植OpenJDK而不是Oracle,问题的数量/类型将没有任何区别.(无论如何,他们无法为版权等原因移植Oracle Java). (2认同)

Ido*_*lon 12

您知道在当前Android系统上使用Java 8类的任何方法吗?

有一些库反向部署Java 8 API(请参阅下面的更新部分,了解最新Android版本中对这些API的本机支持):

  • 针对Android优化的Java 8日期和时间API的ThreeTenABP backport
  • 流支持是Java 8 java.util.function(java.util.stream7)的用户的Java 8 (功能接口)和(流)API的java.util.concurrent后端,补充了Java 6中不存在的选定添加.

您还可以使用retrolambda(连同gradle这个-retrolambda插件)利用在Android开发lambda表达式.

UPDATE

但是,从Android Studio 2.4 Preview 4(结合Android插件2.4.0-alpha4)开始,内置支持一些Java 8语言功能:

  • Lambda表达式
  • 方法参考
  • 重复注释

上述功能可用于任何Android API级别.

从API级别24开始,我们还可以使用默认和静态接口方法,以及以下Java 8 API:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface

API级别26(Android O预览版)增加了java.timeAPI支持.

  • @StephenC和你的观点是?答案是为了将来参考. (2认同)

Nik*_*ose 5

更新.

Android计划使用OpenJDK.可能是因为他们像你一样思考并希望使用Java 8功能.看到这个