armeabi-v7a、arm64-v8a和x86有什么区别?

108

我正在使用Kivy开发Android应用程序,使用Buildozer编译APK文件。 在Buildozer规范文件中,有一个设置 android.arch = armeabi-v7a,我不理解这是什么意思。

此外,当我使用命令 buildozer -v android debug 生成APK文件,并使用命令 adb install bin/<appname>.apk 安装后,在我的Android手机上无法打开此应用程序。

2个回答

92
这些是CPU指令集。大多数情况下,您不必担心它,默认设置就可以了,但由于最近的一些变化,我一直想在文档中添加关于它的内容。
基本上,一个给定的Android设备可能有一个arm或x86 CPU(甚至可能是其他类型的CPU,但这不重要),这些只是来自不同制造商的不同架构类型。 Arm CPU最常见,但x86并不罕见。当您编译代码时,输出取决于架构目标。当您构建Kivy应用程序时,您指定其中之一,并且该应用程序只能在该类型的设备上工作。如果您想支持所有设备,您可以编译多个APK进行分发-Play商店将允许您上传多个APK,并将向每个设备发送正确的APK。
在给定的架构类型中,有多个版本。 armeabi-v7a是旧的目标,用于32位ARM CPU,几乎所有的ARM设备都支持此目标。 arm64-v8a是更近期的64位目标(类似于桌面计算机上的32位-> 64位转换)。我认为大多数新设备都是64位,但不确定。 arm64-v8a设备可以运行针对armeabi-v7a编译的代码,它是向后兼容的。
从今年晚些时候开始,Play商店将要求您上传arm64-v8a APK作为最小值,因为这提供了对新设备的最佳支持。您还可以上传其他APK以支持其他设备类型。
这并不是完整的故事:一些x86设备具有特殊库,使它们能够运行为ARM设备编译的代码。我不确定这有多普遍,但似乎相当普遍。
针对您的应用问题,请使用adb logcat查看具体错误信息。

adb install 只是安装你的 apk,它不会运行它。你可以像启动其他已安装应用程序一样启动它。 - John Anderson
@inclement:感谢你提供的信息,伙计。我对Android开发还很陌生,对adb logcat也只是略知一二。你能给我指点一下吗? - Chitkaran Singh
@ChitkaranSingh请按照我提供的指示操作。如果您对此有任何问题,请提出具体问题,可能需要在新的SO问题中提问。 - inclement
@ChitkaranSingh 你可能会发现在Kivy的Discord频道上提问更有用。 - inclement
尝试运行buildozer -v android debug deploy run logcat > my_log.txt以在my_log.txt中捕获logcat数据。文档在这里 - John Anderson
显示剩余4条评论

69
要明确的是,这些不是指令集。它们是ABI,可以编译成指令集。今天大多数设备都是arm64-v8a,真正便宜的设备是armeabi-v7a以节省成本,而几乎没有x86x86_64
例如,armeabi-v7a ABI编译为armeabithumb-2VFPv3-D16指令集,但arm64-v8a ABI编译为AArch64指令集。

Supported ABIs table 1 from https://developer.android.com/ndk/guides/abis

每种CPU和指令集的组合都有自己的应用程序二进制接口(ABI)。ABI包括以下信息:CPU指令集(和扩展)可用。运行时内存存储和加载的字节序。Android始终是小端。在应用程序和系统之间传递数据的约定,包括对齐约束以及系统调用函数时如何使用堆栈和寄存器。可执行二进制文件的格式,例如程序和共享库,以及它们支持的内容类型。Android始终使用ELF。有关更多信息,请参见ELF System V应用程序二进制接口。C ++名称的名称混淆。有关更多信息,请参见通用/Itanium C ++ ABI。source

1
从Tensorflow Lite 文档中可以得到更多上下文信息:除非你的目标硬件是特定的,否则在大多数情况下应该省略x86、x86_64和arm32 ABIs。由于armeabi是arm 32位,这意味着你可以放弃对除了arm64-v8a之外的所有支持。 - Ben Butterworth

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