深入解讀Linux與Android的相互關係

大家都知道Android是基於Linux內核的操作系統,也曾經和Linux基金會因爲內核問題產生過分歧,本文將開始對Android的內核進行剖析,主要介紹AndroidLinux之間的關係,後續還會講到Android系統在Linux系統之上擴展的部分功能和驅動。
雖然Android基於Linux內核,但是它與Linux之間還是有很大的差別,比如AndroidLinux內核的基礎上添加了自己所特有的驅動程序。下面我們就來分析一下它們之間究竟有什麼關係?
一、Android爲什麼會選擇Linux
成熟的操作系統有很多,但是Android爲什麼選擇採用Linux內核呢?這就與Linux的一些特性有關了,比如:
  1、強大的內存管理和進程管理方案
  2、基於權限的安全模式
  3、支持共享庫
  4、經過認證的驅動模型
  5Linux本身就是開源項目
  更多關於上述特性的信息可以參考Linux 2.6版內核的官方文檔,這便於我們在後面的學習中更好地理解Android所特有的功能特性。接下來分析AndroidLinux的關係。
  二、Android不是Linux
  看到這個標題大家可能會有些迷惑,前面不是一直說Android是基於Linux內核的嗎,怎麼現在又不是Linux?迷惑也是正常的,請先看下面幾個要點,然後我們將對每一個要點進行分析,看完後你就會覺得Android不是Linux了。
  因爲它沒有本地窗口系統,沒有glibc的支持,而且並不包括一整套標準的Linux使用程序,同時增強了Linux以支持其特有的驅動。
  1.它沒有本地窗口系統
  什麼是本地窗口系統呢?本地窗口系統是指GNU/Linux上的X窗口系統,或者Mac OX XQuartz等。不同的操作系統的窗口系統可能不一樣,Android並沒有使用(也不需要使用)LinuxX窗口系統,這是Android不是Linux的一個基本原因。
  2.它沒有glibc支持
  由於Android最初用於一些便攜的移動設備上,所以,可能出於效率等方面的考慮,Android並沒有採用glibc作爲C庫,而是Google自己開發了一套Bionic Libc來代替glibc
  3.它並不包括一整套標準的Linux使用程序
  Android並沒有完全照搬Liunx系統的內核,除了修正部分LiunxBug之外,還增加了不少內容,比如:它基於ARM構架增加的Gold-Fish平臺,以及yaffs2 FLASH文件系統等。
  4.Android專有的驅動程序
  除了上面這些不同點之外,Android還對Linux設備驅動進行了增強,主要如下所示。
  1)Android Binder 基於OpenBinder框架的一個驅動,用於提供 Android平臺的進程間通信(InterProcess CommunicationIPC)功能。源代碼位於drivers/staging/android/binder.c
  2)Android電源管理(PM) 一個基於標準Linux電源管理系統的輕量級Android電源管理驅動,針對嵌入式設備做了很多優化。源代碼位於:
  kernel/power/earlysuspend.c
  kernel/power/consoleearlysuspend.c
  kernel/power/fbearlysuspend.c
  kernel/power/wakelock.c
  kernel/power/userwakelock.c
  3)低內存管理器(Low Memory Killer) Linux的標準的OOM(Out Of Memory)機制更加靈活,它可以根據需要殺死進程以釋放需要的內存。源代碼位於 drivers/staging/ android/lowmemorykiller.c
  4)匿名共享內存(Ashmem) 爲進程間提供大塊共享內存,同時爲內核提供回收和管理這個內存的機制。源代碼位於mm/ashmem.c
  5)Android PMEM(Physical) PMEM用於向用戶空間提供連續的物理內存區域,DSP和某些設備只能工作在連續的物理內存上。源代碼位於drivers/misc/pmem.c
最近開源界一件比較大的事情就是Linux Kernel的維護者Greg Kroah-Hartman宣佈,將Android 代碼從 Linux kernel 代碼庫中刪除,此事對於普通用戶可能並沒有什麼影響,但對於開發者來說,尤其是開源社區的開發者來說,算是一顆重磅炸彈吧。筆者聽說這個消息的時候也是很 驚奇,Android不是一直都以開源身份自居嗎?也正因爲如此才被廣大開源社區的用戶所支持嗎?今天筆者看到一篇描述通透的評論,於是轉過來,希望更多朋友可以瞭解事情的始末和真相:

滿大街都在談論Android。許多人覺得,iPhone將受到它的強力挑戰。

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

  “首先,Android應用程序只能用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的距離還要遠。


       然後,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 h文明用語e 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呢,至少能在軟件商店裏 多賣一點錢,而且喬布斯看上去也更酷一點。

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

  “Google自己的網站,與微軟的網站一樣封閉。它開源出來的東西,都是根據GPL許可證不得不開源的。”
  好吧,姑且不談Google本身,因爲它至少不要求外界提供支持。但是Android不一樣,你不能假裝成開源系統,騙取社區的支持,然後又幹着封 閉系統的勾當。

  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 h文明用語e 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的支持。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章