Android ABI

什么是ABI?

任何操作系统都有ABI

每个操作系统都会为运行在该系统下的应用程序提供应用程序二进制接口(Application Binary Interface,ABI)。ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。ABI总是包含一系列的系统调用和使用这些系统调用的方法,以及关于程序可以使用的内存地址和使用机器寄存器的规定。从一个应用程序的角度看,ABI既是系统架构的一部分也是硬件体系结构的重点,因此只要违反二者之一的条件约束就会导致程序出现严重错误。 简介:ABI(Application Binary Interface):应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。

安卓中的ABI背景

Android 系统本质是一个经过改造的 Linux 系统,so库是Linux系统上使用的共享库(类似windows上的dll)。最早,Android 系统只支持 ARMv5 的 CPU 构架,随着 Android 系统的发展,又加入了 ARMv7 (2010), x86 (2011), MIPS (2012), ARMv8, MIPS64 和 x86_64 (2014)。每一种 CPU 构架,都定义了一种 ABI(Application Binary Interface),ABI 决定了二进制文件如何与系统进行交互。

官方介绍

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

Android中的ABI配置

当您使用本机代码时,硬件很重要。NDK提供了多种可供选择的abi,让您能够确保针对正确的架构和cpu进行编译:
ABISupported Instruction Sets 支持的指令集Notes
armeabiARMV5TE 和更高版本、Thumb-1无硬浮点
armeabi-v7aarmeabi 、 Thumb-2 、 VFPv3-D16与 ARMv5、v6 设备不兼容
arm64-v8aAArch64
x86x86 (IA-32) 、 MMX 、 SSE/2/3 、 SSSE3不支持 MOVBE 或 SSE4
x86_64x86-64 、MMX 、SSE/2/3 、SSSE3 、SSE4.1, 4.2 、POPCNT

= =

设置ABI:

defaultConfig {
        ndk {
            abiFilters 'armeabi','armeabi-v7a','arm64-v8a', "x86"
        }
    }
其实ABI可以不设置,这样编译时,就会将项目里所有依赖资源包里的so库都打到最终的apk里。 但是,ABI支持多的话,apk也会大,所以一般只支持一种即可。 目前Android 版本(20210601),ABI一般配置armeabi-v7a
android {

    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }

在这里插入图片描述

注意

新增so库

新增so库的话,需要在每个在用的文件夹内(armeabi、armeabi-v7a、arm64-v8a ==)放置,否则so库找不到。多个目录,目录下的so库文件数需要相同。

armeabi-v7a 和 armeabi

如果设置支持armeabi-v7a 和 armeabi:如若第三方提供的so只有armeabi,那么armeabi-v7a 内也需要拷贝一份,原因是armeabi-v7a 和 armeabi必须so数一致,且armeabi-v7a支持armeabi

hardware does not support

ABI设置错误,可能出现硬件不支持的问题,提示:hardware does not support

扩展

配置生成不同 ABI 版本

可以通过多渠道打包,生成不同ABI的版本

https://blog.csdn.net/hknock/article/details/76034125

abiFilters ‘armeabi-v7a’ 无效

Android ndk abiFilters 无效 解决方案:https://blog.csdn.net/u011106915/article/details/106543464

   ndk {
       setAbiFilters(['armeabi-v7a'])
   }

参考和转载地址

ABI (应用程序二进制接口):https://baike.baidu.com/item/ABI/10912305?fr=aladdin

Android ABIs:https://developer.android.google.cn/ndk/guides/abis?hl=en

Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解:https://blog.csdn.net/afei__/article/details/81272251

安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a):https://blog.csdn.net/yinxing2008/article/details/84317745

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风徐来辽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值