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

Chi*_*ngh 53 python android kivy

我正在 Kivy 上开发 Android 应用程序。我正在使用 Buildozer 来编译一个 APK 文件。在 Buildozer 规范文件中,有一个设置android.arch = armeabi-v7a,我不明白这一点。

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

inc*_*ent 61

这些是 CPU 指令集。大多数情况下您不必担心它,默认值很好,但是由于最近的一些更改,我一直想在有关它的文档中添加一些内容。

基本上,给定的 Android 设备可能有一个 arm 或 x86 cpu(甚至其他东西,但这并不重要),这些只是来自不同制造商的不同架构类型。Arm CPU 是最常见的,但 x86 并不罕见。编译代码时,输​​出取决于架构目标。当您构建 Kivy 应用程序时,您指定其中一种架构,然后该应用程序将仅在该类型的设备上运行。如果你想支持所有设备,你可以编译多个 APK 来分发 - Play 商店会让你上传多个,并且会为每个设备发送正确的一个。

在给定的架构类型中,有多个版本。armeabi-v7a 是较旧的目标,对于 32 位 arm cpus,几乎所有 arm 设备都支持此目标。arm64-v8a 是最新的 64 位目标(类似于台式计算机中的 32 位 -> 64 位转换)。我认为大多数新设备都是 64 位的,但不确定。arm64-v8a 设备可以运行针对 armeabi-v7a 编译的代码,它向后兼容。

从今年晚些时候开始,Play 商店将要求您至少上传 arm64-v8a APK,因为这可以为较新的设备提供最佳支持。您还可以上传其他 APK 以支持其他设备类型。

这还不是全部:一些 x86 设备有一个特殊的库,可以让它们运行为 arm 设备编译的代码。我不确定这有多普遍,但它似乎很常见。

对于您的应用程序问题,请使用adb logcat查看问题所在。


Ben*_*rth 11

需要明确的是,这些不是指令集。它们是 ABI,可编译为指令集。大部分设备今天arm64-v8a,真正便宜的设备armeabi-v7a,以节省成本,而且几乎没有是x86x86_64

例如,armeabi-v7aABI 编译为armeabi,thumb-2VFPv3-D16指令集,但arm64-v8aABI 编译为AArch64指令集。

支持的 ABI 表 1 来自 https://developer.android.com/ndk/guides/abis

CPU 和指令集的每种组合都有自己的应用程序二进制接口 (ABI)。ABI 包括以下信息:

可以使用的 CPU 指令集(和扩展)。内存在运行时存储和加载的字节序。Android 总是小端的。在应用程序和系统之间传递数据的约定,包括对齐约束,以及系统在调用函数时如何使用堆栈和寄存器。可执行二进制文件的格式,例如程序和共享库,以及它们支持的内容类型。Android 总是使用 ELF。有关更多信息,请参阅 ELF System V 应用程序二进制接口。C++ 名称是如何被破坏的。有关更多信息,请参阅通用/安腾 C++ ABI。 来源