×

深圳网站建设—APP开发—网站制作—小程序开发_博纳网络公司

0755 -
82538016
82560826
网站制作资讯

Android系统APP开发ABI 的管理

文章编辑:网站建设 文章来源:APP开发 浏览量:

1、ABI简介
Android系统支持不同的Android设备使用不同的CPU,CPU与指令集的每种组合都有其自己的应用二进制界面(或ABI)。ABI可以非常精确地定义应用的机器代码在运行时如何与系统交互。开发者必须为应用要使用的每个CPU架构指定ABI。
典型的ABI包含以下信息。
·机器代码应使用的CPU指令集。
·运行时内存存储和加载的字节顺序。
·可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。
·用于解析内容与系统之间数据的各种约定。这些约定
包括对齐限制,以及系统如何使用堆栈和在调用方法时注册。
·运行时可用于机器代码的方法符号列表一—通常来自非常具体的库集。
2、支持的ABI
每个ABI支持一个或多个指令集。
(1)armeabi
此ABI适用于基于ARM、至少支持ARMv5TE指令集的CPU,不支持硬件辅助的浮点计算。
此ABI支持ARM的Thumb(亦称Thumb-1)指令集。NDK默认生成Thumb代码,除非在Android.mk文件中使用LOCAL_ARM_MODE变量指定不同的行为。
(2)armeabi-v7a
此ABI可扩展armeabi以包含多个CPU指令集扩展,包括Thumb-2指令集扩展,其性能堪比32位ARM指令,简洁性类似于Thumb-1;VFP硬件FPU指令,更具体一点,包括VFPv3-D16,它除了ARM核心中的16个32位寄存器之外,还包含16个专用64位浮点寄存器;v7-aARM规格描述的其他扩展,包括高级SIMD(亦称NEON)、VFPv3-D32和ThumbEE,都是此ABI可选的。
(3)arm64-v8a
此ABI适用于基于ARMv8、支持AArch64的CPU。它还包含NEON和VFPv4指令集。
(4)x86
此ABI适用于支持通常称为“x86”或“IA-32”的指令集的CPU。
(5)x8664
此ABI适用于支持通常称为“x86-64”的指令集的CPU。
(6)mips
此ABI适用于基于MIPS、至少支持MIPS32r1指令集的CPU。
(7)mips64
此ABI适用于MIPS64R6。
3、为特定ABI生成代码
默认情况下,NDK为armeabiABI生成机器代码。但可以通过向Application.mk文件添加以下行生成ARMv7-a兼容的机器代码。
APP ABI:=armeabi-v7a
要为两个或更多不同的ABI构建机器代码,需要使用空格作为分隔符。示例代码如下:
APP ABI:=armeabi armeabi-v7a
此设置指示NDK为机器代码构建两个版本:此行中所列的armeabi和armeabi-v7a。
构建多个机器代码版本时,构建系统会将库复制到应用项目路径,并最终将它们封装到APK中,从而创建一个胖二进制文件。胖二进制文件大于只包含一个系统的机器代码的二进制文件,兼容性更广,但APK占的存储空间更大。
在安装时,软件包管理器只解析APK中包含的最适合目标设备的机器代码。
4、Android系统的ABI管理
Android系统的软件包管理器预期在APK中符合以下模式的文件路径上查找NDK生成的库。
|/1ib/<abi>/lib<name>.so
这里的<abi>支持的是ABI下面列出的ABI名称之一,<name〉是为Android.mk文件中的LOCAL_MODULE变量定义库时使用的库名称。由于APK文件只是zip文件,因此打开它们并确认它们属于哪些原生共享库是很简单的。
如果系统在预期位置找不到原生共享库,便无法使用它们。在这种情况下,应用本身必须复制这些库,然后执行dlopen()。
在胖二进制文件中,每个库位于其名称与相应ABI匹配的目录下。例如,胖二进制文件可能包含以下文件。
|/1ib/armeabi/libfoo.so
|/lib/armeabi-v7a/libfoo.so
|/1ib/arm64-v8a/libfoo.so
|/1ib/×86/libfoo.so
|/1ib/x8664/libfoo.so
|/lib/mips/libfoo.so
/1ib/mips64/libfoo.so

5、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。
6、安装时自动解压缩原生代码
安装应用时,软件包管理器服务将扫描APK,查找以下形式的任何共享库。
|1ib/<primary-abi>/lib<name>.so
如果未找到,并且已定义辅助ABI,该服务将扫描以下形式的共享库。
|1ib/<secondary-abi>/lib<name>.so
找到所需的库时,软件包管理器会将它们复制到应用的data目录(data/data/<package_name>/1ib/)下的/1ib/1ib<name〉.so。
如果没有找到所需的库,会报如下错误。
|Failure [INSTALL FAILED NO MATCHING ABIS:Failed to extra
Ict native libraries,res=-113]
 

当前文章链接:/construction/appkaifa/2179.html
如果您觉得案例还不错请帮忙分享:

[声明]本网转载网络媒体稿件是为了传播更多的信息,此类稿件不代表本网观点,本网不承担此类稿件侵权行为的连带责任。故此,如果您发现本网站的内容侵犯了您的版权,请您的相关内容发至此邮箱【qin@198bona.com 】,我们在确认后,会立即删除,保证您的版权。