Sun 公司的 Java 跟 Android 使用的 Java 庫有什麼關係?

大俠咕咚發表於2019-05-07

全文重點羅列

  • Java 是 Sun 公司開發的一門語言,同時 Java 也是一個開放平臺。
  • Sun 公司為 JVM 釋出了 JVM 規範,任何公司都可以按照此規範開發 JVM 語言,如現在的 Kotlin、Scala 等。
  • JVM 語言必須要通過 JCP(Java Community Process)對其擁有的TCK(Technology Compatibility Kit)測試。
  • Harmony 是 Apache 2005 年開發的一個開源的,免費的 Java 實現,只是沒有完全通過 Sun 公司的 TCK 測試,按照 Apache 協議釋出。
  • Open JDK 是 Sun 公司在 2009 釋出的完全自由,開放原始碼的 Java平臺標準版(Java SE)免費開源實現,按照 GPL 協議釋出。
  • Android 一開始使用的 Java 實現是基於 Apache 協議釋出的 Harmony,後來由於 Harmony 本身的限制以及 Oracle 公司的起訴,從 Android N 開始, Google 開始用 Open JDK來替換 Harmony。

如題,Sun 公司的 Java 跟 Android 使用的 Java 庫有什麼關係? 做 Android 開發不少時間了,但是相信有很多人有同樣的疑問,儘管這個疑問對做 Android 開發本身並沒有多大關係,但我還是想去了解個究竟,總覺得這裡面一定有一些有意思的東西。

最開始有這個疑問是源自 Oracle 與 Google 2011 年左右訴訟,當時 Oracle 狀告 Google 在未經授權就使用了 Java 的 API,當時對智慧財產權、開原始碼等缺少認識,只是覺得奇怪,Java 是一門開放的技術,任何公司都可以拿來使用,為什麼到 Google 這裡怎麼就變卦了呢,接下來就記錄一下自己的研究筆記,以問答形式展開,問題間可能沒什麼關聯。

Sun 公司與 Oracle 公司的關係

Sun Microsystems是IT及網際網路技術服務公司(已被Oracle(甲骨文)收購)Sun Microsystems 建立於1982年。主要產品是工作站伺服器。1986年在美國成功上市。1992年 Sun 推出了市場上第一臺多處理器桌上型電腦 SPARCstation 10 system,並於1993年進入財富500強。

2009 年 Sun 公司被 Oracle 收購。

什麼是 Java?wiki

Sun 公司的 詹姆斯·高斯林 等人在 1990 年年初開發了 Java 語言的雛形(好吧,那年我剛出生,沒想到自己跟 Java 同齡了),最初命名為 Oak,主要適用於家用電器等小型系統的開發。後來隨著網際網路的快速發展,於是改造 Oak,在 1995 年 5 月以 Java 的名稱正式釋出,所以更多時候,大家都在講 Java 是 1995-96才有的語言,也沒問題。

Java 從最初設計就有一個非常優秀的思想,即跨平臺,它不受平臺限制,任何平臺都可以執行 Java 程式,比如我們常見的 Windows、Linux 等等系統都可以執行,Java 的跨平臺具體是通過 JVM 做到的。

JVM 是什麼東西?

首先, Java 語言不論在任何平臺,想要執行,首先都需要先編譯為位元組碼,這裡的位元組碼是平臺無關的,是完全獨立的一個東西,不受平臺特性限制。而最終在電腦上執行時,為了在各個平臺上可以執行位元組碼,Sun 公司在開發 Java 的過程中同時也開發了虛擬機器這個東西,**它專門用來執行位元組碼,它負責把位元組碼轉換為機器可以認識的機器碼,**然後執行。

於此同時,Sun 不僅僅是為各個平臺開發了虛擬機器。作為程式設計師,我們大都有這樣的經驗,當我們要為多個平臺開發一個作用一致的東西時,為了後續更好的擴充套件維護,我們肯定會想先定義一個介面規範出來,這樣所有平臺的實現都通過這個規範去控制約束,後續的升級維護就會變得更簡單。

作為開發 Java 的老一輩們當然也知道這個道理,所以他們也做了同樣的事,**Sun 定義了 Java 虛擬機器的規範。**這樣相當於釋出了 Java 規範,即你只要按照這個規範,就可以開發自己的 JVM 語言了,前提是你的語言編譯出的位元組碼要符合 JVM 規範,否則虛擬機器就沒法執行。現在這樣的語言已經有不少了,比如我們知道的 Kotlin,Groovy、Scala等。

JVM 語言是不是隻要符合規範即可?

原則上任何團體或者公司都可以開發 JVM 語言,因為這個規範是公開的,但是這裡要知道的是,當你按照規範開發了語言,首先要做的一件事便是要通過 Sun 的 TCK (Technology Compatibility Kit)測試。這個也很好理解,這是官方的測試,通過這個測試才能成為官方認可的 JVM 語言。具體 TCK 的詳細介紹可檢視Wiki。

Sun 公司如何通過 Java 賺錢

Sun通過銷售Java Enterprise System等 專用產品的許可證從Java中獲得收入

Apache 開發的 Harmony 是一個什麼專案

該專案是 Apache 開發的一個開源的,免費的 Java 實現,不過 2011 年時已經被 Apache 關閉了該專案。Harmony 專案實現了 J2SE 5.0的 99%完整性和 Java SE 6的 97%。

Harmony 的目標:

  • 一個相容的、獨立的Java SE 5 JDK的實現,並根據 Apache License v2 釋出。
  • 一個由社群開發的模組化的執行時(包括Java虛擬機器類庫)體系結構。

Harmony 與 TCK 的紛爭

如果需要成為一個帶有Java logo標誌的,可以聲稱自己相容Sun公司實現的JDK,需要通過JCP(Java Community Process)對其擁有的TCK(Technology Compatibility Kit)的測試。Apache Harmony專案一直在努力爭取獲得JCP的授權。

但是,由於Sun公司的態度,JCP並沒有給Harmony授予TCK許可,而且 SUN 釋出 OpenJDK 之後,還規定只有衍生自 OpenJDK 的採用GPL協議的開源實現才能執行OpenJDK的TCK[2]

**但 Apache 的 Harmony 是 Apache 協議的,與 OpenJDK 的 GPLv2 協議不相容,Apache 董事會和Harmony專案工作人員堅決反對這種帶有條件的授權,認為這種是在開源社群裡不可接受的。**因此,兩者談判破裂。直到現在,Harmony一直沒有獲得TCK的授權。有批評稱,Sun無視它簽署的JCP法律協定,這摧毀了全部的信任。

摘自 Apache Harmony - 維基百科,自由的百科全書

GPL 協議與 Apache 的區別

下面是常見開源協議之間的關係區別

Sun 公司的 Java 跟 Android 使用的 Java 庫有什麼關係?

可以看到

  • 用 GPL 協議釋出的專案,當別人修改程式碼後必須採用相同的協議並且也要開源。
  • Apache 協議則特別自由,當你修改該協議下發布的專案後,可以選擇閉源,只需要在每一個檔案頭都加上版權說明。

Harmony 與 Android 的關係

從上面的開源協議對比可以看出,Apache 協議是一個特別自由的協議,而 Android 一開始正是因為 Harmony 專案採用了 Apache 協議,所以才更有動力使用 Harmony 作為自己的 Java 類庫。

所以 Android 中的 Java 實現並不是官方的實現,而是 Harmony 對 Java 的實現。由於 Harmony 並沒有通過 TCK 認證,這也就為日後 Oracle 起訴谷歌侵權埋下了伏筆。

到後來 Android 鑑於此,從 Android 7.0 開始,用 Sun 的 OpenJDK 替換了 Harmony。

Open JDK 是什麼

OpenJDK(Open Java Development Kit)原是 Sun 公司為 Java 平臺構建的 Java 開發環境(JDK)的開源版本,完全自由,開放原始碼。 Sun公司在 2006 年的 JavaOne 大會上稱將對 Java 開放原始碼,於2009年4月15日正式釋出OpenJDK。甲骨文在 2010 年收購 Sun之後接管了這個專案。

OpenJDK 是 Java平臺標準版(Java SE)的免費開源實現,該實現是根據 **GNU通用公共許可證(GNU GPL)**釋出。OpenJDK 最初只基於 Java 平臺的 JDK 7版本。

Apache Harmony 與 Open JDK、原生 Java 以及 Android 之間的區別對比。

Android Java Apache Harmony OpenJDK
Android Runtime Java Runtime Environment (JRE) 同左 同左
Core Libraries Java Core Libraries Harmony Core Libraries OpenJDK Core Libraries
Dalvik VM Java VM DRLVM HotSpot VM

由圖可看到

  • Java 與 Android 有不同的執行時,但是 Open JDK 跟 Harmony 都有相同的執行時,這就保證了這兩者編寫出的 Java 程式碼均能正常跑在 Java 平臺上。
  • 而 Android 有自己的執行時。
  • 大家都定義了自己的 VM,Android 定義的最徹底。
  • Java 的 VM 基於堆疊結構,而 Android 的 VM 基於暫存器結構,後者效率更高,更適合移動端。

總結

一開始只是想了解 Harmony ,但是真的展開了,其實有很多東西需要去了解,包括語言本身、語言特性、開源協議,專案歷史,一些關鍵事件等等。而花時間瞭解後,卻發現不知道的東西更多了,疑問也更多了,比如 Android 具體選用 Harmony 是如何思考的,Harmony 與 Open JDK 的實現過程中有什麼異同等等,也是無奈,這裡只能把自己看到的想到的記錄下來。

無論如何,去了解一些東西背後的東西或者巨集觀背景,能給自己更多的視角去看待眼前的東西,也會讓自己變得更理性,同時舉一反三,任何事情都應該如此。

原文地址: Sun 公司的 Java 跟 Android 使用的 Java 庫有什麼關係? | 咕咚

參考連結

相關文章