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

时间:2019-06-30 11:38:14

标签: android python kivy

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

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

请帮助我!

2 个答案:

答案 0 :(得分:5)

需要明确的是,这些不是指令集。它们是 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 总是使用 ELF。更多 信息,请参阅 ELF System V 应用程序二进制接口。如何 C++ 名字被破坏了。有关更多信息,请参阅通用/安腾 C++ ABI。 source

答案 1 :(得分:0)

这些是CPU指令集。通常,您不必担心,默认设置很好,但是由于最近的一些更改,我一直想在文档中添加一些内容。

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

在给定的体系结构类型中,有多个版本。 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查看出了什么问题。