“为什么Apache Harmony”或“如何在Android上使用Java 8”

我们中的大多数人都已经听说Java 8会带来很酷的function,但是Android不会支持它。 这是因为Google使用Apache Harmony for Android。 这就是让我们(Android应用程序开发人员)改进我们的代码的lambdas,在接口中的默认实现,切换string等等。 当然,我们会处理一段时间,但是如果我们在应用程序中使用的某些库开始使用Java 8function呢? 据我所知,这是行不通的(请纠正我,如果错误)。 这将导致Standard- Java和Android- Java之间的不兼容。 这不可能是谷歌打算的,或者至less我不能想到为什么一家开发广泛采用的操作系统的公司将不能永久留在旧的 Java版本。

问题:

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

为什么他们使用Apache Harmony?

因为Sun根据可接受的条款拒绝向Google提供Sun(现在的Oracle)Java许可证。 谷歌和太阳进行了谈判,但他们最终摆脱了这笔交易。

Nitpick:实际上,Android库不是Apache Harmony。 他们起初是基于和谐的,但这两个代码库已经分歧了。 此外,Apache Harmony项目于2011年11月正式“退役”。

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

首先,Android不运行Java(TM)。 它运行一种与Java相同的语言,其function与具有不同指令集的虚拟机上的Java类库(+特定于Android的库)的子集 相同

从技术angular度来看,他们可以…但只有在为Android平台实施Java 7和Java 8语言function,库特性等方面投入了大量的工作。

更新 – 从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类的方法吗?

你可以移植它们。 或者至less,你可以尝试移植它们。 (有些Java API与JVM的本地代码端有密切的关系,这可能会使移植成为问题。)

你知道在目前的Android系统上使用Java 8类的方法吗?

有几个库可以将Java 8 API的一部分(见下面的更新部分,用于在最新的Android版本中对这些API的本机支持)进行回溯:

  • 针对Android优化的Java 8date和时间API的ThreeTenABP backport
  • stream支持是为Java 6或7的用户提供的Java 8 java.util.function (函数接口)和java.util.stream (streams)API的补充以及不存在的来自java.util.concurrent选定补充回到Java 6。

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

UPDATE

但是,从Android Studio 2.4 Preview 4(结合Android插件2.4.0-alpha4)开始,内置了对Java 8语言function的支持:

  • Lambdaexpression式
  • 方法引用
  • 重复注释

以上提到的function可以用于任何Android API级别。

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

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

API级别26(Android O Preview)添加了java.time API支持。

更新。

Android正在计划使用OpenJDK。 可能是因为他们像你一样思考,想要使用Java 8function。 看到这个