我正在使用Kivy开发Android应用。我正在使用Buildozer来编译APK文件。
在Buildozer规范文件中,有一个设置android.arch = armeabi-v7a
,我不明白。
此外,当我使用命令buildozer -v android debug
生成APK文件并使用命令adb install bin/<appname>.apk
安装APK文件时,该文件没有在我的Android手机上打开。
请帮助我!
答案 0 :(得分:5)
需要明确的是,这些不是指令集。它们是 ABI,可编译为指令集。今天的大多数设备都是 arm64-v8a
,真正便宜的设备是 armeabi-v7a
以节省成本,几乎没有x86
或 x86_64
。
例如armeabi-v7a
ABI 编译为 armeabi
、thumb-2
和 VFPv3-D16
指令集,但 arm64-v8a
ABI 编译为 AArch64
指令集。
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查看出了什么问题。