基於Linux內核的Android為什麼可以用Apache Licese 2.0?

基於Linux內核的Android為什麼可以用Apache Licese 2.0?

我們都知道Andorid用的是Linux的內核,而Linux內核是基於GNU的GPLv2開源許可協議的。瞭解GPL協議的朋友都知道GPL有很強的傳染性,不僅對GPL軟件的修改需要開源,靜態或動態鏈接到GPL庫的軟件也需要開源。但事實是Android系統除了Linux內核是GPL協議外,其他部分基本都是Apache 2.0協議,而GPLv2和Apache 2.0是不兼容的。這篇文章我們就來討論一下Android是採用什麼方法來避免GPL協議傳染的。

通過修改Linux內核類庫來規避GPL

在網上搜集資料的時候,看到有人說Android之所以免疫GPL是因為Linux內核相當於一個系統,Android只是操作系統上的一個軟件,所以不受GPL影響,這種說法其實是不對的。在之前的文章中我們討論過將程序移植到Linux系統上卻不想被GPL傳染的條件,那就是不要調用Linux的GPL庫,只能調用LGPL庫,那可以合理猜想Android應該是避免了調用GPL庫的。在維基百科上,找到這樣一段描述:

“Android是執行於Linux kernel之上,但並不是GNU/Linux。因為在一般GNU/Linux裡支持的功能,Android大都沒有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。Android為了達到商業應用,必須移除被GNU GPL授權證所約束的部分”

我本人並沒有接觸過Android的系統開發,對維基百科的這段描述也不知道對錯,但如果真是這樣的話那就可以很好的解釋為什麼Android不用受GPL的傳染了。Andorid把可能會傳染自己的庫都去掉了,換成自己開發的替代庫,替代的庫肯定不會用GPL協議了,而是BSD之類的協議,這樣一來內核之外的代碼就可以用其他的協議了,比如Android選擇的Apache 2.0。

硬件抽象層(HAL)

另外網上還有觀點說是Android的硬件抽象層(HAL)將Linux內核與其他部分隔開,起到免疫GPL的作用,沒想明白這樣怎麼免疫,HAL如果調用到內核的GPL的話那還是要受傳染。搜到篇對HAL層作用比較靠譜的文章,在這裡分享下其中的觀點。

基於Linux內核的Android為什麼可以用Apache Licese 2.0?

先看一下上圖Android架構中HAL層的位置,在內核與其他層之間。HAL層的主要作用其實是為了保護硬件廠商的利益。我們知道Linux各種驅動都是放在內核中的,就都得遵守GPL進行開源,這種模式在一些硬件廠商看來肯定是不可接受的,將驅動開源,代表著將硬件的機密數據都公之於眾了,並不利於Andorid系統的商用。於是Android就將驅動分成了兩層,一層放在Linux內核,一層放在內核之外的HAL層。HAL層其實就是對Linux內核驅動程序的封裝,提供接口供硬件廠商實現。既然是對Linux內核驅動的封裝,那就自然涉及到調用內核類庫,為了避免受GPL的傳染,Android調用的是自己加的bionic類庫,這個類庫是BSD協議,通過這種操作,HAL層就可以不用GPL協議,那硬件廠商的驅動也就不用開源了。

梳理Android規避GPL的手段,其實他們自己寫的bionic這樣的類庫很關鍵,你只有保證bionic沒有違反GPL規定,但其實這是有爭議的。

Some of the calls exposed by Bionic are ordinarily not available to userspace because they're excluded by the use of the "__KERNEL__" guards. If Google can define any call to the kernel from userspace as a “normal system call” (even those system calls ostensibly guarded by kernel matainers) simply by including it in its new C library, then a “normal system call”becomes whatever Google (or Oracle or Microsoft) wants it to be.

Bionic 暴露了原來在用戶空間不能使用的函數調用,這些調用原本在代碼中被 __KERNEL__ 的宏定義保護其運行在內核狀態。如果Google 只是在 Bionic 添加暴露的接口就可以自由的暴露 Linux 系統調用(這些系統調用明顯應該由 Linux 內核社區維護),那麼難免被其他人效仿。

結語

總的來說,Android是通過用自己的類庫替代Linux類庫來規避GPL,在此基礎上用HAL層將驅動從內核拿到外層(用戶空間),實現硬件驅動可以閉源。雖然現在看Android在商業上獲得了巨大成功,但其實還是有爭議的。

本文只是個人觀點,請各位辯證去看,有不對的地方請指正,歡迎關注、討論。

相關推薦

推薦中...