要點
- 不一樣的 CPU 架構須要不一樣的 so 文件
- NDK平臺不是後向兼容的,而是前向兼容的。
- ABI 的概念,每個 Cpu架構對應一個 ABI(Application Binary Interface,應用二進制接口)。
- ABI 定義了其所對應的 CPU 架構可以執行的二進制文件(如 .so 文件)的格式規範,決定了二進制文件如何與系統進行交互。
- 全部的 x86/x86_64/armeabi-v7a/arm64-v8a 設備都支持 armeabi 架構的 .so 文件
- so(shared object,共享庫)是機器能夠直接運行的二進制代碼,是 Android上的動態連接庫,相似於Windows上的dll。
爲何使用so
- so 機制讓開發者最大化利用已有的 C 和 C++ 代碼,達到重用的效果,利用軟件世界積累了幾十年的優秀代碼;
- so 是二進制,沒有解釋編譯的開消,用 so 實現的功能比純 java 實現的功能要快;
- so 內存分配不受 Dalivik/ART 的單個應用限制,減小 OOM;
- 相對於 java 代碼,二進制代碼的反編譯難度更大,一些核心代碼能夠考慮放在 so 文件中。
x86 手機對 arm 的支持
值得注意的是本來 x86 架構的 CPU 是不支持運行 arm 架構的 native 代碼的,但 Intel 和 Google 合做在x86機子的系統內核層之上加入了一個名爲 houdini 的Binary Translator(二進制轉換中間層),這個中間層會在運行期間動態的讀取 arm 指令並將之轉換爲 x86 指令去執行。html
Android 系統支持其中不一樣的 CPU 架構,ARMv5,ARMv7 (從2010年起),x86 (從2011年起),MIPS (從2012年起),ARMv8,MIPS64和x86_64 (從2014年起),每一種都關聯着一個相應的ABI。java
參考連接
本篇文章由一文多發平臺ArtiPub自動發佈android