[时间: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