Android ABI

  • 什么是ABI?
  • 任何操作系统都有ABI
  • 安卓中的ABI背景
  • 官方介绍
  • Android中的ABI配置
  • 注意
  • 新增so库
  • armeabi-v7a 和 armeabi
  • hardware does not support
  • 扩展
  • 配置生成不同 ABI 版本
  • abiFilters 'armeabi-v7a' 无效
  • 参考和转载地址


什么是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进行编译:

ABI

Supported Instruction Sets 支持的指令集

Notes

armeabi

ARMV5TE 和更高版本、Thumb-1

无硬浮点

armeabi-v7a

armeabi 、 Thumb-2 、 VFPv3-D16

与 ARMv5、v6 设备不兼容

arm64-v8a

AArch64

x86

x86 (IA-32) 、 MMX 、 SSE/2/3 、 SSSE3

不支持 MOVBE 或 SSE4

x86_64

x86-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'
        }
    }

android AB android ab 系统_android AB

注意

新增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的版本


abiFilters ‘armeabi-v7a’ 无效

Android ndk abiFilters 无效 解决方案:

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