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

Pau*_*ulT 139 android arm android-ndk armv7

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

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

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

Nik*_*kov 158

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

  • @DeanWild Google现在添加了对Play商店多个APK功能中不同CPU架构的支持:http://developer.android.com/guide/google/play/publishing/multiple-apks.html#CpuArchOptions (11认同)
  • ARM手册?http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/Cacciced.html (7认同)
  • 在哪里可以找到这两个 ABI 之间的区别?我很想了解真正的差异...... (2认同)

psi*_*lia 59

EABI =嵌入式应用程序二进制接口.它是可执行程序必须符合的规范,以便在特定的执行环境中执行.它还指定了用于ARM体系结构的工具链之间互操作所需的编译和链接的各个方面.在这种情况下,当我们谈论armeabi时,我们谈论ARM架构和GNU/Linux OS.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构建应用程序,则许多函数调用将更快.


Cri*_*tan 5

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

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

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