為何谷歌不設計一種通用的安卓系統?

如題,一直有個疑問,來與大家討論:

為什麼安卓沒有通用版系統呢?

目前的狀況是,每家手機廠商分別發布rom,然後每種機型都需要單獨適配。結果導致很多安卓機器通常發布之後就沒有更新了,手動刷機還沒有適配好的rom包。

實際上,大量機器都是採用通用的晶元和器件,理論上可以刷類似的rom包,比如同樣採取驍龍810晶元兩款手機,更有甚者大量千元機採用聯發科的整套方案,硬體相似程度更高。

如果把rom拆分為:操作系統內核與框架,驅動,用戶ui;這樣的話,谷歌提供內核和運行庫和框架,硬體商提供具體驅動,大型互聯網公司、開源社區和手機廠商提供不同的用戶ui,其他互聯網公司、軟體廠商提供應用。

這樣的話,用戶根據處理器,圖形晶元以及其他硬體去下載對應的驅動,選擇喜歡的ui,然後進行刷機,這樣豈不是方便的多,而且省去了每款機型適配的麻煩,廣大用戶也可以自由選擇,開發者只需面對系統框架和UI,不用考慮各種機型和解析度。為什麼谷歌不這麼做呢?

又如微軟windows系統,可以直接安裝再帶基本驅動的通用版系統,然後通過系統更新獲得特定驅動。開發者只需要處理windows api,不需要考慮硬體差異。除了ui無法定製且系統閉源兩個缺點之外,系統更新方式,驅動結構等都是谷歌值得學習的,我感覺谷歌有點不作為。

大家是怎麼看的?

/*********************************************************************************

題目已更新,感謝@北方吳彥祖的指正。

/***********************************************************************************************************

謝謝大家的回答!大家主要討論的是為何安卓不能安裝驅動的問題,有從linux特性,從rom製作方法,乃至於商業策略等方面的解答,驅動這方面現在討論的比較清楚了,謝謝!

此外我還想請各位補充一下關於UI通用性的解讀。

如上所述,一個完整的安裝劃分為:內核與框架,驅動,用戶ui三部分。按照軟體工程的基本思路,應該設這樣的:操作系統屏蔽硬體差異,同時為用戶程序提供一致的調用介面;用戶程序不關心底層實現,只需通過約定好的調用方法使用對應功能。

那麼,問題來了,對於一個安卓UI,理論上是與硬體無關的。也就是說,一份安卓UI,應當可以運行在所有可以提供運行所需資源的設備上,而不關心硬體的具體驅動方法,只需調用系統api;

可是假如是這樣的話,為何所有安卓都需要進行機型適配呢?比如MIUI應該是與具體設備類型無關的,理論上直接複製到另一台資源充分的設備上,應該是可運行的。

實際上,在linux中原本就有桌面環境的概念,著名的有KDE,GNOME等。現在,假如我安裝了Ubuntu系統,而我不喜歡它的桌面,我可以把它卸載,然後安裝kde,這整個過程就像安裝軟體一樣簡單,直接在應用商店下載即可。

上面的例子應該清楚表達了我的想法。那麼我們回到安卓上面來,按照高內聚,低耦合的原則,安裝UI應當是自成一體的。為什麼不可以在不改動系統底層和原有應用的條件下,直接卸載掉小米的MIUI,轉而安裝flyme呢?求解答。


謝邀。這是個架構問題,一般工程師只能看到表面限制,入題的角度都是錯的,是回答不好這個問題的。

架構設計是比較高級的設計,考慮問題和一般的開發者考慮的很不一樣,需要開發者有相當的經驗,比如你在Linux上用C寫一個hello world,你用printf就好了。但如果你要寫一個通用的hello world,你就要考慮你的「平台假設」,比如你在OSE上,你就不能考慮用printf了。(有人順理成章地想著設計「抽象層」,但每個「抽象層」,都是性能和構架瓶頸的開始,是不能隨便引入的)。架構設計文檔的前面有一個非常重要的章節,稱為「假設與約束」。是專門考慮這個問題的,不進行假設和約束,設計就有可能變得無限大,導致無法設計無法完成或者目標不聚焦,構架控制失敗。

假設和約束的設計,是架構設計的重要考量要素,這是基於架構師對技術細節,自身團隊實力和市場需求的正確把握,是架構設計,特別是大型系統的構架設計,最考功夫的部分。

對於Android的構架師來說,首先它已經採取了「借」第三方力量的發展模式了(參考這個分析:

如何理解Google的Android戰略? - in nek 的回答),這就涉及一個問題,Google Android開發組自己控制什麼力量,讓第三方廠家控制什麼力量。最好的結果當然是Google控制技術演進的方向,其他廠家解決技術方向本身的困難。

但控制技術發展方向的人,必須對這個技術方向有非常深入的投資,否則你就有可能帶錯路,這樣,整個Android生態圈都死了,你細節技術做得再好,都沒有意義。所以Google不能對所有技術方向都自己投入,何況還要考慮到Linux+Android Frame的結構並沒有對智能手機市場做過深入的打磨(比如如何保證節電?如何保證流暢(實時性)?如何提供效率?如何滿足用戶在小屏上的操作愛好等),這種情況下,Google首先控制的是用戶介面層,即,什麼樣的UI(包括UI之下的基礎支持技術,不是我們一般人考慮的可見的那個UI)才能給用戶最好的體驗。其他部分,讓別人的打磨。所以Android的假設是建立在HAL層上的。HAL層的設計,不是基於「有多少種硬體,我來抽象它的共同點」來考慮的,而是基於「我的UI層就用這種方法來構造了,請來給我一個合適的硬體抽象,發揮你硬體最大的能力吧」這個思路來構造的。他們是一個互動的過程,Google要給硬體供應商留下足夠的自由度,才能讓整個改進循環不斷繼續下去,為Android生態圈贏取競爭力。

通過HAL的設計,Android就很容易定義了他們和硬體開發商的工作範圍:就是Android負責討好用戶,硬體開發商負責優化軟硬體的性能。如果Google向前突出一步,比如完全使用三星的硬體介面作為標準(把三星的HAL當作Android的一部分,然後要求使用特定版本的內核即可),那麼其他廠家就會立即被三星逼死,因為三星的所有設計都和Google契合,而其他的必須修改了才能契合,競爭基礎不一樣了,其他人就只能死掉。(像最近Google就採納了MTK的雙卡方案作為基礎方案,其他做雙卡的廠家的框架立即就被廢了,那些廠家總得重新學習相關知識吧?) 這樣Android生態圈就會失去一大堆重要的頭腦,憑Android現在的技術投入,它是拼不過蘋果的。

放棄業界合作夥伴是個相當強大而危險的做法,蘋果當初的Mac電腦就這樣死在兼容機手上的,新一波技術來臨,蘋果又活過來了,但你看著,只要蘋果無法擊中下一個創新點。它的模式是活不長的。強大如微軟,當他要走兼容機合作路線,就必須在ACPI上給OEM們自由度,而且即使如此,微軟在啟動框架上的發展都有點死氣沉沉了,因為除了微軟自己,沒有人可單獨投入啟動過程的優化上,而新一代的啟動框架,包括對GPT的支持,安全啟動支持等,某些人在突飛猛進,而MS只能在一兩個「主流」路線上堅持,一旦出現彎道,就有可能措手不及。

其實構架的有趣之處在於不確定性,我說的這些也不一定抓到了真正的脈絡,但題主問的問題,其本質在這個地方。

寫完以後回頭看看,感覺寫深了,但也不好改了,算了,你們還是忽略我吧。

2016-2-21補充:

有人私下問我,題主提到的UI-OS-驅動三者分開提供的模式是否可以實施。我也在這裡統一回答:對Android現有的架構來說,是很困難的。大家有時間可以考慮關注一下ARA項目,這個項目的目標是可以動態換硬體,它現在遇到的最大困難是換硬體的時候,驅動怎麼辦。Linux是個源代碼合作平台,參考這個表述:為什麼BSD系統的軟體包管理器很多都是下載源碼編譯,而不是直接下載編譯好的二進位文件? - in nek 的回答。很難做到Windows那種OS和驅動分離發展的,這既是優點,也是缺點。要實現ARA,我個人覺得最優的方案只能是Linux Kernel版本整體可以動態升級,所有人如果想支持新的硬體,首先合版本到一個統一的分支上。但以現在ARM的工程師的水平,大部分都是從嵌入式領域出來的,垂直生態連,加特性愛改哪裡改哪裡,根本不習慣和別人合作,要建立一個這樣的分支,非常困難。我覺得要等ARM Server發展到一定的程度吧,才有可能做到這種策略。

至於把OS(包括Drv)和UI部分分離,這也有相當的困難。Google引入Java就是為了在應用和UI之間跨平台,基本上沒有控制Framework和OS間的結構,不少ROM的Framework層其實有大量的二進位代碼,這些部分也會限制著這兩個介面的分離。

架構控制,不是簡單的分層,是在分層以後進行放水,保證介面間性能可以得到優化。所以我這麼強調所謂「基於語義進行編程」(參考這裡:多線程追加文件,不加鎖,會出現什麼情況 ? - in nek 的回答),分層只是你看到的表像。

2016-5-9補充:

前段時間和做ARA項目的幾個工程師吃飯,聽說他們現在採用了一種新的方案,外部(硬體)模塊不靠Linux的驅動來驅動。而是用一個標準的驅動,這個驅動提供一個基於消息的通訊介面到外部模塊中,Android通過HAL一樣的模式,對每種外部模塊使用標準的通訊協議來訪問。採用這樣的方案後,就不會有我前面提到的問題了。


17/5/13更新

哇咔咔咔咔咔以後不用適配kernel vendor了哈哈哈哈哈哈哈哈哈哈

題主所說的可以稱為MIUI framework(滑稽)

9/3更新

在看下面這些內容我要補充說明幾點基礎知識

1.在Android中你所看到的一切你看得見的交互都是由"xxx.apk"實現的,如:

狀態欄是framework-res.apk和systemUI.apk

設置是settings.apk和settingprovider.apk

這些都需要調用系統資源

而不同版本這些是不通用的(通過簽名機制防止簡單copy而不同lib一同修改)

一般user也並沒有許可權動這些應用(在system/app中)

2.題主割裂了三個部分聯繫性和統一性:三部分統稱底層

3.補充題主對於UI的認識

(1).題主所說的UI是輕量級UI一個或幾個APK是可以實現,只是做的人少

PS:主題引擎實際上也是對UI的調配,再配合單獨應用可以實現

(2).而MIUI其實屬於重度從源碼修改型,對於底層修改十分嚴重

那麼,問題來了,對於一個安卓UI,理論上是與硬體無關的。也就是說,一份安卓UI,應當可以運行在所有可以提供運行所需資源的設備上,而不關心硬體的具體驅動方法,只需調用系統api;

可是假如是這樣的話,為何所有安卓都需要進行機型適配呢?比如MIUI應該是與具體設備類型無關的,理論上直接複製到另一台資源充分的設備上,應該是可運行的。

這個問的好

先讓我們看看MIUI是怎麼適配的

1.尋找底包

2.git MIUI的path_rom(大概是這個名字,請指正?)

3.插樁暨反編譯

(1)修改framework_res

(2)反編譯system目錄下的app

(3)對於lib進行調整

整個過程其實涉及到對於底層逆向修改暨反編譯

對於系統調配資源進行了修改

可以認為是對於底層的修改

個別類型會涉及到對於內核的修改

實際上,在linux中原本就有桌面環境的概念,著名的有KDE,GNOME等。現在,假如我安裝了Ubuntu系統,而我不喜歡它的桌面,我可以把它卸載,然後安裝kde,這整個過程就像安裝軟體一樣簡單,直接在應用商店下載即可。

這個我需要指出

Linux的桌面環境是安裝一個應用

類似於Android里的.apk

Android里就叫做桌面

為什麼不可以在不改動系統底層和原有應用的條件下,直接卸載掉小米的MIUI,轉而安裝flyme呢?

這個可以

詳情請見小米桌面這款應用(非利益相關)

-----------------------------------------------------------分割線----------------------------------------------------------

1.就題主所說的UI

AOSP有主題引擎的代碼,

Google意見不支持深度修改

深度修改是指在邏輯層面對於UI進行大幅度修改

但是也有在做的如Flyme

導致Google沒辦法推廣主題引擎

在分支還沒有合併

2.不贊同 @Eagle 的部分看法("?ω?")

ARM也可以自行安裝驅動如嵌入式系統

3.為什麼不讓用戶自己得到驅動安裝

(1)風險太大!Linux Kernel採用了GPL,Linux驅動硬體是向內核添加一段代碼包含硬體設備信息而且代表公開硬體規格。

廠家一般都編譯好驅動程序,對內核注入修改

而直接修改內核對於Android來說實在不安全(Android畢竟商用)

(2)保護廠家利益,Android內核被剔除Linux分支就是應為這件事

Android晶元廠家對於驅動有絕對的控制權

來點幹貨

這些是重點!

這些是重點!這些是重點!

Android和Linux驅動的區別來了!

Android的驅動是被儲存在userspace當中

只是讓驅動在Linux Kernel上運行

而不是和Linux Kernel一起運行

這樣就規避了GPL

然後Google在Kernel上下功夫

讓Userspace通過走後門方法驅動硬體

這樣Kernel就是完全封閉

保護廠家利益!

Andeoid就使用了APL許可證!

就算忽略許可權問題

Linux Kernel裡面就算有相同CPU的驅動編譯成驅動安裝包還是Apk格式!

你都沒法驅動硬體!

因為你壓根就沒法繞過userspace!

你添加介面到內核裡面不可能!

誰會允許user能夠觸及到deivce→_→

你手機安全風險誰來負責?

還不是Google

他肯定不願意干這種吃力不討好的事情。

而是從大局考慮。

這是為什麼用戶一點兒都不能安裝驅動的原因!

一、說明一下怎麼跑出一個ROM

1.拉源碼

2.通過各種渠道獲取Kernel

3.通過各種渠道獲取vendor

4.make bacon

二、再來解析一下ROM包含了什麼

----∣----System

∣----boot.img

boot.img集成了Kernel

Rom展開的時候Kernel就會對應更新

三、題主所說的通用Android

就的得了解廠家做出OEM的流程

就我所知

正常的流程是這樣:

1.聯繫Google

2.Google分發OEM源碼和GMS套件

3.晶元廠家提供Kernel

4.Vendor可自行解決

5.UI根據源碼修改

6.只需要在服務器跑代碼就好了

1個小時內就可以搞定

四、Android和Windows不同

也算是Linux與windows不同

Linux添加驅動的方式為直接修改內核

Windows是用xxx.inf的配置文件(?)驅動,在內核外圍驅動,沒有直接修改。

Android在廠家面前是通用


谷歌收下安卓之前,安卓只是個創業公司。沒那麼大的能耐做出題主所說的事情

谷歌收來之後,基本的框架也都成熟了,再重新做太浪費精力

谷歌只為自己的機子做適配,剩下第三方的只放基礎包,第三方想怎麼改,都是第三方自己的事情

驅動當然是很重要的一個問題了

但是另外一個問題就在於,安卓已經分化為每個硬體廠家自己搞自己的了

谷歌如果想要對市面上所有的硬體進行適配,這項工作費力又不討好,說白了就是很不划算


歷來都是能耍流氓的系統份額最高啊,題主你這樣做是不行的。


CPU架構不同。

目前PC的主流架構是x86或者x86-64,操作系統可以根據設備信息判斷設備類型與型號,用預置的方案對驅動進行安裝;

而移動設備流行的ARM架構上辦不到,介面需要在編譯階段人工給出。


如果能在手機上實現題主的想法,那麼在pc上也就不是什麼大問題了。如此一來windows的廣泛的硬體兼容性還有什麼優勢可言?

細思恐極,微軟藥丸。

然而,技術上這樣是不可行的。eagle的答案已經有說明。


還有一個問題,手機硬體間的差異非常大,通用的兼容方案真的很難實現,即使真變成了那樣的架構,通用驅動也絕對是個問題


看見錯別字難受。是驍龍,不是梟龍


蘋果微軟笑了,Linux哭暈在廁所


谷歌沒做到,windows mobile做到了,系統 軟體 驅動分開,弄套合成環境(廚房)隨便換


題主你能想像每次裝系統都要下個三四G的系統,裝好後還要在手機上下個驅動精靈下驅動嗎,如果系統帶的驅動少你還要連接電腦拷貝網卡版驅動精靈。


MIUI確實是與具體設備類型無關的,像這些大多數的第三方ROM也都是的,正因為這樣,這些ROM才得以適配大量的機型,直接採用插樁的方法就能夠很方便的適配,安卓確實正在逐步向這個方向發展。


谷歌盡量的把安卓系統設計得簡單化,這是看的出來的,比如,不開放root用戶,弱化「文件管理」概念等...

安裝驅動必涉及到系統底層,將會帶來很多的安全問題,root許可權將會成擺設。

→_→而且在國內,可能又會出現在安卓系統中添加流氓驅動的現象。


他設計了啊。。

原生android

那些廠商又不願意用


跟題主溝通了一下,理解有如下:

教科書的解釋,參考《android安全攻防權威指南》第一章縱觀android生態圈。

題主是根據刷機來考慮到不方便,但是不清楚android的架構。

所以有下面幾點是矛盾的:

1.刷機一般是不需要刷掉kernel的,主要是刷system分區,也就是說,這跟硬體driver沒有多大關係,關鍵是root許可權,有許可權都好弄,還要知道各個分區的功能,因為有的oem廠會根據自己需求增加一些特別功能的分區

一個最噁心的例子,你在刷的時候還要看使用的文件系統,出現了你刷進去的文件系統,原來kernel不支持,那就悲劇了。

2.Linux是可以動態載入driver的,只要你有root許可權即可,google android是支持shell的,所以處理起來不是問題,所以題主提到的driver方面可以說跟windows一樣,關鍵是作為手機使用者,需要我們增加新的硬體和driver嗎?你手機買回來,會改變裡面硬體結構嗎?

3.題主想支持高通和聯發科,現在google在要求ic廠做upstream,這個在一個版本也是完全有可能的,關鍵是要支持就要編譯很大的軟體,對於寸土寸金的存儲的手機設備(看到36GB和64GB的價格是不一樣的),沒有必要,一般一個人使用一個手機的壽命也不超過三年,期間有多少去刷系統,不能為了小部分群體需求犧牲大部分人的利益吧,所以沒有這個需求。

4.對於一個設備,你改變它內在系統的風險是遠大於不改變它的風險,還有那麼多手機使用者是沒有能力去改變的,況且動不動裝個系統,也嫌麻煩啊。裝的好的還好,不好的就變磚頭了。還是那句話,給用戶的是方便使用,系統重要的是支持上面的軟體,關於界面,下個改變界面的軟體不就滿足了題主的個性選擇。

5.google的android就是為了設備的通用性開發的,所以它的架構很清晰。它的開源性,導致形形色色不同,因為某些oem廠商打營銷手段進行深度定製改變的,為了看起來更酷。在這一點我和死去的老喬觀點是一樣吧(用戶不知道要什麼,需要你告訴他),封閉的好處就是開發者只要在上開發用戶需要的軟體。所以你說的多樣化差異是開源導致的,也正為如此,智能設備要提早的普及起來。同樣需要android的出現,android好比鯰魚,有他世界才有勁。

以上是目前想到的


不同CPU的驅動都帶的話,一堆512MB ROM的手機已經廢了。


想好的體驗,只能軟硬體一起設計,並且出的款數非常少,比如蘋果,買蘋果就是了,


推薦閱讀:

Windows 中,桌面右鍵菜單中的刷新有什麼具體的作用?
為什麼棧的大小要有預設大小?
Linux下編程有什麼優勢?
設計一個全新的計算機操作系統需要哪些知識?
Minix 操作系統有什麼發展潛力嗎?

TAG:互聯網 | 手機 | 操作系統 | Android | 驅動程序 |