我正在构建我的Android应用程序,不包括所有ARM v7和ARM64 v8库,根据此示例:https://stackoverflow.com/a/30799825/736963(尽管我在ARM系列中仅包含armeabi
。)这是因为我有第3个-party库,仅为armeabi
目标构建。这个计划正如预期的那样运作,但我对此抱有怀疑......
在这种方案下,这是否意味着如果我在64位设备上运行应用程序我的应用程序中运行的所有是以32位模式运行的?换句话说,应用程序中包含的最终到达支持库的所有android / java代码是运行Android SDK的ARMv5版本(例如,显示例程,数学例程等)吗?或者,即使包含二进制文件(.so
&#3>}都是ARMv5,对Android SDK的调用也会对平台本机代码进行操作?
答案 0 :(得分:2)
是的,如果APK安装程序选择安装32位二进制文件(来自armeabi
或armeabi-v7a
目录),整个过程(包括进程中的所有平台库)将以32位模式运行
这并不像你想象的那么戏剧性和糟糕。所有平台库都将使用当前设备的最大优化量构建,即使在32位模式下也是如此。因此,即使您的应用包含armeabi
模式的二进制文件,平台的库也不会受到该基线限制的限制;他们将使用您特定设备上可用的最佳说明。唯一的缺点是它使用效率稍低的32位模式,但实际差异和影响大多是微不足道的。
请注意,虽然armeabi
和armeabi-v7a
之间存在相当大的性能差异,但两者在两者都是32位的意义上是兼容的;加载armeabi-v7a
库的进程也可以加载armeabi
格式的库。 (你仍然需要在所有选择的ABI中提供所有二进制文件,但这更像是一个APK安装程序设计选择。)
因此,如果您的应用仅使用此第三方库但没有您自己的其他本机代码,您应该没问题(但是,根据库的功能,如果第三方库供应商提供,您将获得一些性能armeabi-v7a
或arm64-v8a
个版本)。如果您的应用拥有自己的额外原生代码,则可能需要考虑以armeabi-v7a
模式构建,但将第三方库从armeabi
复制到armeabi-v7a
。如上所述,它将加载并运行得很好,但将允许您自己的代码构建更多优化。 (由于32位和64位版本不兼容,您不能将armeabi
版本放入arm64-v8a
,但正如您已经尝试过的那样。)
armeabi
和armeabi-v7a
之间的主要区别在于为后者构建的二进制文件将使用硬件浮点 - 如果进行大量浮点计算,它会对性能产生很大影响,否则不会许多。 armeabi-v7a
和arm64-v8a
之间的差异通常不大,对于大多数代码来说,它最多只有几个百分点。