关注码农话题
做一个实实在在的内行人

OpenJDK将对Android开发产生怎样的影响?

Google已决定将从下一版本的Android开始采用OpenJDK,本文将部分摘录互联网上对于这一决定的反响。

在去年年底,我们曾提到Google已经决定在Android中使用OpenJDK,以取代基于Harmony实现的Java库(详情请见此处)。尽管这条消息在宣布时恰逢圣诞期间,但Google的这一决定还是在互联网上引起了很大的反响,我们将在本文中对于这些观点进行一次总结。

从这个Git工单可以看出,早在2015年二月,Google就已经在代码中露出了切换至OpenJDK的计划。在去年十二月,这次代码提交中所包含的一个重要的授权信息的变化被媒体曝光了。Android N中所使用的新Java库将不再基于Apache License 2.0(APL)授权协议,而是基于GNU GPL 2协议,并且在版权信息中包含了以下声明:“Oracle及其附属机构版权所有,1997,2011”。

Mozilla的前任CTO Andreas Gal为此专门写了一篇标题有些骇人的博客“Oracle将它的魔爪伸向了Android”。他表示,Google长期以来一直坚持使用Harmony的Java库及Apache授权,其原因在于:

用户能够任意使用及修改APL代码,而无需发布这些改动。换句话说,你能够进行具有专利权的改动与改进。而这一点对于基于LGPL授权协议的GNU libc来说是不可能的。我可以确信地说,我知道为什么Google认为这一点很重要,因为在发布Firefox OS的过程中,我曾经和许多与Google有合作关系的芯片供应商以及OEM厂家进行过交流。芯片与OEM厂商都希望在软件层面上表现出他们的优势,尝试对Android的代码进行全方位的改进。尤其是芯片厂商经常会改动类库中代码,以充分利用自家的专利芯片,而且他们不愿意公开分享这些改动。通过这种方式能够体现出他们的竞争优势,即在专利上的优势。

Bob Ross回复了Gal的文章,他自称是某家OEM厂商的员工,对于APL与GPL的争论提出了一些见解:

我们确实会对libcore进行一些改动,在这种场合,主要问题是进行开源会带来很大的工作量,倒不是说要保护这些代码。至少从我曾经参与过的改动来看,情况就是如此。

Bradley M. Kuhn目前担任自由软件管理机构(Software Freedom Conservancy)的主席,同时也是自由软件基金会(Free Software Foundation)的董事会成员。他对于GPL可能对Andoid开发所造成的影响有着不同的见解。在最近的一篇博客文章“Sun、Oracle、Android、Google以及JDK复制权(copyleft)的质疑”中,Kuhn注意到OpenJDK授权其实属于一个“非常宽松”的协议,即包含Classpath例外的GNU协议。Kuhn曾经参与了Classpath例外协议的设计与命名,这一协议旨在避免通过复制权保护的方式“感染”整个Java生态系统,否则所有的Java程序都将被迫选择可以免费使用及重新分发的方式。如此一来,从授权协议的角度来看,选择使用OpenJDK与使用Harmony也没有多大的区别了。按照Kuhn的说法:

那么,采用了Oracle的GPL及Classpath例外协议的JDK与具备Apache授权的Java userspace又有多大的差别呢?它们的差别其实并不大!Android的重新分发者已经在kernel space方面承担了很大的复制权责任,并且请你记住,Webkit是基于LGPL授权协议的,所以说围绕着Android已经存在着一些比较宽松的复制权遵循责任了。如此一来,如果说某个重新分发者已经满足了以上协议,那么要遵循那些新加入JDK代码中的需求也不是什么麻烦事,因为这些需求只有更为宽松。

但在Gal看来,Oracle对于Android的未来发展将产生重大的影响,这不仅仅是因为授权的原因,同时也受到Java的发展路线、商标、条约与专利的影响:

除了源代码之外,Oracle还有别的方法可以控制Java的发展,因此OpenJDK所谓的自由性就好像一所监狱。你可以投票决定外墙有多高,甚至可以去参与砌墙工作,但一旦你进入这里,就只有Oracle能够决定你何时才能出去。Oracle对于OpenJDK的路线图有很大的决定权,通过对于兼容性需求、商标、现有协议以及API版权控诉(Oracle与Google之间的控诉)的掌握,Oracle几乎全盘控制了OpenJDK的发展方向。

部分读者在Gal的博客中留言表示,如果Oracle不能胜任OpenJDK的发展,那么Google完全可以创建一个分支,并自行决定它的发展方向。

Gal同时预测,对于Android来说,接下来的一年注定是艰难的一年:

由于代码与技术的混杂,这将在战术层面上牵连Android的开发。不夸张的说,所改动的代码将达到几百万行,并且从实现方面来看,新的OpenJDK与Google原本采用的Harmony代码在正确性或性能表现上有许多微妙的差别。如你所见,Google在日期数据的处理上更正了一个针对特定边界条件的测试用例。这是由于Harmony与Oracle的OpenJDK的表现有所差别,因此必须对测试进行更正。

而Android应用的整个生态系统就建立在这些正面临着变化基础上。Android的应用商店中有几百万个应用都依赖于Java的标准类,正如上文所述,不仅必须对测试进行更正,并且由于OpenJDK的转换所产生的微妙差别,这些应用都有可能随机地发生错误……

由于这次的巨变,我感觉Android N已经很难按期发布了。Google的做法无异于在飞行途中更换引擎,此时优先级最高的任务是保证不会坠机,至于是否能够按时抵达目的地,Google已经没时间去担心这个了。

Brendan Eich在一条推文中表示支持Gal的意见:“虽然我们的所知有限,但我同意@andreasgal的看法,代码的改动将带来成本与风险的上升。”

Codename One的联合创始人之一的Shai Almog也同意Google和Android的开发者将不得不面对一些额外的工作,但并没有Gal与Eich所认为的那么严重,并且使用OpenJDK还能够多多少少让他们受益。

虽然有些改动能够让用户直接受益,但对于大多数软件开发过程来说,改动无法带来直接的受益。并且也不是所有开发者都能够完全利用每一个语言与API的特性。

由于基础代码库得到了统一,用户将从中受益,并且安全审核流程也可以专注于这个具有更高统一性的基础代码库了。其结果是许多标准Java工具在Android上或许能够表现得更出色……

没错,Google需要付出一定精力以完成这一过程,也确实会有一些应用可能会受到影响。但我敢说,这次改动比起Marshmallow(即Android 6.0)的改动所带来的影响会小的多,并且Google本身有一些工具能够让许多问题得以缓解(例如SDK版本提示)。

有些人怀疑Google决定采用OpenJDK是否和他们与Oracle之间的控诉纠纷有关。而Kuhn则相信Google这次决定的背后是出于技术方面的原因:

一位Java业界分析师(他在这一行已经有十年以上的经验了)告诉我,他相信这一决定的主要动力是技术方面的原因。在Android平台上开发userspace应用的作者们都在寻找新的Java语言实现,考虑到市面上已经存在了这个合理的、具有授权的免费软件,因此Google就有理由选择在技术上转换至这个更有优势的代码库,毕竟它为API的使用者在技术层面上提供了他们想要的东西,同时也降低了维护的难度。这样看来,这个决定是非常合理的。这种说法或许没有权威人士的观点那样令人震撼,但技术方面的原因的确很可能是这个决定的主要推动力。

Android从新版本操作系统开始将采用OpenJDK,这一举措会带来怎样的影响,目前来说还难以进行全面的透彻分析,这很大程度上取决于Oracle与Google之间争论不休的版权控诉将走向何方。目前为止,还没有人能够清楚地说明一个API接口是否能够拥有版权信息,法律与法院必须明确地解答这一点。自从上一个现有版本的库开始,Android中的部分代码,包括Java与C在内就开始了重新构建工作,某些无用的代码被删除,但依然保留了接口或头文件。那么是不是说Android从此就可以摆脱那些麻烦了呢?这还有待时间观察。不过采用OpenJDK之后应该能够起到一些缓解作用,因为Google如今已经满足了Java授权和专利许可,Oracle也不能再对Android说三道四了。


入职你的梦想 VS 变现你的技术

IT面试宝典码农市场