ABI与Android ABI

974 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

看不懂的介绍

关于ABI来自百度百科的介绍:

ABI(应用程序二进制接口)

每个操作系统都会为运行在该系统下的应用程序提供应用程序二进制接口(Application Binary Interface,ABI)。ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。ABI总是包含一系列的系统调用和使用这些系统调用的方法,以及关于程序可以使用的内存地址和使用机器寄存器的规定。从一个应用程序的角度看,ABI既是系统架构的一部分也是硬件体系结构的重点,因此只要违反二者之一的条件约束就会导致程序出现严重错误。在很多情况下,链接器为了遵守ABI的约定需要做一些重要的工作。例如,ABI要求每个应用程序包含一个程序中各例程使用的静态数据的所有地址表,链接器通过收集所有链接到程序中的模块的地址信息来创建地址表。ABI经常影响链接器的是对标准过程调用的定义

百科介绍
至于Android ABI,见名知意就是安卓系统的应用程序二进制接口了。

那么ABI到底是个啥呢?有什么作用呢?看官方的解释,总觉得太过官方,作为一个非相关开发者基本大体上是看不明白的,但是一些其余的概念性的东西也不能稀里糊涂的,总得明白个大概,否则总感觉很难受。所以在参考了几篇前辈的带有经验性的总结博文后,总算能有一个说服自己的说法了。

先说ABI

说一句总结性的话语,那就是约定,或者规范。就像Java的API接口一样,定义了设计的规范,规范的定义往往能使得遵循规范之间的应用程序在在数据交互、实现技术升级切换等方面更加方便、低代价。当然,最主要的是保证程序能正常的运行!

我们的程序最终在cpu里面执行的时候都是一串的01,也就是二进制,但是也不是所有的01指令都能被cpu认识,cpu只认识它对应的cpu指令集下的指令。我们的应用程序又是怎样转化为cpu能够认识的指令集的,这中间肯定涉及到一些其余的我们不知道的东西以及规范。但是程序涉及到的硬件也不单是cpu,还有内存、磁盘、寄存器等等,这些东西又是由操作系统来进行管理分配的。所以关于cpu、ABI、操作系统三者的关系,引用一下一篇相关博文的总结:

例如,CPU指令集里有跳转,有判断,可以完成循环功能;有地址访问,可以完成对变量的读写,对常数的访问;然而,指令集通过什么方案去控制全局变量、局部变量?如何实现子函数之间的调用关系?如何进行调用之间传递参数?等等诸如此类,都需要有一个标准去规范。这个标准就是ABI,ABI是基于CPU硬件指令集,配合操作系统规范,实现用户程序语言转化为二进制代码,能够实际被CPU完美执行。在最初始情况下,ABI甚至规范了操作系统如何能在CPU之上运行的基础。

在比较高层次,ABI也包含二进制可执行文件如何被加载到内存,其内部模块标准等等内容。因此,ABI不但与CPU有关,也与操作系统和二进制可执行程序格式有关。于是,就有了x86_64 ELF ABI, x86 ABI,ARM ABI,PowerPC ELF ABI等等各种组合定义。

确切地说,ABI必须完整包含CPU指令集,OS,二进制文件格式三项内容,但很多时候都省略了其中一项甚至两项定义,而这些省略的项目则与其它参考架构相同或者类似,甚至在此平台是唯一的,没有平行选择,因此可以省略。

再看Android ABI

Android里面的JNI就是跨语言间调用,c++语言被编译成.so文件,作为一种二进制库文件,被我们的上层应用程序调用,这个调用的动作真正执行是在操作系统里面,由cpu协同其余涉及硬件完成。那么Android ABI规范就承担Android系统,应用程序,cpu三者之间无差错的协同工作,c++库想要作为一个库存在,就是被调用方,也在规范之内。所以,Android里面的libs目录下的诸如什么armabi、armabi-v7a等文件夹下的so文件,就是遵循了指定abi规范(目录名)编译后的操作系统能识别的库文件(Android基于Linux,所以就是so文件),编译手段就是NDK。

再转到cpu与abi上来,下图说明了Android的部分cpu与其兼容(支持)的abi规范。

cpu至少支持一种abi,也会针对某一abi规范进行优化,也可能支持其余的abi规范,但是性能可能会有损失,Android应用程序中提供了针对不同abi规范的so库文件时,cpu会有一个它自己的选择优先级,根据优先级,选择一个优先级最高的abi规范下编译的so文件进行安装。

最后总结一下

image.png

参考:
Android的ABI 与 Android设备的CPU架构 - 知乎 (zhihu.com)
Android的.so文件、ABI和CPU的关系_薛瑄的博客-CSDN博客_android cpu_abi
什么是ABI_Ensighine的博客-CSDN博客_abi定义