为什么要使用armeabi-v7a代码覆盖armeabi代码?

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

根据NDK文档,armeabi-v7a代码是可以包含额外CPU指令的扩展armeabi代码。 这一切都超出了我的专业知识,但我质疑为什么要有armeabi-v7a和armeabi代码。 必须有一个很好的理由,有两个,对吗?

在我的testing设备上,这似乎都工作正常。 这些有ARM v7 CPU。 假设现在一切正常吗?

取决于你的本地代码的function,但是v7a支持硬件浮点运算,这是非常重要的。 armeabi在所有设备上都能正常工作,但速度会慢很多,不会利用新设备的CPUfunction。 为特定的应用程序做一些基准testing,但是除去armeabi-v7a二进制文件通常不是一个好主意。 如果你需要减小尺寸,你可能需要为旧的(armeabi)和较新的(armeabi-v7a)设备分别安装两个apks。

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

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

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