Android,開源還是封閉?

阮一峰發表於2010-02-04

滿大街都在談論Android。

它是當紅炸子雞。許多人覺得,iPhone將受到它的強力挑戰。

bg2010020401.png

我也曾經對它充滿了期待,但是後來的事態發展,令我改變了看法。前幾天,我就在網誌上寫了自己的擔憂

"首先,Android應用程式只能用java語言開發,莫非所有的應用程式都執行在一個巨大的虛擬機器上?(【更正】網友留言指出,2009年6月Android釋出NDK工具包,支援C/C++語言程式設計,不過效能不如SKD工具包中的Java語言。 )

其次,Google對Android採用了一種全面霸權式的管理,完全不是其他開源軟體的開發方式,一切都由Google說了算,很多地方是黑箱,外界不得而知。"

沒有想到,僅僅過了兩天,擔憂就變成了現實。Linux Kernel的維護者Greg Kroah-Hartman宣佈,將Android 程式碼從 Linux kernel 程式碼庫中刪除。這意味著,Linux Kernel的開發小組不認可Android的貢獻,兩者產生了衝突。

訊息公佈以後,外界普遍覺得驚訝和可惜。好不容易,才有了一個這麼受歡迎的開源手機系統,應該齊心協力、共同開發才對,為什麼要"窩裡鬥"呢?到底是什麼矛盾,使得Linux Kernel小組剔除Android程式碼呢?

Greg Kroah-Hartman寫了一篇詳細的文章,解釋這個決定。下面就來看看,他是怎麼說的,以及Android到底是一個什麼樣的系統。

在這之前,你最好知道Greg Kroah-Hartman是誰。他是目前Linux Kernel的核心開發人員,負責stable軟體包的釋出。就是說,每一個新版本的Linux Kernel,都是經過他的手流出來的。此外,他還負責硬體驅動的部署。而他的手機就是HTC G1,每天都在使用。所以,他是絕對有資格談論這個問題的,他的看法代表了Linux社群對Android的看法。

首先,他指出Android和其他的Linux發行版不一樣:

"Google has taken the Linux kernel, and nothing else from a "traditional" Linux system.

Google只用了kernel,別的東西都沒用。"

這就是說,與Ubuntu、Debian、Redhat這樣的傳統Linux發行版相比,只有系統的底層結構是一樣的,其他東西在Android裡都不一樣,尤其是程式設計師的程式設計介面是完全不同的。因此,Android應用程式都必須重新寫過,現存的Linux程式無法移植上去。所以,從嚴格意義上說,Android是一種全新的系統,它與Linux的距離,比Mac OS與Linux的距離還要遠。

bg2010020402.jpg

然後,Greg Kroah-Hartman肯定了Android這樣做的積極意義:

"Android also solves the problem that the phone manufacturers had been having for many years: a free version of Java and a unified application layer that programmers can write to that will work on all phone platforms that integrate it.

它解決了長期令手機制造商頭痛不已的問題:業界缺乏一個開源的Java虛擬機器,以及統一的應用程式介面。現在,程式設計師只要寫一次程式,就能在各種手機硬體平臺之上使用。"

這段話解釋了,為什麼Android的應用程式,都必須用Java語言開發。因為不這樣做的話,沒法讓程式做到硬體無關。

且慢,這真的是理由嗎?傳統的Linux系統,也並不依賴特定的硬體啊!只要把原始碼根據不同的平臺,分別編譯一下,同一個程式不也照樣可以在不同的硬體架構、不同的Linux發行版中使用嗎?

那麼,Android只採用kernel、只允許用java程式設計的真正原因,到底是什麼?

臺灣的科技網誌MMDays一語道破真相:

"Linux kernel 的版權是 GPL。

這下問題來了:如果你是硬體廠商,希望你的硬體能在 Linux kernel 下運作,那麼就必須要有驅動程式。如果驅動程式的程式程式碼公開,等於硬體規格也公開的差不多了。許多廠商不願意這麼做,所以就提供編好的驅動程式,但不提供原始碼。

Android 的重點就是商業應用,Google採用了一些手法來繞過這問題。他們把驅動程式移到 "userspace",也就是說,把驅動程式變成在 Linux kernel 上頭跑,而不是一起跑的東西,這樣就可以避過GPL。然後,在 kernel 這邊開個小門,讓本來不能直接控制到硬體的 "userspace" 程式也可以碰得到,這樣只要把"開個小門"的程式程式碼公佈就行啦。"

看明白了嗎?

這段話的意思是說,Google玩了一個花招,在kernel和應用程式之間,自己做了一箇中間層,這樣就既不違反GPL許可,又能不讓外界看到廠商的硬體驅動和應用程式的原始碼。

裡面的關鍵在於,Kernel和Android的許可證不一樣,前者是GPL許可證,後者是Apache Software License(簡稱ASL)許可證。GPL許可證規定,對原始碼的任何修改都必須開源,所以Android開源了,因為它修改了Kernel。而ASL許可證規定,可以隨意使用原始碼,不必開源,所以建築在Android之上的硬體驅動和應用程式,都可以保持封閉。為了得到更多廠商的支援,Google有意選擇了這樣做,並且特意修改Kernel,使得原本應該包括在kernel中的某些功能,都被轉移到了userspace之中,因此得以避開開源。

這樣做或許有利於推廣Android,吸引廠商和軟體開發商的加入,但是Google也放棄了構建一個真正開源的手機系統的機會,從而也就不能獲得由全世界程式設計師提供智慧、分享程式碼、推動創新的好處。關於許可證問題的深入討論,請閱讀Ryan Paul的文章《Why Google chose the Apache Software License over GPLv2 for Android》

Google的這種做法,直接後果就是給Linux Kernel帶來了麻煩。Greg Kroah-Hartman清楚地說出了自己的不滿。

"...any drivers written for Android hardware platforms, can not get merged into the main kernel tree because they have dependencies on code that only lives in Google's kernel tree, causing it to fail to build in the kernel.org tree.

所有為Android寫的硬體驅動,都不能合併入kernel。因為它們只在Google的程式碼裡有效,在kernel里根本沒法用。

Because of this, Google has now prevented a large chunk of hardware drivers and platform code from ever getting merged into the main kernel tree. Effectively creating a kernel branch that a number of different vendors are now relying on.

由於這個原因,Google也從不把大量的硬體驅動程式和平臺原始碼向kernel提交。實際上,它創造出了一個kernel的分支,大量的開發者都依賴那個分支。"

這就是Android乾的事情:它修改了Kernel,但是又不提供修改的細節,自己搞了一個封閉的系統。說得難聽一點,它利用了開源社群,要求開源社群為它做貢獻,卻又不願提供回報。

所以,Linux Kernel就把Android踢出去了,真是再正常不過了。

人們有權利質疑,Android這樣的哲學是否正確?是否符合Google"不作惡"的口號?如果Android繼續這樣封閉下去,那麼開源社群為什麼要為它免費製作軟體呢?因為我又不是在為開源社群服務,而是在為Google服務。既然這樣的話,那還不如去支援iPhone呢,至少能在軟體商店裡多賣一點錢,而且賈伯斯看上去也更酷一點。

bg2010020403.jpg

slashdot上有很多關於此事的討論。有人指出:

"Google自己的網站,與微軟的網站一樣封閉。它開源出來的東西,都是根據GPL許可證不得不開源的。"

好吧,姑且不談Google本身,因為它至少不要求外界提供支援。但是Android不一樣,你不能假裝成開源系統,騙取社群的支援,然後又幹著封閉系統的勾當。以你的實力,不用Linux Kernel,自己開發一個Google Kernel,想必也不是難事。要是這樣做,任何人都不會有非議。可是,既然你選擇了Linux Kernel,並且大張旗鼓地宣傳,那麼你奉獻出什麼呢?難道你的奉獻就是給Kernel開一個口子嗎?

Google必須做出改變。正如Greg Kroah-Hartman最後的呼籲:

"I really don't know. Google shows no sign of working to get their code upstream anymore.

我真的不知道未來。Google看上去沒有任何改變程式碼的跡象。

I do hold out hope that Google does come around and works to fix their codebase to get it merged upstream to stop the huge blockage that they have now caused in a large number of embedded Linux hardware companies.

我確實希望Google做出改變,把它的程式碼合併進我們的程式碼,彌補已經出現的程式碼分裂。

I've privately offered in the past to help this work get done, and am doing again here publicly. But I need the help of the Google developers to make it happen, without them, nothing can change.

我私底下已經說過,我願意幫助完成這項工作,在這裡我再次公開這樣說。但是如果沒有Google程式設計師的加入,什麼也不會發生。"

Android必須變成一個真正的開源系統。如果像現在這樣封閉下去,就會被開源社群拋棄,就一定不會成功,即使有Google的支援。

UPDATE ONE

liufeng針對此文,寫了一篇很好的評論,推薦閱讀。

我接受他的批評,我確實有點感情用事。主要是因為對Google有太大的期望,所以不能接受它現在的這種做法。

這一次,也許不能說Google做錯了什麼,畢竟都符合GPL許可證的要求。但是代價也是巨大的----它放棄了創造未來的機會。我堅信,未來主流的手機作業系統一定是開源的,就像我堅信未來Linux一定勝過Windows一樣。現在,既然Google放棄了這個選擇,那麼只能等待其他人來做出開源的手機系統了。這也意味著,我們還要在黑暗中等待更久。

UPDATE TWO

Greg Kroah-Hartman原文中有一些關於技術的部分,由於我不太懂,就沒翻譯出來。網友黑日白月做了意譯和點評。

簡單的來講,Android 的硬體驅動依賴在 Google 程式碼樹裡的東西,於是儘管大多數廠商都將它們的驅動反饋給社群了,但是對 Google 程式碼樹的依賴導致它們無法併入主線(merge into mainline)。而 Google 程式碼樹一直沒併入主線是由於 Android 平臺安全架構模型需要額外的鉤子以及完全不同的幀快取驅動。

這次在 2.6.33 主線中把 Android 部分清理掉是由於廠商貢獻的這部分程式碼在離開 Google 的程式碼樹之後對其他嵌入式 Linux 沒有用處,乾脆從主線中除掉好了......

這跟前段時間 Linus 指責 Red Hat 把 Nouveau 併入主線的積極性不高一樣,最後 Red Hat 也是把 Nouveau 併入 2.6.33 的主線了麼......

沒有併入主線對於社群和廠商都不利,社群得不到驅動程式的擴充套件,廠商也得不到核心新特性的改善。但是並不是所有模組在一開始的時候都是併入主線的,總是要發展到某個相對成熟的階段或者解決了潛在的授權問題後才併入的。總之併入主線對雙方都有利,這個問題反應這次 Google 的併入主線積極性不高(不代表不開源),社群打它屁屁了......

(完)

相關文章