为什么在armeabi代码上使用armeabi-v7a代码?

时间:2011-08-16 15:11:47

标签: android android-ndk arm armv7

在我目前的项目中,我使用了多个.so文件。这些位于armeabi和armeabi-v7a文件夹中。不幸的是,其中一个.so文件是6MB,我需要减小文件大小。我想使用armeabi文件并删除armeabi-v7a文件夹,而不是有一个胖的APK文件。

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

在我的测试设备上,这一切看起来都很好。这些都有ARM v7 CPU。假设现在一切正常可以安全吗?

3 个答案:

答案 0 :(得分:153)

取决于您的本机代码的功能,但v7a支持硬件浮点运算,这会产生巨大的差异。 armeabi可以在所有设备上正常工作,但速度会慢很多,并且不会利用新设备的CPU功能。请为您的特定应用程序采取一些基准测试,但删除armeabi-v7a二进制文件通常不是一个好主意。如果您需要减小大小,您可能希望为旧(armeabi)和较新(armeabi-v7a)设备提供两个单独的apks。

答案 1 :(得分:58)

EABI =嵌入式应用程序二进制接口。它是可执行程序必须符合的规范,以便在特定的执行环境中执行。它还指定了用于ARM体系结构的工具链之间互操作所需的编译和链接的各个方面。在这种情况下,当我们谈论 armeabi 时,我们谈论ARM架构和GNU / Linux操作系统。 Android遵循小端ARM GNU / Linux ABI。

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

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

答案 2 :(得分:4)

  

我不想只使用繁琐的APK文件,而是要使用armeabi文件并删除armeabi-v7a文件夹。

相反的是更好的策略。如果您将minSdkVersion设置为14,并将apk上载到Play商店,则无论是否支持armeabi,您都会注意到支持相同数量的设备。因此,根本没有Android 4或更高版本的设备可以从armeabi中受益。

这可能是Android NDK根据版本r17b甚至不再支持armeabi的原因。 1