天天看點

x86架構的android手機相容性問題

x86架構的android手機相容性問題

自從CES2012上Intel釋出了針對移動市場的Medfield平台以來,市面上出現過一些基于X86的Android手機。

大部分Android應用都使用基于Dalvik Java代碼開發。理論上,由于Dalvik代碼在系統的虛拟機中執行,在x86的ATOM平台上不會有性能損失。但由于虛拟機執行效率的有限,對于一些高性能追求的應用,谷歌允許開發者使用原生的C語言代碼。而原生代碼是針對硬體平台編譯,x86,ARM或是MIPS都有其相應的二進制檔案。通常來說,針對ARM平台編譯的二進制代碼,x86的處理器是無法直接運作的。而主流的安卓産品均采用ARM處理器,盡管很早之前,Google的Android NDK就引入了x86編譯的選項,但至今還是有相當一部分應用隻針對ARM平台進行了編譯,這就造成了x86安卓平台相容性問題。

為了解決這一問題,Intel在推出Android手機系統的ATOM平台之初,就引入了“二進制轉換”(Binary Translation)這一功能,來解決x86無法直接運作ARM庫的問題。針對ARM編譯的二進制代碼會被ATOM處理器翻譯成x86執行的代碼,進而運作包含為ARM編譯的原生代碼的應用。

通過這一功能,x86 ATOM可以相容市面上的絕大部分應用。最新的采用Atom Z2580處理器的聯想K900已經宣傳自己能相容市場上的TOP 20000應用。

在解決了相容性問題後,加上x86 Atom單核戰雙核、雙核秒四核的彪悍性能(跑分),x86似乎已毫無黑點,橫掃市場指日可待。但遺憾的是,x86所宣傳的“相容”與“性能”,由于目前的生态環境的限制,并不能兼得。

盡管TOP 20000的應用已經可以被相容,但個人統計了豌豆莢市場中最熱門的250個應用,其中31%的應用沒有使用原生代碼。剩下的69%含有原生代碼的應用中,隻有8%包含了x86庫,剩下61%隻有ARM原生庫。也就是說,隻有這8%的應用,x86可以發揮自己的最佳性能,而絕大部分,都需要進行二進制轉換去進行相容。

通過統計當樂網中最熱遊戲TOP100,我們發現,隻有6%的遊戲不含原生庫,勝于94%的遊戲都含有原生代碼。在這其中,隻有5%的遊戲含有x86原生庫,剩餘的将近90%的遊戲,都需要Atom處理器通過二進制轉換運作為ARM編譯的代碼。

通過實驗對比,我們發現:當使用x86原生庫時,我們可以發現ATOM的單線程性能異常強悍,特别是記憶體性能。而一旦采用相容模式,二進制轉換運作ARM庫,性能就大大下降。可以看到二進制轉換相比原生執行x86代碼,損失的性能還是很可觀的,在性能訴求的應用中,損失可高達50%以上。在一些遊戲類應用中,也會帶來約400mW的CPU功耗的增加。

總的來說,x86的Android之路還很漫長,盡管通過Intel和廠商的努力解決了相容和性能問題,但相對惡劣的生态環境使得性能和相容不可兼得。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

事實證明,經過我的測試,x86 的應用相容性已經做的十分完善,英特爾此前宣布可達 95% 的相容性不假,大家大可放下心裡包袱。不過英特爾是如何做到的,這背後的原因很多人并不知道。恰好在 IDF 上,我遇到了一位英特爾軟體部門工程師,他向我通俗的講述了其中的原因。

其實問題主要出在指令集上,x86 使用的是 SSE 指令集,而 ARM 是用的 NEON 指令集,兩者差異導緻了應用不相容。不過好在 Android 的大部分應用運作在 Dalvik 虛拟機之上,并不依賴 CPU 架構,是以這些應用可以很好地跑在 x86 上。

支援 Dalvik 的程式占據大多數,但仍然會有一些應用繞過 Dalvik。比如需要更高的性能或者需要硬體的支援的時候,前者通常是大型遊戲,後者則是結合了感應器或者電源管理等硬體相關的應用。Angry Bird 兩者都不占,是以可以相容,賽車遊戲兩者都需要,是以大多不相容。

這些稍顯複雜的應用數量并不低,且使用者需求強烈。為了快速解決這些問題,英特爾試圖通過技術去完善,開發了一種轉換技術“Houdini”。 “Houdini”相當于一個中間層,可以讓原本不相容的應用跑在 x86 上。但這種強行結合的技術運作起來往往效率不高,容易出問題,且會增加 2% 左右的耗電。

從源頭解決問題顯然是更好的辦法,盡管速度會慢一下。自從英特爾和 Android 合作之後,英特爾就提供了 x86 的 NDK。開發者隻需在應用中支援這個 NDK,應用在送出時會自動生成 2 個 app,裝置在下載下傳時會根據自己的架構下載下傳合适的 app。這種方法并不難,效果也最好,難的是如何讓衆多開發商甘願合作。是以英特爾以及手機廠商會去和應用廠商挨個合作,督促其支援 x86 的 NDK。

現在已經有很多大型遊戲支援 x86 架構,包括極品飛車、無盡之劍等。使用者大可不必擔心,因相容性引起的影響已經十分微小了。

況且使用者日常使用最頻繁的恰恰是那些十分簡單、無需重新适配的應用。由于 Android 使用虛拟機,應用性能常遭人诟病,但是這樣做的好處是,應用可以輕松跨平台運作。如果沒有這個,那對英特爾來說将是災難性的,從這點來看,英特爾還是十分幸運的。