开发者必知:谷歌做了一个艰难的决定
谷歌做了一个艰难的决定:弃用Java APIs。
所谓人红是非多,所以Android的崛起,必定伴随着战争。其中最具代表性的,最有争议的莫过于甲骨文和Google的官司了。
事件回顾:
自2010年起,两家公司关于Android系统的一部分是否侵犯了甲骨文的版权和专利,一起争论不休,因为系统中使用了甲骨文拥有的Java。整个官司既持久,又充满戏剧性。从2010年8月算起,已经有5年多了。到了今年6月份,甲骨文在这起诉讼中赢得了重大法律胜利:美国最高法院拒绝就此案受理谷歌的上诉。这也就意味着驳回了Google的上诉,维持了原判:判定 API 受版权保护,Google侵权。在美国最高法院做出不受理谷歌上诉的裁定后,这起诉讼将返回到旧金山联邦法院,由该院就谷歌另外提出的“合理使用”的辩护观点举行更多庭审。
这起诉讼的焦点在于,用于连接不同软件的应用程序接口 (API)是否也受版权法的保护。官司起因就是:甲骨文扫描了1500万行Android源代码,发现了9行代码是拷贝自Java。
这最具争议,最神奇的九行代码如下:
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex+")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
其实这九行代码都是出自同一个人:Joshua Bloch,是一位Java大牛。他的经历如下:
早在1996年,适逢 Java 刚刚崭露头角。先是1月份发布JDK1.0,然后是5月底在旧金山召开首届JavaOne大会,年末又是JDK1.1紧跟其后。正是在Java技术如火如荼、大展拳脚的背景之下,JoshuaBloch来到了Sun。2004 年7月初,就在J2SE5.0发布在即,Jusha Bloch刚刚荣获Sun“杰出工程师(Distinguished Engineer)”的称号之时,他突然离开Sun而去了正值发展态势迅猛的Google,成为了Google的Java首席架构师。在离开Google之前他一直是Dart平台和Dart语言核心库的主要架构师,2012年8月23号Joshua Bloch离开了Google,对于Dart应该不至于是个毁灭性地打击,但肯定是一个巨大的损失。
事件回顾完毕,回到今天的事情上来,据悉:谷歌将在下一代Android系统Android N中用甲骨文(Oracle)公司的开源代码OpenJDK来替代后者的Java APIs,此事最先在上个月由Hacker News贴出的一段神秘安卓代码库露出,目前VentureBeat已得到谷歌的正式确认。
官方回应如下:
作为一个开源平台,Android建立在合作共生的开源社区之上。在下一版的Android系统之中,我们计划将Java语言库替换为以OpenJDK为基础创造出来的通用代码库,便于让开发者开发app和服务。谷歌常年为OpenJDK做贡献,未来还将继续下去。
其实在公理上谷歌是理亏的,此举想必也是迫于压力与常年消耗战带来的疲惫。虽然OpenJDK是Java SE的中的代码,同样隶属于甲骨文,但它是开源的,且Java SE在2007年诞生之时甲骨文还没有收购Sun Microsystems、拥有Java。Android提供一些Java API代码库来支持开发者用Java编程语言开发应用,主要分为两部分:代码库的APIs,以及谷歌为了让代码库工作而开发的执行代码。甲骨文拥有Java,并有两个这种代码库:专有JDK和开源OpenJDK。谷歌使用的是后者,并已在某些领域有了应用,意味着其将分享这些执行代码。
安卓代码库中出现了神秘的代码提交,修改了 8902 个文件,从这段代码库的改动可以看出OpenJDK代码已经被加进Android:
Initial import of OpenJdk files.
Create new libcore/ojluni directory with src/main/java and src/main/native subdirectiories.
Build ojluni into core-oj jar.
Use openjdk classes from java.awt.font package.
Copy all files from jdk/src/share/classes and jdk/src/solaris/classes directories in openjdk into libcore/ojluni/src/main/java.
Copy following native files from openjdk to libcore/ojluni/src/main/native: [long list of files]
虽然官司尚未结束,但是审判结果将会在科技界产生重大影响,如果甲骨文胜诉,科技巨头们将不再能随意使用存在版权的API包了,谷歌若是败了,将损失数十亿美元。
- Java基础-23(02)总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
- 8 个最好的 Java RESTful 框架
- 【C++基础】C++11 lambda 表达式解析
- 大量redo生成的问题原因及改进(r6笔记第50天)
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,
- YOLO,一种简易快捷的目标检测算法
- Java基础-22总结转换流,随机访问流,合并流,序列化流,Properties
- openshift镜像构建
- 关于数据库无法登录的问题反思(r6笔记第49天)
- SQL中distinct的用法
- 数据结构是哈希表(hashTable)(一)
- 关于奇怪的并行进程分析(三)(r6笔记第47天)
- 数据结构是哈希表(hashTable)(二)
- Oracle的Replace函数与translate函数详解与比较
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用CloudFlare来为网站开启客户端证书验证
- 浅解shallow copy、deep copy
- Kubernetes 1.19.0——服务svc(1)
- 为什么不推荐使用PHPicker
- 【C语言简单说】一:第一个C语言程序
- 【C语言简单说】二:第一个C语言程序详解(1)
- 【C语言简单说】二:第一个C语言程序详解(2)
- 【C语言简单说】二:第一个C语言程序详解(3)
- 【C语言简单说】三:整数变量和输出扩展(1)
- 【C语言简单说】三:整数变量和输出扩展(2)
- 【C语言简单说】三:整数变量扩展和输出扩展(3)
- 【C语言简单说】三:浮点数变量和字符变量(4)
- 【C语言简单说】三:变量总结ASCII码扩展(5)
- 【C语言简单说】四:常量
- 【C语言简单说】五:常用运算符