1. 程式人生 > >Android x86對native ARM的支援

Android x86對native ARM的支援

之前入手聯想 K800 這款使用 Intel x86 CPU 的手機時考慮過一個問題,就是 Android x86 對於已有的 Android 程式的相容問題問題,特別是對於一些使用了 native ARM 程式碼的程式(以遊戲居多),因為不可能原來所有的程式都可以及時更新來支援 x86 的 Android 手機(本來就很小眾)。在我的想法中,Intel x86 環境下應該不可能直接執行 native 的 ARM 二進位制程式碼(虛擬機器那種不考慮),不過考慮到平時玩使用 native ARM 程式碼的遊戲也不多,就沒有在意。

我們先來看一個典型的使用了 native ARM library 的 Android 程式:《Bejeweled 2》,也就是大家在電腦上很熟悉的《寶石迷陣2》遊戲的 Android 版本,檢視 apk 安裝檔案裡的內容,可以明顯發現其使用了 ARM EABI 的動態庫:

使用 native ARM 程式碼的 Android 程式

但我在 K800 上安裝此遊戲,完全可以正常執行並使用,只是似乎沒有在 ARM Android 手機上執行的那麼順暢。

這就比較疑惑了,接下來那就進一步驗證一下,將之前靜態編譯的一個 ARM 可執行程式拷到手機,在終端中執行,竟然也可以正常執行,我們看看這個 ARM 可執行程式的格式:

ARM 可執行程式的格式
1 2 [root@fedora ~]# file /mnt/iptables /mnt/iptables: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, statically linked,
for GNU/Linux 2.6.14, stripped

經過一番搜尋之後,發現原來 Android x86 4.0 版本之後已經開始支援對 native ARM 的模擬,這對於之前用處似乎一直不是很大的 Android x86 來說絕對可以算是相當大的進步。

聯想 K800 使用的 CPU 是 Intel Atom Z2460,基於 Intel Medfield 平臺,儘管 Z2460 是一款使用 x86 指令集的 CPU,但可以相容執行大部分帶有 native ARM 程式碼的應用,關鍵就是靠 Intel 並未公開發表的技術 ARM binary code translator,而且 binary translator 對於應用程式來說是透明的,一般不需要做任何特殊的改動。

在 Android x86 上 Google 修改了 dalvik 虛擬機器的載入 native code 的函式(修改 libdvm,增加 libdvm_houdini.so),通過 Intel ARM to Atom binary translator 實現 JNI 呼叫。Android x86 中引入了 libhoudini.so 來做這件事情,通過檢視 K800 的根檔案系統,我們可以看到除了 /system/lib 下的標準的 x86 的動態庫檔案之外,新增了 /system/lib/libhoudini.so 庫,另外 /system/lib/arm 目錄下還有很多 ARM 版本的庫檔案。

下面是我在 K800 上執行一個 native ARM 程式時的程序輸出:

ps
1 2 root      9754  1     79064  3888  c136b03f 40060345 S /system/bin/houdini root      10365 8204  1468   496   00000000 b76dca06 R ps

上面看到的 /system/bin/houdini 程序即為在 Android x86 上執行的 native ARM 程式的表現形式。

從現在在 K800 手機上實際的測試情況來看,在 K800 上執行使用 native ARM 的 Android 似乎都還比較順暢,像憤怒的小鳥就可以很順暢的執行,這和現在 K800 用的 Android 4.0.4 ROM 也有關係,相對於不支援 native ARM 的 Android 2.3.7,遊戲的相容性是有相當大的改善的。另外很有可能 Intel Medfield 平臺硬體上就有對 ARM binary translator 的加速功能。

當然這種二進位制的轉換必然會有效能上的損失,無法和 x86 原生程式相比,因此越來越多的 Android 程式也開始集成了 x86 版本的程式和庫檔案,來看看最新版本的水果忍者 apk 安裝程式中的庫檔案列表,就可以看到 x86 版本:

原生支援 x86 庫的 Android 程式

有關 Android x86 執行 native ARM 程式的介紹:

Android x86 下執行環境的搭建: