1. 程式人生 > >為x86進行android NDK程式開發要注意的問題

為x86進行android NDK程式開發要注意的問題

隨著支援Intel Atom處理器的android手機在CES上的面世,android程式開發也將有一些新的變化,開發人員需要考慮相應的移植問題,對於普通的java程式,開發人員不需要關心處理器的細節,所以,主要是那些使用NDK進行native開發的程式的移植。
隨著Intel處理器的加入,相信越來越多基於x86的c/c++庫將能更容易的被移植到android平臺。

對於為x86進行android NDK程式開發,我能想到的問題主要有:
1. 如何讓android NDK程式支援x86?
這點在NDK的手冊中有說明,只需要在Application.mk中編輯APP_ABI 行加入 x86即可,如:
APP_ABI := armeabi armeabi-v7a x86
這樣就能生成支援android x86的.so檔案了。
說明:上面三種abi可以任意指定,也可以同時指定多個,預設為armeabi。

2. 如何測試支援x86的android程式?(以windows平臺的SDK為例)
要測試支援Intel處理器的android x86程式,就目前而言,只能使用模擬器了。在SDK Tools的Reverion 12版本更新的General Notes中可以看到:
The AVD manager and emulator can now use system images compiled for ARM v7 and x86 CPUs.
從這裡看到新版本的SDK工具應該是支援armv7和x86的模擬器的,然而開啟SDK Manager更新列表,發現最新的android提供了ARM EABI v7a System Image,這樣就能下載支援arm v7a指令的模擬器進行模擬了。根據http://software.intel.com/en-us/articles/installing-the-intel-atom-tm-android-x86-emulator-image-add-on-from-the-android-sdk-manager/的介紹,SDK Manager已經有x86的images下載,但是我的SDK裡面居然沒有找到這一項!相信在以後的更新中這個問題會得到修正吧。
儘管這裡沒有提供下載,但是AOSP中的android原始碼提供了編譯android x86的選擇項,也就是我們可以自己編譯android x86的系統檔案。
關於如何編譯android原始碼,可以參考:http://source.android.com/source/building.html(說明:其內容沒有完全更新,編譯x86和arm的區別在於其中“choose a target”的時候選擇full_eng_x86即可。)
在編譯原始碼後,我們可以得到下列檔案:ramdisk.img,system.img,userdata.img(在out/target/product/generic_x86中),將上面的三個檔案和原始碼prebuilt/android-x86/kernel中的kernel-qemu檔案儲存起來,如儲存在一個新建的x86資料夾中。
下面就是如何在SDK中新增自己編譯的x86模擬器,將上面的x86資料夾複製到:platforms\android-**\images中,同時將原有的檔案移動到一個新的arm資料夾,這樣,在使用AVD Manager.exe建立模擬器的時候,就會出現target的選擇。

說明:對於android-14和android-15,其中沒有images資料夾,因為SDK將其移動到SDK根目錄的system-images資料夾中了,可以自己新建此資料夾並在其中放置相關模擬器需要的檔案即可。
說明:http://software.intel.com/en-us/articles/android-237-gingerbread-x86-emulator-image-add-on/提供了其它一些方法來使用android x86模擬器,可以作為參考。
總之,有多種方法可以對x86的android NDK程式進行模擬器的測試。

3. x86和arm利用NDK移植c/c++程式要考慮的問題
由於指令集等的不同,在用NDK移植某些程式的時候,可能需要考慮程式移植結果的正確性,就arm和x86對比而言,主要需要考慮的是:記憶體中位元組對齊的差異、浮點數操作的差異、向量化指令的差異(NEON和SSE等)等。當然,並不是所有的程式都會在這些方面影響程式的結果。

在Intel官網上,有一些和android x86開發相關的文章:http://software.intel.com/en-us/android/,可以作為參考。