開(kāi)發(fā)者必知:谷歌做了一個(gè)艱難的決定
谷歌做了一個(gè)艱難的決定:棄用Java APIs.
所謂人紅是非多,所以Android的崛起,必定伴隨著戰(zhàn)爭(zhēng)。其中***代表性的,最有爭(zhēng)議的莫過(guò)于甲骨文和Google的官司了。
事件回顧:
自2010年起,兩家公司關(guān)于Android系統(tǒng)的一部分是否侵犯了甲骨文的版權(quán)和專(zhuān)利,一起爭(zhēng)論不休,因?yàn)橄到y(tǒng)中使用了甲骨文擁有的Java。整個(gè)官司既持久,又充滿戲劇性。從2010年8月算起,已經(jīng)有5年多了。到了今年6月份,甲骨文在這起訴訟中贏得了重大法律勝利:美國(guó)***法院拒絕就此案受理谷歌的上訴。這也就意味著駁回了Google的上訴,維持了原判:判定 API 受版權(quán)保護(hù),Google侵權(quán)。在美國(guó)***法院做出不受理谷歌上訴的裁定后,這起訴訟將返回到舊金山聯(lián)邦法院,由該院就谷歌另外提出的“合理使用”的辯護(hù)觀點(diǎn)舉行更多庭審。
這起訴訟的焦點(diǎn)在于,用于連接不同軟件的應(yīng)用程序接口 (API)是否也受版權(quán)法的保護(hù)。官司起因就是:甲骨文掃描了1500萬(wàn)行Android源代碼,發(fā)現(xiàn)了9行代碼是拷貝自Java。
這***爭(zhēng)議,最神奇的九行代碼如下:
- 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);
- }

其實(shí)這九行代碼都是出自同一個(gè)人:Joshua Bloch,是一位Java大牛。他的經(jīng)歷如下:
早在1996年,適逢 Java 剛剛嶄露頭角。先是1月份發(fā)布JDK1.0,然后是5月底在舊金山召開(kāi)首屆JavaOne大會(huì),年末又是JDK1.1緊跟其后。正是在Java技術(shù)如火如荼、大展拳腳的背景之下,JoshuaBloch來(lái)到了Sun。2004 年7月初,就在J2SE5.0發(fā)布在即,Jusha Bloch剛剛榮獲Sun“杰出工程師(Distinguished Engineer)”的稱(chēng)號(hào)之時(shí),他突然離開(kāi)Sun而去了正值發(fā)展態(tài)勢(shì)迅猛的Google,成為了Google的Java***架構(gòu)師。在離開(kāi)Google之前他一直是Dart平臺(tái)和Dart語(yǔ)言核心庫(kù)的主要架構(gòu)師,2012年8月23號(hào)Joshua Bloch離開(kāi)了Google,對(duì)于Dart應(yīng)該不至于是個(gè)毀滅性地打擊,但肯定是一個(gè)巨大的損失。
事件回顧完畢,回到今天的事情上來(lái),據(jù)悉:谷歌將在下一代Android系統(tǒng)Android N中用甲骨文(Oracle)公司的開(kāi)源代碼OpenJDK來(lái)替代后者的Java APIs,此事***在上個(gè)月由Hacker News貼出的一段神秘安卓代碼庫(kù)露出,目前VentureBeat已得到谷歌的正式確認(rèn)。
官方回應(yīng)如下:
作為一個(gè)開(kāi)源平臺(tái),Android建立在合作共生的開(kāi)源社區(qū)之上。在下一版的Android系統(tǒng)之中,我們計(jì)劃將Java語(yǔ)言庫(kù)替換為以O(shè)penJDK為基礎(chǔ)創(chuàng)造出來(lái)的通用代碼庫(kù),便于讓開(kāi)發(fā)者開(kāi)發(fā)app和服務(wù)。谷歌常年為OpenJDK做貢獻(xiàn),未來(lái)還將繼續(xù)下去。
其實(shí)在公理上谷歌是理虧的,此舉想必也是迫于壓力與常年消耗戰(zhàn)帶來(lái)的疲憊。雖然OpenJDK是Java SE的中的代碼,同樣隸屬于甲骨文,但它是開(kāi)源的,且Java SE在2007年誕生之時(shí)甲骨文還沒(méi)有收購(gòu)Sun Microsystems、擁有Java。Android提供一些Java API代碼庫(kù)來(lái)支持開(kāi)發(fā)者用Java編程語(yǔ)言開(kāi)發(fā)應(yīng)用,主要分為兩部分:代碼庫(kù)的APIs,以及谷歌為了讓代碼庫(kù)工作而開(kāi)發(fā)的執(zhí)行代碼。甲骨文擁有Java,并有兩個(gè)這種代碼庫(kù):專(zhuān)有JDK和開(kāi)源OpenJDK。谷歌使用的是后者,并已在某些領(lǐng)域有了應(yīng)用,意味著其將分享這些執(zhí)行代碼。
安卓代碼庫(kù)中出現(xiàn)了神秘的代碼提交,修改了 8902 個(gè)文件,從這段代碼庫(kù)的改動(dòng)可以看出OpenJDK代碼已經(jīng)被加進(jìn)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]
雖然官司尚未結(jié)束,但是審判結(jié)果將會(huì)在科技界產(chǎn)生重大影響,如果甲骨文勝訴,科技巨頭們將不再能隨意使用存在版權(quán)的API包了,谷歌若是敗了,將損失數(shù)十億美元。