Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2008|回复: 0
打印 上一主题 下一主题

Android ABI 概念

[复制链接]

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
跳转到指定楼层
楼主
发表于 2018-3-9 10:22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

ABI全称是:Application binary interface,即:应用程序二进制接口,它定义了一套规则,允许编译好的二进制目标代码在所有兼容该ABI的操作系统和硬件平台中无需改动就能运行。

不同 Android 手机使用不同的 CPU,因此支持不同的指令集。CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)。 ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 您必须为应用要使用的每个 CPU 架构指定 ABI。

典型的 ABI 包含以下信息:

1.机器代码应使用的 CPU 指令集。
2.运行时内存存储和加载的字节顺序。
3.可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。
4.用于解析内容与系统之间数据的各种约定。这些约定包括对齐限制,以及系统如何使用堆栈和在调用函数时注册。
5.运行时可用于机器代码的函数符号列表 - 通常来自非常具体的库集。。

由上述定义可以判断,ABI定义了规则,而具体的实现则是由编译器、CPU、操作系统共同来完成的。不同的CPU芯片(如:ARM、Intel x86、MIPS)支持不同的ABI架构,常见的ABI类型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。

这就是为什么我们编译出来的可以运行于Windows的二进制程序不能运行于Mac OS/Linux/Android平台了,因为CPU芯片和操作系统均不相同,支持的ABI类型也不一样,因此无法识别对方的二进制程序。

而我们所说的“交叉编译”的核心原理也跟这些密切相关,交叉编译,就是使用交叉编译工具,在一个平台上编译生成另一个平台上的二进制可执行程序,为什么可以做到?因为交叉编译工具实现了另一个平台所定义的ABI规则。我们在Windows/Linux平台使用Android NDK交叉编译工具来编译出Android平台的库也是这个道理。

C++代码必须根据Android 设备的CPU类型(通常称为”ABIs”)进行编译,常用的五种 ABI:
1. armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年以后的生产的大部分Android设备都使用它。
2.arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
3.armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
4.x86: 平板、模拟器用得比较多。
5.x86_64: 64位的平板。
你可以根据不同平台打出不同的App,由此来缩减包体积。

参考资料 :
https://developer.android.com/ndk/guides/abis.html?hl=zh-cn


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 04:10 , Processed in 0.055395 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表