Linux和Android:哪個(gè)是你下一個(gè)設(shè)計(jì)的正確選擇?
如果你的下一個(gè)應(yīng)用會(huì)部署在一個(gè)32位或64位處理器和TCP/IP網(wǎng)絡(luò)的設(shè)備上,那么現(xiàn)在正是好機(jī)會(huì),因?yàn)槟阋呀?jīng)考慮選擇Linux或者Android作為你的操作系統(tǒng)。將原有實(shí)時(shí)操作系統(tǒng)和內(nèi)核相比較,無論是Android還是Linux都是成熟的企業(yè)/桌面級操作系統(tǒng)。它們都能運(yùn)行現(xiàn)成的中間件和打包應(yīng)用程序,即便是在專門的和移動(dòng)應(yīng)用環(huán)境中。然而,這兩個(gè)開源的操作系統(tǒng)從軟件堆棧的底層到頂層的開發(fā)、集成和托管方式都不一樣,而這些都影響著如何以及在何處找到最好的部署方案。
本文將會(huì)整理出在選擇小綠機(jī)器人或矮胖企鵝時(shí)要考慮的決定因素。特別地,本文關(guān)注的是為何在不同的使用場景下需要不同的開發(fā)方法,為何是使用這個(gè)操作系統(tǒng)而不是另一個(gè),為何有些應(yīng)用程序只需使用一個(gè)操作系統(tǒng),而有時(shí)候卻同時(shí)需要這兩個(gè)操作系統(tǒng)。
接下來的內(nèi)容部分代表了一個(gè)經(jīng)典的“思想運(yùn)動(dòng)”,但實(shí)際上這個(gè)討論源于一系列圍繞以能源管理,IVI(汽車信息娛樂系統(tǒng)),網(wǎng)絡(luò)和智能顯示設(shè)備為前提的項(xiàng)目目標(biāo)的對話和產(chǎn)品設(shè)計(jì)的辯論。
開放盒子還是封閉盒子?
絕大多數(shù)的原有系統(tǒng)都是非常封閉的實(shí)體。即使選中的實(shí)時(shí)操作系統(tǒng)支持標(biāo)準(zhǔn)的API(典型的如POSIX線程和/或BSDlite 網(wǎng)絡(luò)的子集),為那些平臺(tái)精心定制或托管在那些平臺(tái)上的應(yīng)用程序也還都是高度定制的。它們也仍然是唯一的在整個(gè)生命周期中運(yùn)行在那些系統(tǒng)的軟件。相比之下,那些部署在智能手機(jī)、平板電腦和其他越來越多的現(xiàn)代智能設(shè)備上的軟件已經(jīng)更像桌面**務(wù)器系統(tǒng)軟件了。由于有了越來越多的現(xiàn)代設(shè)備,原始設(shè)備制造商、運(yùn)營商和終端用戶已經(jīng)可以在設(shè)備的整個(gè)使用過程中安裝新應(yīng)用程序包了。固件和系統(tǒng)軟件也已能在不依靠特殊的工作臺(tái)軟件或工廠式RMA(翻修)程序的情況下完成升級。
在創(chuàng)造一個(gè)智能手機(jī)操作系統(tǒng)時(shí),Google將Android定位為一個(gè)開放的、現(xiàn)場可升級的應(yīng)用程序平臺(tái),這個(gè)移動(dòng)操作系統(tǒng)的核心思想是隨時(shí)能夠運(yùn)行應(yīng)用程序包。因此,為了創(chuàng)建,銷售和部署打包應(yīng)用程序,圍繞著Android平臺(tái)生態(tài)環(huán)境的優(yōu)化首先是通過Google Play應(yīng)用商店進(jìn)行的。
Linux系統(tǒng)也存在著和Android應(yīng)用程序平臺(tái)同樣的情況,但從實(shí)踐的角度來看,它更適合一次性部署在封閉盒應(yīng)用中。確實(shí)如此,Linux上的編程存在著更多被認(rèn)可的編程方法,比如C,C++,Java,Ruby,Python,Lua等等,但卻不存在一個(gè)為構(gòu)建、發(fā)布和安裝應(yīng)用程序的單一模型,也不存在一個(gè)跟Android一樣的支持(如果不確定)互操作性的硬件抽象模型。相反,存在著多種特定的方法(如包管理,apt-get等方法)和工作在不同內(nèi)核體系架構(gòu)樹(Kernel Tree)中的普通/最佳實(shí)踐。
由于這些務(wù)實(shí)的原因,Linux有點(diǎn)更適合于封閉或半封閉的應(yīng)用程序。如果不需要廣泛的互操作性,也不用考慮是否會(huì)破壞API和打包應(yīng)用程序,原始設(shè)備制造商(OEM)就可以從約束中解脫;這還能讓他們從為設(shè)備的硬件和軟件需求專門做定制和適配Linux的工作中解脫。若當(dāng)一個(gè)生態(tài)系統(tǒng)圍繞單一設(shè)備演變(就好像發(fā)生在Raspberry Pi和Python上),Linux的例子總能打破封閉盒子策略,就好像使用了Dalvik虛擬機(jī)和親睞于Java的Android一樣。
有一點(diǎn)需要注意,不要把開放盒子和封閉盒子的問題與開源和不開源的問題混淆。Linux內(nèi)核和GNU/Linux操作系統(tǒng)遠(yuǎn)比Android更開源。維護(hù)和升級Linux的社區(qū)是真正的精英管理的社區(qū),它對各種來源的資源都開放。相比之下,Android是Google和它的頂級合作伙伴OHA可以發(fā)號施令和掌控平臺(tái)發(fā)展路線圖的私人俱樂部,它只接受了外界組織的最小輸入。
你是想預(yù)算還是省點(diǎn)錢?
和開放/閉合盒子有關(guān)的問題是資源豐富與否的問題。有一個(gè)極端資源不足的例子是說只有一個(gè)網(wǎng)絡(luò)接口的大塊頭的設(shè)備,而一個(gè)極端資源豐富的設(shè)計(jì)則需要一個(gè)顯示器、鍵盤、定點(diǎn)設(shè)備或觸摸屏,一個(gè)健壯的內(nèi)存和存儲(chǔ)器部件等。世界上最真實(shí)的設(shè)計(jì)則是介于這兩者之間。
鑒于其智能手機(jī)的遺產(chǎn),Android適用于擁有豐富接口的消費(fèi)電子類應(yīng)用程序。在盒子之外,Android協(xié)議棧支持手持和平板類型的配置,而且它正越來越多地被部署在DTV,機(jī)頂盒,IVI系統(tǒng)和其他用戶界面密集型系統(tǒng)上。因此,沒有多少令人信服的理由去說服人們在無外設(shè)的系統(tǒng)上使用Android系統(tǒng)。
相反,Linux能夠支持的硬件配置和外圍設(shè)備范圍非常廣泛而且豐富,它還可以根據(jù)需要被裁減為一個(gè)只擁有內(nèi)存、存儲(chǔ)器等的極度精簡的系統(tǒng)。若沒有幾百M(fèi)B甚至GB的DRAM或更多的Flash空間(對于操作系統(tǒng)和應(yīng)用程序),是無法將Android部署在這樣的系統(tǒng)之上的,但你可能只需要幾十MB的存儲(chǔ)空間就能部署一個(gè)簡約型Linux系統(tǒng)(天啊,我從未想到過我會(huì)認(rèn)為Linux是那么的?。。?。在為精簡硬件配置挑選系統(tǒng)時(shí),另一個(gè)不投票給Android的原因是Android是CPU/GPU密集型的系統(tǒng)。
所以,如果你的設(shè)計(jì)是想通過部署一個(gè)低端CPU,不使用GPU,并且最小化內(nèi)存和存儲(chǔ)器來達(dá)到降低成本的目的,那么Linux是一個(gè)更合適的選擇。如果你有很多錢拿來“燒” -- 這些年,硅的價(jià)格只要幾美元了,但顯示器和輸入硬件則很可能是需要幾萬美元的,那么這時(shí)候Android會(huì)更適合你。
本地顯示還是自帶設(shè)備(BYO)?
在上個(gè)月的RTC雜志上,我寫了一篇為無外設(shè)系統(tǒng)挑選可用設(shè)備作為顯示服務(wù)器的文章。在文中我強(qiáng)調(diào)了本地?zé)o外設(shè)系統(tǒng)設(shè)計(jì)是如何利用在附近或遠(yuǎn)程的基于瀏覽器顯示設(shè)備的,包括智能手機(jī)、數(shù)字電視等。在Android和Linux中選擇其一的前提下,需要一個(gè)本地的還是遠(yuǎn)程的顯示器是另一個(gè)決定因素。若你的設(shè)備需要一個(gè)近距離的身體上接觸的顯示,那么擁有一個(gè)集成用戶接口(UI)的Android是一個(gè)不錯(cuò)的選擇。但如果用戶主要是想在遠(yuǎn)處通過瀏覽器或?qū)S玫闹悄苁謾C(jī)和平板電腦應(yīng)用程序來與設(shè)備交互,那么你可以通過支持使用Linux來托管Apache服務(wù)或幾個(gè)小Web服務(wù)器**務(wù)器端的編程范例(PHP,Python,C等)達(dá)到省掉Android系統(tǒng)的開銷的目的。
當(dāng)然,你可以根據(jù)需要同時(shí)配置Android和Linux來支持本地顯示、網(wǎng)絡(luò)接口或移動(dòng)應(yīng)用程序。兩個(gè)操作系統(tǒng)都支持豐富的用戶接口,而且都很容易被部署為Web服務(wù)器。但現(xiàn)成的Android應(yīng)用程序只能運(yùn)行和顯示在一個(gè)Android原生顯示設(shè)備上,而使用GTK+或Qt創(chuàng)建的Linux原生應(yīng)用則要求一個(gè)本地顯示器或一個(gè)可用的遠(yuǎn)程X服務(wù)器。
選擇Java或C/C++,還是LAMP?
一個(gè)半技術(shù)性的論點(diǎn)是Android或Linux是熟悉的編程語言和框架。如果你的團(tuán)隊(duì)已經(jīng)在一些其他環(huán)境中創(chuàng)建了Java應(yīng)用程序,那么你很可能會(huì)希望可以利用這個(gè)專業(yè)知識去創(chuàng)造其他設(shè)備上的應(yīng)用程序(甚至是無外設(shè)的設(shè)備)。但如果你的開發(fā)人員更熟悉C/C++,Lua,GTK+和QT類似的UI框架及無數(shù)的其他編程范式,那么強(qiáng)烈建議你選擇Linux和/或LAMP(Linux,Apache httpd,MySQL和PHP/Perl/Python)。
這個(gè)論點(diǎn)并非是很明確的,還要和在座的其他人一起討論。你也可以使用Android/Linux本地編程接口來創(chuàng)建你的應(yīng)用程序,但你可能會(huì)打破Android應(yīng)用程序的互操作性和封裝,并且不再擁有一個(gè)開放盒子。還請記住,在選擇某種語言和框架的同時(shí)往往還要考慮是本地顯示還是遠(yuǎn)程顯示。另外,也許更解放性的思想是當(dāng)今開發(fā)人員通曉多種語言,這樣無論在Android還是在Linux上使用Java,C++或Web編程語言都會(huì)感到同樣舒適。
考慮許可證
一套非技術(shù)然而復(fù)雜的以許可體制為中心的選擇標(biāo)準(zhǔn)圍繞著Linux和Android以及寫給這兩個(gè)操作系統(tǒng)的應(yīng)用程序和擴(kuò)展展開。許多原生設(shè)備制造商之所以采用Android是因?yàn)檫@個(gè)移動(dòng)操作系統(tǒng)的自由許可條款:實(shí)際上Apache 2.0對于Android中間件及其應(yīng)用程序的組件只是在底層Linux級別的通用公共許可證(GNU GPL)部分對原生設(shè)備制造商有披露資料的要求。Android中的頂級Apache許可證總是注明“OEM friendly”,是因?yàn)樵O(shè)備制造商修改了Android堆棧的大部分,并使用了在Apache和任何其他OSS許可證(表1)下都不需要披露修改和分發(fā)他們自己的代碼的硬件抽象層(HAL)來添加了外圍設(shè)備接口。實(shí)際情況稍微有些復(fù)雜,這在Black Duck的文章“Android-Opportunity,Complexity and Abundance”中有論述。
表格1 各種Android和Linux堆棧層的許可
這不是一個(gè)反對Linux的例子—它只是很可能完美地在一臺(tái)運(yùn)行著Linux的設(shè)備上隔離和保護(hù)專有代碼。然而,修改和添加到Linux堆棧上的每一種類型都需要考慮它自己的實(shí)際情況(見表1)。特別地,一些原生設(shè)備制造商不喜歡直接在任何GNU許可證(GPLv2/v3,LGPL等)下工作,這就導(dǎo)致他們選擇了Android,而非Linux。當(dāng)然,他們?nèi)匀恍枰渴餖inux內(nèi)核,但運(yùn)行其上的Android庫和中間件僅僅將它作為一個(gè)“緩沖器”。通常做到這樣就可以感到很舒適了。
在這里,我們的目的只是為各種類型的智能設(shè)備提供選擇Android或Linux的一般指導(dǎo)方法。對于垂直應(yīng)用程序(手機(jī)、醫(yī)學(xué)設(shè)備、運(yùn)輸工具等)而言,這種分類本身并不想列出所有的方法,而是想提供開發(fā)范例依賴的選擇標(biāo)準(zhǔn),或者提供考慮設(shè)備市場和部署生命周期的途徑。
表2總結(jié)了本文表述的論點(diǎn)。它強(qiáng)調(diào)了選擇不是絕對的:由于Android包含了一個(gè)Linux內(nèi)核實(shí)例,Android系統(tǒng)理論上可以托管和運(yùn)行和Linux一樣的軟件。Linux同樣因?yàn)槟芡泄芎瓦\(yùn)行Java,以及一系列的用戶接口(UI)框架,它也能被部署在有本地顯示器的設(shè)備中,即使在和Android有密切關(guān)系的手機(jī)、平板電腦和其他設(shè)備上。
表2 總結(jié)了Android和Linux特點(diǎn)的論點(diǎn)
所以,去使用Android或Linux或同時(shí)使用這兩個(gè)操作系統(tǒng)吧。但需要先考慮以下問題:
在你的設(shè)備的整個(gè)壽命中,系統(tǒng)軟件和應(yīng)用程序是如何部署的?你想將你的預(yù)算中的大部分花在哪些地方上?設(shè)備主要有哪些用戶交互模式?你的開發(fā)人員有哪些編程嗜好?你選擇的平臺(tái)和許可證對你公司的知識產(chǎn)權(quán)(IP)組合有怎么樣的影響?