为什么要使用armeabi-v7a代码而不是armeabi代码?

146

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

根据NDK文档,armeabi-v7a代码是扩展的armeabi代码,可以包含额外的CPU指令。这超出了我的专业知识范围,但我怀疑为什么会同时拥有armeabi-v7a和armeabi代码。一定有一个很好的理由同时拥有两者,对吧?

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


2
你可能现在想要阅读这篇博客文章。它非常详尽和最新:https://androidbycode.wordpress.com/tag/armeabi-v7a/ - IgorGanapolsky
2
现在文档上说:armeabi在NDK r16中已被弃用。在NDK r17中已删除。没有硬浮点。 - amrezzd
1
对于后来者,请查看这里 - amrezzd
3个回答

164

取决于您的本地代码功能,但v7a支持硬件浮点运算,这会产生巨大的差异。armeabi在所有设备上都可以正常工作,但速度会慢得多,并且不会利用较新设备的CPU功能。对于您特定的应用程序,请进行一些基准测试,但通常不建议删除armeabi-v7a二进制文件。如果您需要缩小大小,则可能需要为旧设备(armeabi)和新设备(armeabi-v7a)分别拥有两个单独的apk。

更新2012-09; Google Play商店终于支持上传不同的APK(每个APK针对不同的CPU架构),使用所谓的“多个APK”功能:
https://developer.android.com/google/play/publishing/multiple-apks

其中可能每个APK需要具有不同的版本代码(即使它们实际上都是相同的版本,只是具有不同的CPU目标)。

但是,更新到2023年;Google建议创建“应用程序包”而不是使用“多个APK”功能:
https://developer.android.com/guide/app-bundle

对于“应用程序包”,Play商店可以根据正在下载的设备自动减小下载大小。


2
我在哪里可以找到两种ABI之间的区别?我非常想了解真正的差异... - webshaker
8
ARM手册?http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/Cacciced.htmlARM手册是一系列关于ARM架构的技术文档,提供了有关ARM处理器如何工作和如何进行编程的详细信息。该网站提供了各种ARM处理器的手册,包括指令集参考、软件开发工具和系统设计指南等内容。 - Nikolay Elenkov
1
有没有关于如何优雅地解决上传这两个不同APK的问题,让Google Play允许的想法?在清单文件中无法区分它们是不同的,因此Google Play只想用另一个替换其中一个(它们具有不同的版本代码)。 - Dean Wild
11
谷歌现在已经在Play Store的多个APK功能中添加了针对不同CPU架构的目标支持:http://developer.android.com/guide/google/play/publishing/multiple-apks.html#CpuArchOptions - Charles Harley
1
@IgorGanapolsky,感谢您指出这一点。现在这是正确的链接:https://developer.android.com/google/play/publishing/multiple-apks.html#CpuArchOptions - Charles Harley
显示剩余6条评论

60

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 A# 设备上,例如 Cortex A8、A9 和 A15。它支持多核处理器,并支持 -mfloat-abi=hard。因此,如果您使用 -mfloat-abi=hard 构建应用程序,您的许多函数调用将更快。


1
根据https://developer.android.com/ndk/guides/abis.html: armeabi-v7a ABI使用-mfloat-abi=softfp开关。那么,什么是“支持-mfloat-abi = hard”? - IgorGanapolsky

9

我希望使用只有 armeabi 文件,并删除 armeabi-v7a 文件夹,而不是一个臃肿的 APK 文件。

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

这可能就是为什么Android NDK在修订版r17b中甚至不再支持armeabi的原因。[来源]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接