Android為什麼不直接執行Linux的程序?而是自己搞一套?


1.Android 本身運行Linux之上,同樣環境可以直接運行Linux程序的。只不過Android的標準C庫是重寫過,所以在Linux 下編譯動態鏈接程序無法直接運行,但靜態鏈接程序或者是在Android的環境重編譯一次後是可以運行。比如說root後手機運行嵌入式shell解釋器--busybox 。就是一個標準Linux C程序,只不過重編譯一下。

Android 自己也帶了大量小工具,比如手機上運行 setprop ,getevent 就是命令行工具。

並且程序還能跳開Android界面直接操作顯存,這樣就象粗暴把屏幕衝掉一樣。

2.Android 開發一整套框架的最核心的原因,在iphone當出世的年代,其它能夠與其抗衡的移動設備GUI框架幾乎沒有。比如支持多點解摸,比較漂亮又適合移動設備界面,以及一個移動設備需要配套各種支持組件(成熟的輸入法,硬體配置,移動的瀏覽器,穩定的電話通訊模塊)。Android自己從頭寫一套東西。

至於說其它,使用java虛擬機,HAL版權保護之類,都是這個出發點帶出來東東。

ps: 魅族的M8相當於實現Android一半的工作量。它在WinCE上幾乎完整開發一整套體系。但是很可惜這個WinCE太不給力,主要對新興硬體支持很難。還不如在Android上來改進。

ps2:Moto出一款在中國大賣的 A1200 到後升級到A1800。就比較超前的Linux手機,用的Qtopia,就是後來死在Nokia手裡MeeGo 前身,也有一整套東西,但是公司實力太小了,而當時沒有iphone 界面參考,大家都是很簡單的圖形界面,即便這樣已經超前很多了。

3.至於說Android 說的自己HAL可以跳開開源協議,做自己的私有驅動,至少我看到幾乎沒幾個產家這樣做。現有HAL驅動仍是對Linux的驅動的封裝,很簡單Linux的驅動又多又好,更新還快,免費拿來馬上就用。自己重新整個還得自己花錢請人開發,不見的比Linux做得好,而且調試相當相當相當麻煩,我相作做過Android HAL驅動的人最常見動作就是不停重啟機器吧。


來嘗試回答一下,僅僅從技術上來講,把Linux直接搬到移動終端有這麼些問題:

  • Linux下面常用的圖形界面是X Window,儘管從Unix/大型機時代一直在改進,但是那種client / server架構效率不高,並不是很適合移動終端
  • X Window只是一個圖形界面協議,其上還需要窗口管理器,大家比較熟悉的是桌面系統上跑的gnome或者KDE,實際上還有非常多如xfce, twm等等,常用的這些窗口管理器都不適合觸摸屏
  • Linux的圖形界面缺少好的封裝,X Window編程比較複雜,而且控制項沒有統一界面規範和編程介面,各家窗口管理器用各自的控制項,界面風格難以統一

  • 跨平台兼容性差,Linux的二進位可執行文件是依賴於CPU架構的,這樣多個廠商如果用不同架構的處理器, Android程序就沒有辦法跑了
  • 缺少高效的包管理系統,各家的Linux用不同的包管理系統,比如apt, rpm, dpkg/ipkg對可執行文件/庫文件/配置文件的管理很鬆散,不適合Android移動平台將每個App放在相對獨立的文件空間/虛擬機的需求
  • 還有其他的技術原因,比如字體、圖像、界面特效支持不佳等等。

當然,還有很多商業原因促成了Android,Google由於想把它們的手伸到終端上,控制內容的入口,它們在背後的推動也是商業上首要的因素。


粘貼一個 王垠的帖子。個人以為說的比較有特點。

談 Linux,Windows 和 Mac_王垠

談 Linux,Windows 和 Mac (2013-03-07 08:55:55)

轉載▼

分類: 操作系統

這段時間受到很多人的來信。他們看了我很早以前寫的推崇 Linux 的文章,想知道如何「拋棄 Windows,學習 Linux」。天知道他們在哪裡找到那麼老的文章,真是好事不出門…… 我覺得我有責任消除我以前的文章對人的誤導,洗清我這個「Linux 狂熱分子」的惡名。我覺得我已經寫過一些澄清的文章了,可是怎麼還是有人來信問 Linux 的問題。也許因為感覺到「輿論壓力」,我把文章都刪了。

簡言之,我想對那些覺得 Linux 永遠也學不會的「菜鳥」們說:

1. Linux 和 Unix 裡面包含了一些非常糟糕的設計。不要被 Unix 的教條主義者嚇倒。學不會有些東西很多時候不是你的錯,而是 Linux 的錯,是「Unix 思想」 的錯。不要浪費時間去學習太多工具的用法,鑽研稀奇古怪的命令行。那些貌似難的,複雜的東西,特別要小心分析。

2. Windows 避免了 Unix,Linux 和 Mac OS X 的很多問題。微軟是值得尊敬的公司,是真正在乎程序開發工具的公司。我收回曾經對微軟的鄙視態度。請菜鳥們吸收 Windows 設計裡面好的東西。另外 Visual Studio 是非常好的工具,會帶來編程效率的大幅度提升。請不要歧視 IDE。要正視 Emacs,VIM 等文本編輯器的局限性。當然,這些正面評價不等於說你應該為微軟工作。就像我喜歡 iPhone,但是卻不一定想給 Apple 工作一樣。

3. 學習操作系統最好的辦法是學會(真正的)程序設計思想,而不是去「學習」各種古怪的工具。所有操作系統,資料庫,Internet,以至於 WEB 的設計思想(和缺陷),幾乎都能用程序語言的思想簡單的解釋。

先說說我現在對 Linux 和相關工具(比如 TeX)的看法吧。我每天上班都用 Linux,可是回家才不想用它呢。上班的時候,我基本上只是盡我所能的改善它,讓它不要給我惹麻煩。Unix 有許許多多的設計錯誤,卻被當成了教條,傳給了一代又一代的程序員,惡性循環。Unix 的 shell,命令,配置方式,圖形界面,都是相當糟糕的。每一個新版本的 Ubuntu 都會在圖形界面的設計上出現新的錯誤,讓你感覺歷史怎麼會倒退。其實這只是表面現象。Linux 所用的圖形界面(X Window)在本質上幾乎是沒救的。我不想在這裡細說 Unix 的缺點,在它出現的早期,已經有人寫了一本書,名叫 Unix Hater"s Handbook,裡面專門有一章叫做 The X-Windows Disaster。它分析後指出,X Window 貌似高明的 client-server 設計,其實並不像說的那麼好。

這本書彙集了 Unix 出現的年代,很多人對它的咒罵。有趣的是,這本書有一個「反序言」,是 Unix 的創造者之一 Dennis Ritchie 寫的。我曾經以為這些罵 Unix 的人都是一些菜鳥。他們肯定是智商太低,或者被 Windows 洗腦了,不能理解 Unix 的高明設計才在那裡罵街。現在理解了程序語言的設計原理之後,才發現他們說的那些話裡面居然大部分是實話!其實他們裡面有些人在當年就是世界頂尖的編程高手,自己寫過操作系統和編譯器,功底不亞於 Unix 的創造者。在當年他們就已經使用過設計更加合理的系統,比如 Multics,Lisp Machine 等。

可惜的是,在現在的操作系統書籍裡面,Multics 往往只是被用來襯托 Unix 的「簡單」和偉大。Unix 的書籍喜歡在第一章講述這樣的歷史:「Multics 由於設計過於複雜,試圖包羅萬象,而且價格昂貴,最後失敗了。」 可是 Multics 失敗了嗎?Multics,Oberon,IBM System/38, Lisp Machine,…… 在幾十年前就擁有了 Linux 現在都還沒有的好東西。Unix 裡面的東西,什麼虛擬內存,文件系統,…… 基本上都是從 Multics 學來的。Multics 的機器,一直到 2000 年都還在運行。Unix 不但「竄改」了歷史教科書,而且似乎永遠不吸取教訓,到現在還沒有實現那些早期系統早就有的好東西。Unix 的設計幾乎完全沒有一致性和原則。各種工具程序功能重複,冗餘,沒法有效地交換數據。可是最後 Unix 靠著自己的「廉價」,「宗教」和「哲學」,戰勝了別的系統在設計上的先進,統治了程序員的世界。

如果你想知道這些「失敗的」操作系統裡面有哪些我們現在都還沒有的先進技術,可以參考這篇文章:Oberon - The Overlooked Jewel。它介紹的是 Niklaus Wirth(也就是 Pascal 語言的設計者)的 Oberon 操作系統。

勝者為王,可是 Unix 其實是一個暴君,它不允許你批評它的錯誤。它利用其它程序員的輿論壓力,讓每一個系統設計上的錯誤,都被說成是用戶自己的失誤。你不敢說一個工具設計有毛病,因為如果別人聽到了,就會以為你自己不夠聰明,說你「人笨怪刀鈍」。這就像是「皇帝的新裝」里的人們,明明知道皇帝沒穿衣服,還要說「這衣服這漂亮」!總而言之,「對用戶友好」這個概念,在 Unix 的世界裡是被歧視,被曲解的。Unix 的狂熱分子很多都帶有一種變態的「精英主義」。他們以用難用的工具為豪,鄙視那些使用「對用戶友好」的工具的人。

我曾經強烈的推崇 FVWM,TeX 等工具,可是現在擦亮眼睛看來,它們給用戶的界面,其實也是非常糟糕的設計,跟 Unix 一脈相承。他們把程序設計的許多沒必要的細節和自己的設計失誤,無情的暴露給用戶。讓用戶感覺有那麼多東西要記,彷彿永遠也沒法掌握它。實話說吧,當年我把 TeXbook 看了兩遍,做完了所有的習題(包括最難的「double bend」習題)。幾個月之後,幾乎全部忘記乾淨。為什麼呢?因為 TeX 的語言是非常糟糕的設計,它沒有遵循程序語言設計的基本原則。

這裡有一個鮮為人知的小故事。TeX 之所以有一個「擴展語言」,是 Scheme 的發明者 Guy Steele 的建議。那年夏天,Steele 在 Stanford 實習。他聽說 Knuth 在設計一個排版系統,就強烈建議他使用一種擴展語言。後來 Knuth 採納了他的建議。不幸的是 Steele 幾個月後就離開了,沒能幫助 Knuth 完成語言的設計。Knuth 老爹顯然有我所說的那種「精英主義」,他咋總是設計一些難用的東西,寫一些難懂的書?

一個好的工具,應該只有少數幾條需要記憶的規則,就像象棋一樣。而這些源於 Unix 的工具卻像是「魔鬼棋」或者「三國殺」,有太多的,無聊的,人造的規則。有些人鄙視圖形界面,鄙視 IDE,鄙視含有垃圾回收的語言(比如 Java),鄙視一切「容易」的東西。他們卻不知道,把自己沉浸在別人設計的繁複的規則中,是始終無法成為大師的。就像一個人,他有能力學會各種「魔鬼棋」的規則,卻始終無法達到象棋大師的高度。所以,容易的東西不一定是壞的,而困難的東西也不一定是好的。學習計算機(或者任何其它工具),應該「只選對的,不選難的」。記憶一堆的命令,烏七八糟的工具用法,最後腦子裡什麼也不會留下。學習「原理性」的東西,才是永遠不會過時的。

Windows 技術設計上的很多細節,也許在早期是同樣糟糕的。但是它卻向著更加結構化,更加簡單的方向發展。Windows 的技術從 OLE,COM,發展到 .NET,再加上 Visual Studio 這樣高效的編程工具,這些帶來了程序員和用戶效率的大幅度提高,避免了 Unix 和 C 語言的很多不必存在的問題。Windows 程序從很早的時候就能比較方便的交換數據。比如,OLE 讓你可以把 Excel 表格嵌入到 Word 文檔裡面。不得不指出,這些是非常好的想法,是超越「Unix 哲學」的。相反,由於受到「Unix 哲學」的誤導,Unix 的程序間交換數據一直以來都是用字元串,而且格式得不到統一,以至於很多程序連拷貝粘貼都沒法正確進行。Windows 的「配置」,全都記錄在一個中央資料庫(註冊表)裡面,這樣程序的配置得到大大的簡化。雖然在 Win95 的年代,註冊表貌似老是惹麻煩,但現在基本上沒有什麼問題了。相反,Unix 的配置,全都記錄在各種稀奇古怪的配置文件裡面,分布在系統的各個地方。你搞不清楚哪個配置文件記錄了你想要的信息。每個配置文件連語法都不一樣!這就是為什麼用 Unix 的公司總是需要一個「系統管理員」,因為軟體工程師們才懶得記這些麻煩的東西。

再來比較一下 Windows 和 Mac 吧。我認識一個 Adobe 的高級設計師。他告訴我說,當年他們把 Photoshop 移植到 Intel 構架的 Mac,花了兩年時間。只不過換了個處理器,移植個應用程序就花了兩年時間,為什麼呢?因為 Xcode 比起 Visual Studio 真是差太多了。而 Mac OS X 的一些設計原因,讓他們的移植很痛苦。不過他很自豪的說,當年很多人等了兩年也沒有買 Intel 構架的 Mac,就是因為他們在等待 Photoshop。最後他直言不諱的說,微軟其實才是真正在乎程序員工具的公司。相比之下,Apple 雖然對用戶顯得友好,但是對程序員的界面卻差很多。Apple 尚且如此,Linux 對程序員就更差了。可是有啥辦法呢,有些人就是受虐狂。自己痛過之後,還想讓別人也痛苦。就像當年的我。

我當然不是人云亦云。微軟在程序語言上的造詣和投入,我看得很清楚。我只是通過別人的經歷,來驗證我已經早已存在的看法。所以一再宣揚別的系統都是向自己學習的 Apple 受到這樣的評價,我也一點不驚訝。Mac OS X 畢竟是從 Unix 改造而來的,還沒有到脫胎換骨的地步。我有一個 Macbook Air,一個 iPhone 5,和一個退役的,裝著 Windows 7 的 T60。我不得不承認,雖然我很喜歡 Macbook 和 iPhone 的硬體,但我發現 Windows 在軟體上的很多設計其實更加合理。

我為什麼當年會鄙視微軟?這很簡單。我就是跟著一群人瞎起鬨而已!他們說 Linux 能拯救我們,給我們自由。他們說微軟是邪惡的公司…… 到現在我身邊還有人無緣無故的鄙視微軟,卻不知道理由。可是 Unix 是誰製造的呢?是 ATT。微軟和 ATT 哪個更邪惡呢?我不知道。但是你應該了解一下 Unix 的歷史。ATT 當年發現 Unix 有利可圖,找多少人打了多少年官司?說微軟搞壟斷,其實 ATT 早就搞過壟斷了,還被拆散成了好幾個公司。想想世界上還有哪一家公司,獨立自主的設計出這從底至上全套家什:程序語言,編譯器,IDE,操作系統,資料庫,辦公軟體,遊戲機,手機…… 我不得不承認,微軟是值得尊敬的公司。

公司還不都一樣,都是以利益為本的。我們程序員就不要被他們利用,作為利益鬥爭的炮眼啦。見到什麼好就用什麼,就學什麼。自己學到的東西,又不屬於那些壟斷企業。我們都有自由的頭腦。

當然我不是在這裡打擊 Linux 和 Mac 而鼓吹 Windows。這些系統的紛爭基本上已經不關我什麼事。我只是想告訴新人們,去除頭腦里的宗教,偏激,仇恨和鄙視。每次仇恨一個東西,你就失去了向它學習的機會。

後記:「對用戶友好」是一個值得研究,卻又研究得非常不夠的東西。很多 UI 的設計者,把東西設計的很漂亮,但是卻不方便,不順手。如果你想了解我認為怎樣的設計才是「對用戶友好的」,可以參考這篇博客。


這涉及Google在設計Android時,對廣大手機廠家,或者說廣大硬體廠商的深刻理解,如果直接跑Linux程序,按照GPL協議,這些程序必須公開源代碼,而對於很多硬體而言,datasheet是資產,是競爭力,是不會公開的,這也是為什麼很多硬體廠商根本無視用戶的要求,就是不為Linux系統寫設備驅動的緣故。

而Android利用額外的一層「虛擬機」,繞開了這個限制(印象中使用了商業友好的Apache協議),從而使得廣大的硬體廠商不用公開自己的設備硬體方案就可以使用一個比較完整的移動設備操作系統。這是Google的良苦用心啊。不然就算大家相信Google的技術實力,也不會一窩蜂擁上去使用它


第一次回答問題,回答不好,見諒!

1)純粹的Linux核心沒有圖形界面,對普通用戶而言,這不可用。

2)Linux上的流行界面gnome和kde,一個是C庫,一個是C++庫,對於開發人員而言開發難度很大。

3)gnome和kde的穩定性不是很強,容易死機。

4)對於公司而言,搞一套新框架也利於掌控系統平台。

5)linux支持若干處理器,不存在通用的一次編譯,處處運行的程序,除非有虛擬機支持。

iphone也不能直接執行mac上的程序,也對mac進行了裁剪。


你說的可能是應用層 有交互界面的程序,底層程序都是通用的。


推薦閱讀:

聯想29億收購摩托羅拉,谷歌賠了嗎?
Android 如今仍有哪些缺點?
氫OS和氧OS的區別之處在哪裡?
Blackberry 10 真的可以兼容 Android 和 iOS 的應用嗎?
面試官看一個Android項目看的是什麼?

TAG:編程 | Linux | Android開發 | Android |