閱讀591 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android的兼容性問題剖析

image

1.PC是X86構架,主要生產廠是Inter和AMD,android智能手機基本上都是ARM構架,主要生產廠家有高通、三星、NVIDIA等,也不是很多,所以架構方麵應該不是導致碎片化的主要原因才是啊?或許我理解的問題?

架構方麵是一個重要原因。

x86架構從當年8086開始,到如今的x64的64位平台,能做到匯編指令完全兼容。

再看看ARM架構有多混亂:

ARM處理器內核列表

x86架構的字節序是固定的,而ARM架構的字節序都是可變的,字節序就是大小端的意思,比如一個32位的數據:0x12345678,在x86架構下,內存裏永遠都是0x78 0x56 0x34 0x12,而在ARM架構裏,可能是前者,也可能是0x12 0x34 0x56 0x78.

字節序本身沒有什麼優劣之分,但對於開發人員來說,可變的字節序意味著移植機器代碼是有困難的。

2.各廠商的ROM應該隻是做一些二次開發,不會動核心部分吧?而APP的開發不是隻需要跟核心匹配就行了麼?就像WIN 2000和XP一樣,同樣的NT核心,程序基本可以兼容。

安卓係統基於的內核是Linux,Linux不是微內核架構,而是宏內核,內核裏包含的東西很多。而Windows是一個近似微內核的架構,微內核的好處就是驅動什麼的可以很容易改變以適用的變化(準確的說Windows確實不是完全微內核,但比Linux而言內核確實很小)。

宏內核的缺點就是如果硬件改變的太大,很多時候內核要跟著變動。而且由於ARM平台本身硬件上差異也很大,導致廠商修改驅動的做法很頻繁。如果Linux是一個微內核結構,那麼可能兼容性就不是現在這樣子,但可惜Linux不是。

當然,如果存儲空間足夠大,那麼宏內核也沒什麼問題,PC端的Linux兼容性不都是很好嗎?是的,但移動平台的存儲空間不是足夠大的,所以,沒有見到哪家廠商把各種驅動都裝到手機上。所以各個廠商之間的安卓係統無法直接兼容。

另外,眾所周知android是一個開源係統,而windows則是一個閉源係統。開放係統的源代碼可以讓眾多手機廠商參與係統的定製。但定製ROM會不同程度地修改原生ROM的API,這種現象便是碎片化。碎片化勢必會讓google play中的app在這些定製ROM裏出現兼容性的問題。而windows是閉源係統,內部的API其他廠商無權修改的,所以不存在這個問題。

3.關於中間層,我的想法是:

①由Google主導開發以消滅碎片化。
②類似.NET Framework和JAVA這種,JIT編譯。就是不知道性能開銷如何。
③Google應該會不斷的升級係統,而Android的開放性決定了終端的多樣性,所以中間層還是有價 值的。

第一條,Google在做了。
第二條,也是安卓現在的做法。要是沒有JIT,安卓的也就基本沒有多少活路了。Java的效率會越來越高,這最終會消除兼容性的問題,但消除不掉的是從硬件到驅動這一層的差異。

最後我想補充一條:各個廠商不開放硬件規範也是一個大問題,比如魅族想把係統移植到小米手機上,前提是魅族知道小米的BSP(board support package)代碼,不然再厲害也沒有用。而PC平台上大多數廠商都是開放自己的硬件規範的,主板廠商用的芯片組基本上就是那幾個,並且都跟微軟達成了聯合開發的協議。這一點是人為製造的兼容性障礙。

總結一下:

Windows的兼容性成功有幾個原因:硬件指令完全兼容、存儲設備足夠大以存放各種兼容代碼、微內核結構方便擴展;Linux在PC平台的兼容性成功是基本跟Windows相同的,隻是沒有微內核結構。

但到裏移動平台,因為硬件指令不能完全兼容,硬件種類又很多,所以如果要兼容各種設備就需要大量的全套的驅動,而移動平台存儲設備又太小,你希望你隻有8G內置存儲的手機裏有7.8G都放著各種驅動嗎?並且內置存儲小的手機又根本放不下,所以要想活路,隻好暫時放棄兼容性,把兼容性的問題留給JIT去做。

當然,這種趨勢最終會被打破,移動設備的內置存儲總有一天會很大,硬件廠商總有一天會統一,那麼到時候,就看設備廠商是否願意開放所有的驅動代碼了。

反駁幾個觀點:

有人說Windows也有兼容性的問題,但請問:兼容性再有問題也不會出現Windows從dell電腦上拿到聯想電腦上就不能運行吧?安卓你試試把小米係統移植到魅族手機上?

早期的硬件配置確實麻煩,跳線不對機器都起不來,但用戶在正確指導下是可以配起來的,但現在呢?各個廠商封閉自己的BSP代碼和硬件規範,用戶能把小米係統移植到魅族手機上嗎?

還有人拿分辨率說事,DOS時代到WIN7,分辨率變化了多少了?分辨率隻是影響顯示的樣子,說白了就是好看跟不好看而已,現在安卓係統麵對的可不僅僅是好看不好看的問題。

有人說PC的接口規範是為Windows準備的,那您可真讓Linux汗顏了。Windows驅動五花八門難道都是自己變出來的?都是人寫的。移動平台的問題是每個廠商都想隻做自己的驅動,別人的驅動我才不管呢,當然想管也管不了,後果就是一個硬件平台定製出來的東西完全不兼容另一種平台。

還有人說ARM沒有兼容性問題,確實,現在主流手機都是ARM7指令集,ARM7是沒有兼容性問題,但別忘了ARM指令集還有ARM4呢,這個跟ARM7差異很大的。另外大小端的事情怎麼解決?雖然ARM默認是小端的。

Windows係統有問題,硬件有變化,可以升級驅動,為什麼可以升級驅動,因為微內核容易升級驅動,驅動變動對微內核影響很小,並且驅動再大也不會出現硬盤裏放不下的程度。Linux的宏內核導致稍微大點的改動就要重編內核,請問有多少人會重編Linux內核的?再看有多少人會給Windows裝驅動的?

評論裏有人說到Linux在PC上也有碎片化的問題,這個確實存在的,但現在Linux在不同PC硬件之間遷移基本上沒難度,手機係統呢?
MQC測試平台是為廣大企業客戶和移動開發者提供真機測試服務的雲平台,擁有大量熱門機型,提供7x24全天候服務。

我們致力於提供專業、穩定、全麵、高價值的自動化測試能力,以及簡單易用的使用流程、貼心的技術服務,並且幫助客戶以最低的成本、最高的效率發現APP中的各類隱患(APP崩潰、各類兼容性問題、功能性問題、性能問題等),減少用戶流失,提高APP質量和市場競爭力。

聯係我們:
 網站地址:https://mqc.aliyun.com/
 開發者交流旺旺群:335334143
 客服郵箱:mqc_group@service.alibaba.com
更多精彩技術分享 歡迎關注 MQC公眾號
17

最後更新:2017-08-13 22:47:32

  上一篇:go  讓數據庫變快的10個建議
  下一篇:go  使用Electron開發基於Node.js的桌麵應用