Android——NDK基础概念——ABI管理介绍

ABI管理:

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

典型的ABI包含以下信息:

Ø 机器代码应使用的CPU指令集。

Ø 运行时内存存储和加载的字节顺序。

Ø 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。

Ø 用于解析内容与系统之间数据的各种约定。这些约定包括对齐限制,以及系统如何使用堆栈和在调用函数时注册。

Ø 运行时可用于机器代码的函数符号列表-通常来自非常具体的库集。

本页枚举了NDK支持的ABI,并且提供每个ABI如何运行的信息。

支持的ABI:

每个ABI支持一个或多个指令集。表1提供每个ABI支持的指令集概览。

ABI

支持的指令集

说明

armeabi

ARMV5TE 和更高版本;Thumb-1

无硬浮点;

armeabi-v7a

armeabi;Thumb-2;VFPv3-D16;

与ARMv5、v6设备不兼容;

arm64-v8a

AArch-64

x86

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

不支持MOVBE或SSE4;

x86_64

x86-64;MMX;SSE/2/3;SSSE3;POPCNT;

mips

MIPS32r1 及更高版本;

使用硬浮点,并且假设 CPU:FPU时钟比率为2:1以获取最大兼容性。不提供 micromips或MIPS16;

mips64

MIPS64r6;

为特定ABI生成代码:

默认情况下,NDK为armeabi ABI生成机器代码。但您可以通过向 Application.mk文件添加以下行生成ARMv7-a兼容的机器代码。

APP_ABI := armeabi-v7a

要为两个或更多不同的ABI构建机器代码,请使用空格作为分隔符。例如:

APP_ABI := armeabi armeabi-v7a

此设置指示NDK为机器代码构建两个版本,此行中所列的每个ABI一个。 如需了解有关可以为APP_ABI变量指定的值的详细信息,请参阅Application.mk:https://developer.android.com/ndk/guides/application_mk.html。

构建多个机器代码版本时,构建系统会将库复制到应用项目路径,并最终将它们封装到APK中,从而创建一个胖二进制文件。胖二进制文件大于只包含一个系统的机器代码的二进制文件;权衡方式是兼容性更广,但APK更大。

在安装时,软件包管理器只解包最适合目标设备的机器代码。如需了解详细信息,请参阅安装时自动解压缩原生代码。

Android平台上的ABI管理:

本节详细说明Android平台如何管理APK中的原生代码。

应用包中的原生代码:Play商店和软件包管理器专家预期在APK中符合以下模式的文件路径上查找NDK生成的库:

/lib/<abi>/lib<name>.so

这里的<abi>是支持的ABI下面列出的ABI名称之一,<name>是您为 Android.mk文件中的LOCAL_MODULE变量定义库时使用的库名称。由于APK文件只是zip文件,因此打开它们并确认它们属于哪些共享原生库很简单。

如果系统在预期位置找不到原生共享库,便无法使用它们。在这种情况下,应用本身必须复制这些库,然后执行dlopen()。

在胖二进制文件中,每个库位于其名称与相应ABI匹配的目录下。例如,胖二进制文件可能包含:

/lib/armeabi/libfoo.so

/lib/armeabi-v7a/libfoo.so

/lib/arm64-v8a/libfoo.so

/lib/x86/libfoo.so

/lib/x86_64/libfoo.so

/lib/mips/libfoo.so

/lib/mips64/libfoo.so

注:运行4.0.3或更早版本、基于ARMv7的Android设备从armeabi目录(而非armeabi-v7a目录,如果两个目录都存在)安装原生库。这是因为在APK中,/lib/armeabi/在/lib/armeabi-v7a/后面。从4.0.4开始,此问题已修复。

Android平台ABI支持:

Android系统在运行时知道它支持哪些ABI,因为版本特定的系统属性会指示:

Ø 设备的主要ABI,与系统映像本身使用的机器代码对应。

Ø 可选的辅助ABI,与系统映像也支持的另一个ABI对应。

此机制确保系统在安装时从软件包提取最佳机器代码。

为实现最佳性能,应直接针对主要ABI进行编译。例如,基于ARMv5TE的典型设备只会定义主要ABI:armeabi。相反,基于ARMv7的典型设备将主要 ABI定义为armeabi-v7a,而将辅助ABI定义为armeabi,因为它可以运行为每个 ABI生成的应用原生二进制文件。

许多基于x86的设备也可运行armeabi-v7a和armeabi NDK二进制文件。对于这些设备,主要ABI将是x86,辅助ABI是armeabi-v7a。

基于MIPS的典型设备只定义主要ABI:mips。

安装时自动解压缩原生代码:

安装应用时,软件包管理器服务将扫描APK,查找以下形式的任何共享库:

lib/<primary-abi>/lib<name>.so

如果未找到,并且您已定义辅助ABI,该服务将扫描以下形式的共享库:

lib/<secondary-abi>/lib<name>.so

找到所需的库时,软件包管理器会将它们复制到应用的data目录 (data/data/<package_name>/lib/)下的/lib/lib<name>.so。

如果根本没有共享对象文件,应用也会构建并安装,但在运行时会崩溃。

转载于:https://my.oschina.net/cht2000/blog/899025

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值