[時間:2019-02] [狀態:Open]
[關鍵詞:android,cpu, armeabi, armeabi-v7a, arm64-v8a, 32位,64位,c/c++]
本文主要總結下前段時間針對android系統上做了32位和64位的區分,順便梳理下android支持的各種CPU類型。
ABI是什么?
ABI是Application Binary Interface(應用程序二進制接口)的首字母縮寫。
不同的安卓設備使用不同的CPU,每個CPU支持的指令集也不一樣。這樣每種CPU和指令集的組合就需要自身的ABI。
ABI精確定義了應用程序的機器碼與系統在運行時交互的方式。你編譯的APP需要支持哪些CPU指令集都需要在編譯是給出。
通常ABI包含以下信息:
- 可用的CPU指令集
- 內存存儲和加載的大小端
- 可執行二進制文件的格式,例如可執行程序、共享庫等
- 在代碼和系統之間傳遞數據的約定慣例,包括數據對齊限制、函數調用時堆棧寄存器使用情況等
- 機器碼可訪問的函數符號列表
Android支持的ABI類型
- armeabi
- armeabi-v7a
- arm64-v8a
- x86
- x86_64
目前主流的手機一般都支持armeabi-v7a(32位)和arm64-v8a(64位)。
Android設備在安裝app時會根據ABI類型和系統實際版本進行匹配,選擇最優的類型安裝。
如果你的APP同時提供了armeabi-v7a和arm64-v8a的so庫,在64位Android系統上,安裝時會自動安裝arm64-v8a的庫,而在32位系統上,只能選擇armeabi-v7a的庫。
Android區分CPU是64位還是32位的預定義宏
__arm__
32位ARM__aarch64__
64位ARM__i386__
32位X86__x86_64__
64位X86
x86上的32位和64位預定義宏不太一樣,注意區分下。
小結
本文主要整理了Android支持的ABI類型以及如何參考預定義宏區分CPU是32位還是64位。僅供后續使用。
更多信息建議參考Android關於arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問題一文。
參考鏈接:
- Android-doc Dealing with CPU features