【问题标题】:Why use armeabi-v7a code over armeabi code?为什么使用 armeabi-v7a 代码而不是 armeabi 代码?
【发布时间】:2011-10-28 04:11:25
【问题描述】:

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

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

在我的测试设备上,这一切似乎都运行良好。这些具有ARM v7 CPU。现在可以假设一切正常吗?

【问题讨论】:

  • 您可能想立即阅读这篇博文。它是彻底和最新的:androidbycode.wordpress.com/tag/armeabi-v7a
  • 现在文档说:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
  • 以后来的朋友可以关注here

标签: android android-ndk arm armv7


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

【解决方案3】:

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

相反是一个更好的策略。如果您将minSdkVersion 设置为 14 并将您的 apk 上传到 Play 商店,您会注意到无论您是否支持 armeabi,您都将支持相同数量的设备。因此,Android 4 或更高版本的设备根本不会受益于armeabi

这可能是 Android NDK 甚至不再支持 armeabi 的原因(根据 r17b 修订版)。 [source]

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-08-26
    • 2023-03-28
    • 2019-11-25
    • 2021-09-20
    相关资源
    最近更新 更多