转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/182.html?1456926201

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的说法:#p#分页标题#e#

那么,采用了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的看法,代码的改动将带来成本与风险的上升。”#p#分页标题#e#

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说三道四了。

OpenJDK将对Android开发产生怎样的影响?的更多相关文章

  1. Ubuntu15.04 安装Android开发环境

    一.安装Java SE JKD A.下载 http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSite ...

  2. Ubuntu 下搭建 Android 开发环境(图文)

    转自 http://dawndiy.com/archives/153/ 1.安装JDK 1.下载JDK 目前最新的JDK版本是:Java SE Development Kit 7u5 下载地址: 查看 ...

  3. Ubuntu 配置 Android 开发 环境

    . 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...

  4. Linux(ubuntu 12.04桌面版) 搭建Android开发环境

    因为一些工作上的原因,需要切换到Linux环境下做点开发,我选择的Linux发行版本为ubuntu(我不建议使用fedora,我最开始就是使用的fedora,但发现并不是特别好使,有些插件没办法安装, ...

  5. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  6. Android 开发一定要看的15个实战项目

    前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ...

  7. Android开发学习之路-关于Exception

    Exception在Java中是表示异常的一个类.它是Throwable的子类. 而Exception的子类RuntimeException是一个特殊的异常类,在代码中不需要对此类进行throw,而是 ...

  8. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  9. Android开发学习之路-记一次CSDN公开课

    今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确. 原话是这样的:点击事件可以通过事件监听和回调两种方法实现. 我一听到之后我的表情是这样的: 这跟我学的看的都不 ...

随机推荐

  1. LeetCode(97) Interleaving String

    题目 Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: ...

  2. HTML页面跳转的5种方法

    下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <head> <!-- 以下 ...

  3. 最小生成树算法——Kruskal算法

    #include<stdio.h> #include<algorithm> #include<windows.h> using namespace std; str ...

  4. unity 实现物体破碎效果的一些方法

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  5. Object 转化为String时的一个问题 null->"null"

    近日在工作出了一个较大的问题,导致被客户投诉. 事情大致是,某个功能里新增对用户手机的修改,在平台数据同步过程中,出现了将用户以前的要同步的数据,那时还没有手机号码所以是null,新功能上线后,将手机 ...

  6. lvs-keepalived故障记录

    上图中1与2.3不同,可能会导致端口不同,尽量配置1.2.3相同

  7. 60行以内写mvc

    标题党.几天前看到一个30行写mvc的文章,东施效颦,也动手写了个60行的,功能上略微扩充一些,记录下来,后面有时间可以继续优化. mvc其实是一个观察者模式.view来监听model,所以当mode ...

  8. SAS 画折线图PROC GPLOT

    虽然最后做成PPT里的图表会被要求用EXCEL画,但当我们只是在分析的过程中,想看看数据的走势,直接在SAS里画会比EXCEL画便捷的多. 修改起来也会更加的简单,,不用不断的修改程序然后刷新EXCE ...

  9. Vue.js多重组件嵌套

    Vue.js多重组件嵌套 Vue.js中提供了非常棒的组件化思想,组件提高了代码的复用性.今天我们来实现一个形如 <app> <app-header></app-head ...

  10. 几个非常有用的js小函数

    function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...