Android ABI

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 ABI_第1张图片

注意

新增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

你可能感兴趣的:(Android,Android,abi)