在Android X86上執行Native ARM 代碼---Android X86應用兼容的探討


        前些天有網友在QQ群里和我說過一個叫 BlueStacks 的程序,可以安裝在Windows上運行帶arm代碼的(使用NDK開發的)程序, 而且並非是ANDROID SDK 里的使用 QEMU 完整模擬整個系統硬件環境。 好奇之下,我下載並安裝了它,分析了一下大體的原理,但沒找到關鍵貓膩。。失望中。。

        昨天因為查一份資料,google又抽風,不得不拿起GoAgent翻越偉大的Wall,發現了一個討論,

        https://groups.google.com/group/android-x86/browse_thread/thread/ff71e83494e2fd8d/d7d3dfdb9c581fc8 (翻牆訪問)

        根據這個討論,我又搜索了一些資料,知道Intel 發布了它自打把XSCALE系列打包出售給馬維爾后的第一款手機CPU Atom Z2460,國內跟風的有聯想K800手機,印度跟風的有一個XOLO 手機,還有一個不記得名稱了,關鍵不在於跟不跟風,在於他們發布的手機是基於X86指令集的ATOM CPU, 但可以兼容運行大部分帶有Native ARM代碼的應用,關鍵之處就是靠了一個Intel並未公開發表的技術 ARM binary code translator, 在這個頁面大概描述了其用到的東西:


        http://www.buildroid.org/blog/?p=198
        一個代碼補丁

        一個libhoudini.so

        一個libdvm_houdini.so(intel修改版的libdvm) (dalvik虛擬機的動態庫)

        一堆android的arm版本的lib文件houdini_armlibs.tgz

        根據補丁,可以知道其主要修改了dalvik虛擬機的dvmLoadNativeCode函數,當其調用的dlopen函數失敗時,調用自己的my_dlopen重試, 加載arm的lib文件,用IDA6.1對libhoudini.so進行分析,可以發現其大概是虛擬了一個ARM的CPU,注意,只是虛擬CPU,並不像ANDROID SDK一樣 模擬整個系統,這個讓我想到了QEMU 的Linux User Mode,由此,我翻出以前對BlueStacks的分析, 發現了他的lib文件大多都有一個對應的lib***.so-arm文件,繼續分析發現在/bin 目錄里的一個程序,arm-runtime,是個elf程序,拿起ida一看, 恍然大悟,arm-runtime就是qemu的user mode 進程改了個名,(當然代碼肯定有改動),原來BlueStacks是把qemu的 user mode 移植到了windows上, 怪不得都說它的模擬怎么怎么快,根源在這兒。

        有興趣的可以百度一下下載K800的ROM文件解包進行分析,也可以分析下BlueStacks的ROM,現在仍讓我困惑的就是K800的加載方式大概知道了,但經過對BlueStacks ROM文件的逆向分析,到目前為止還沒有找到其只是如何執行arm-runtime這個程序來執行arm native代碼的,難道是binfmt_misc方式?

        此文僅限拋磚引玉,不知道能不能引來,具體技術細節我也不是很了解,希望技術大牛們解我等小菜之迷惑。

        補充一個連接:http://www.buildroid.org/blog/?p=175
        其實我發此文是想到Windows 8 RT 是ARM的,微軟說和現行的程序CPU體系不一樣,不能兼容,那么我們可不可以把QEMU的Linux User Mode移植到未來的
Windows8RT 或 Windows8上,一次來讓Windows8RT和Windows8的應用互相兼容呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM