为什么用 Armeabi-v7a 代码而不是 Armeabi 代码?

在我目前的项目中,我使用了。文件。这些文件位于 armeabi 和 armeabi-v7a 文件夹中。不幸的是。所以文件是一个6 MB,我需要减少文件大小。与其使用一个大的 APK 文件,不如只使用 armeabi 文件并删除 armeabi-v7a 文件夹。

根据 NDK 文档,armeabi-v7a 代码是扩展的 armeabi 代码,它可以包含额外的 CPU 指令。这些都超出了我的专业知识范围,但我质疑为什么一个人想要同时拥有 Armeabi-v7a 和 Armeabi 代码。两者兼得肯定有充分的理由,对吧?

在我的测试设备上,这一切似乎都工作得很好。这些有 ARM v7 CPU。现在可以假设一切正常了吗?

108542 次浏览

这取决于您的本机代码所做的工作,但是 v7a 支持硬件浮点操作,这会带来很大的不同。Armeabi 在所有设备上都能正常工作,但速度会慢很多,而且不能利用新设备的 CPU 能力。为您的特定应用程序采用一些基准测试,但是删除 armeabi-v7a 二进制文件通常不是一个好主意。如果需要减小尺寸,可能需要为较旧的(armeabi)和较新的(armeabi-v7a)设备提供两个单独的 apk。

嵌入式应用二进制接口。为了在特定的执行环境中执行,可执行文件必须遵守这些规范。它还规定了 ARM 架构所使用的工具链之间互操作所需的编译和链接的各个方面。在这种情况下,当我们谈到 Armeabi时,我们谈到的是 ARM 架构和 GNU/Linux 操作系统。Android 遵循小端 ARM GNU/Linux ABI。

Armeabi 应用程式会在 ARMv5(例如 ARM9)及 ARMv6(例如 ARM11)上运行。如果使用适当的 GCC 选项(如 - mfpu = vfpv3-mfloat-abi = softfp)构建应用程序,您可以使用浮点硬件,- mfpu = vfpv3-mfloat-abi = softfp告诉编译器为 VFP 硬件生成浮点指令,并启用软浮点调用约定。Armeabi 不支持硬浮点调用约定(这意味着 FP 寄存器不用来包含函数的参数) ,但是仍然支持 HW 中的 FP 操作。

Armeabi-v7a 应用程序将运行在 Cortex A # 设备上,如 Cortex A8、 A9和 A15。它支持多核处理器,并且支持 - mfloat-abi = hard。因此,如果使用 - mfloat-abi = hard构建应用程序,许多函数调用将更快。

与其使用一个大的 APK 文件,不如只使用 armeabi 文件并删除 armeabi-v7a 文件夹。

反之则是更好的策略。如果你有 minSdkVersion到14,并上传你的 apk 到播放商店,你会注意到,无论你是否支持 armeabi,你将支持相同数量的设备。因此,没有 Android 4或更高版本的设备能从 armeabi中获益。

这可能就是为什么 Android NDK 根据 r17b 版本甚至不再支持 armeabi的原因