<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 專題 > Android,開源還是封閉?

          Android,開源還是封閉?

          作者:阮一峰 時(shí)間:2010-11-04 來源:阮一峰博客 收藏

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

          本文引用地址:http://www.ex-cimer.com/article/114194.htm

            “ 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.

            它解決了長期令手機(jī)制造商頭痛不已的問題:業(yè)界缺乏一個(gè)開源的Java虛擬機(jī),以及統(tǒng)一的應(yīng)用程序接口?,F(xiàn)在,程序員只要寫一次程序,就能在各種手機(jī)硬件平臺(tái)之上使用。”

            這段話解釋了,為什么的應(yīng)用程序,都必須用Java語言開發(fā)。因?yàn)椴贿@樣做的話,沒法讓程序做到硬件無關(guān)。

            且慢,這真的是理由嗎?傳統(tǒng)的Linux系統(tǒng),也并不依賴特定的硬件啊!只要把源代碼根據(jù)不同的平臺(tái),分別編譯一下,同一個(gè)程序不也照樣可以在不同的硬件架構(gòu)、不同的Linux發(fā)行版中使用嗎?

            那么,Android只采用kernel、只允許用java編程的真正原因,到底是什么?

            臺(tái)灣的科技網(wǎng)志MMDays一語道破真相:

            “Linux kernel 的版權(quán)是 GPL。

            這下問題來了:如果你是硬件廠商,希望你的硬件能在 Linux kernel 下運(yùn)作,那么就必須要有驅(qū)動(dòng)程序。如果驅(qū)動(dòng)程序的程序代碼公開,等于硬件規(guī)格也公開的差不多了。許多廠商不愿意這么做,所以就提供編好的驅(qū)動(dòng)程序,但不提供原始碼。

            Android 的重點(diǎn)就是商業(yè)應(yīng)用,Google采用了一些手法來繞過這問題。他們把驅(qū)動(dòng)程序移到 "userspace",也就是說,把驅(qū)動(dòng)程序變成在 Linux kernel 上頭跑,而不是一起跑的東西,這樣就可以避過GPL。然后,在 kernel 這邊開個(gè)小門,讓本來不能直接控制到硬件的 "userspace" 程序也可以碰得到,這樣只要把"開個(gè)小門"的程序代碼公布就行啦。”

            看明白了嗎?

            這段話的意思是說,Google玩了一個(gè)花招,在kernel和應(yīng)用程序之間,自己做了一個(gè)中間層,這樣就既不違反GPL許可,又能不讓外界看到廠商的硬件驅(qū)動(dòng)和應(yīng)用程序的源碼。

            里面的關(guān)鍵在于,Kernel和Android的許可證不一樣,前者是GPL許可證,后者是Apache Software License(簡(jiǎn)稱ASL)許可證。GPL許可證規(guī)定,對(duì)源碼的任何修改都必須開源,所以Android開源了,因?yàn)樗薷牧薑ernel。而ASL許可證規(guī)定,可以隨意使用源碼,不必開源,所以建筑在Android之上的硬件驅(qū)動(dòng)和應(yīng)用程序,都可以保持封閉。為了得到更多廠商的支持,Google有意選擇了這樣做,并且特意修改Kernel,使得原本應(yīng)該包括在kernel中的某些功能,都被轉(zhuǎn)移到了userspace之中,因此得以避開開源。

            這樣做或許有利于推廣Android,吸引廠商和軟件開發(fā)商的加入,但是Google也放棄了構(gòu)建一個(gè)真正開源的手機(jī)系統(tǒng)的機(jī)會(huì),從而也就不能獲得由全世界程序員提供智慧、分享代碼、推動(dòng)創(chuàng)新的好處。關(guān)于許可證問題的深入討論,請(qǐng)閱讀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寫的硬件驅(qū)動(dòng),都不能合并入kernel。因?yàn)樗鼈冎辉贕oogle的代碼里有效,在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.

            由于這個(gè)原因,Google也從不把大量的硬件驅(qū)動(dòng)程序和平臺(tái)源碼向kernel提交。實(shí)際上,它創(chuàng)造出了一個(gè)kernel的分支,大量的開發(fā)者都依賴那個(gè)分支。”

            這就是Android干的事情:它修改了Kernel,但是又不提供修改的細(xì)節(jié),自己搞了一個(gè)封閉的系統(tǒng)。說得難聽一點(diǎn),它利用了開源社區(qū),要求開源社區(qū)為它做貢獻(xiàn),卻又不愿提供回報(bào)。

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

            人們有權(quán)利質(zhì)疑,Android這樣的哲學(xué)是否正確?是否符合Google“不作惡”的口號(hào)?如果Android繼續(xù)這樣封閉下去,那么開源社區(qū)為什么要為它免費(fèi)制作軟件呢?因?yàn)槲矣植皇窃跒殚_源社區(qū)服務(wù),而是在為Google服務(wù)。既然這樣的話,那還不如去支持iPhone呢,至少能在軟件商店里多賣一點(diǎn)錢,而且喬布斯看上去也更酷一點(diǎn)。

          linux相關(guān)文章:linux教程


          c++相關(guān)文章:c++教程




          關(guān)鍵詞: google Android

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();