【问题标题】:Will an app built with only armeabi run on armeabi-v7a devices?仅使用 armeabi 构建的应用程序能否在 armeabi-v7a 设备上运行?
【发布时间】:2013-06-30 00:43:37
【问题描述】:

Xamarin documentation 对此有点不清楚。如果我在构建首选项中仅勾选 armeabi 构建我的应用程序,我的应用程序会:

  1. 在 Play 商店中可用于 v7a 设备吗?
  2. 在 v7a 设备上运行?

如果它确实运行,是否有任何功能,例如使用线程会导致意外行为或崩溃?

我有一个简单的应用程序,并试图保持它的小。另外,我没有 v7a 设备来做一个快速实验。

澄清:

虽然似乎已明确接受仅使用 amreabi 库编译 Android 应用程序是“安全的,但性能不高”(请参阅​​这篇出色的帖子:Why use armeabi-v7a code over armeabi code?),但我认为Xamarin docs on CPU architecture适用于他们编译的 .so 库,说:

重要的是要记住,使用的 armeabi 运行时 Xamarin.Android 是线程安全的。如果有 armeabi 的应用程序 支持部署到 armeabi-v7a 设备,许多奇怪和 会发生无法解释的异常。

我已经能够在 v7a 设备上测试我刚刚使用 armeabi 编译的应用程序,并且还没有遇到任何“奇怪且无法解释的异常”。

更新:

看起来 Xamarin 文档已经更新,现在 (2014-07-14) 显示为:

重要的是要记住,使用的 armeabi 运行时 Xamarin.Android 不是线程安全的。如果一个应用程序有 armeabi 支持部署到 armeabi-v7a 设备上,很多奇怪 并且会发生无法解释的异常。

【问题讨论】:

  • 除非 Xamarin 搞砸了,armeabi 代码将在 ARM v7a 设备上正常运行。它当然适用于正常的 Android NDK 开发。

标签: android build xamarin.android xamarin cpu-architecture


【解决方案1】:

根据 Xamarin Android 文档,armeabi 代码会在多核 armeavi-v7 设备上以意想不到的方式崩溃。

http://docs.xamarin.com/guides/android/advanced_topics/cpu_architecture

第 1.1 节

注意:Xamarin.Android 的 armeabi 代码不是线程安全的,不应该 可用于多 CPU armeabi-v7a 设备(如下所述)。使用 单核 armeabi-v7a 设备上的 aremabi 代码是安全的。

Xamarin Android 要求包含 armeabi-v7a 的原因与线程安全内存访问有关。简而言之,armeabi 指令集缺少安全锁定 SMP 设备上的内存所需的指令。

可以在此错误报告中找到对该问题最彻底的讨论:https://bugzilla.xamarin.com/show_bug.cgi?id=7013

Jonathan Pryor 2012-09-20 11:41:45 EDT

据我所知,(几乎)不可能安全地使用 armeabi SMP armeabi-v7a 设备上的库。这是因为 armeabi 缺少 CPU 在 SMP 设备上安全锁定数据所需的说明,因此如果 armeabi 库包含必须防止来自多个访问的数据 线程,它被破坏了,而 libmonodroid.so 就是这样一个库。这可能是 可通过创建动态确定运行时的 libmonodroid.so 来修复 CPU,允许它使用 armeabi 或 armeabi-v7a 锁定指令 相应地,但这还没有完成,实施时间表 未知。

因此,如果您的应用将在 SMP 硬件上运行,您应该包括 armeabi-v7a 运行时与您的应用程序。这可以在项目选项中完成 对话框。

这些崩溃很少见,但却是灾难性的,而且在您遇到随机内存损坏和分段错误时非常难以调试。

我能够在 Galaxy S3 上可靠地重现该问题。此错误报告中有一些演示崩溃的示例代码:https://bugzilla.xamarin.com/show_bug.cgi?id=7167


尚不清楚此错误是否会影响 Android 上的其他 NDK 应用程序。但它肯定会影响 Xamarin Android。

【讨论】:

  • 杰瑞德,关于这个主题的优秀、权威的观点。非常感谢。
【解决方案2】:

我点击并阅读了 Xamarin cmets。根据阅读它们,我认为您问错了问题。您提出的问题的答案是(正如 CommonsWare 在他的评论中所说),“是的,除非 Xamarin 搞砸了”。不幸的是,他们的文档表明他们认为他们确实搞砸了。他们的文档中有一些拼写错误使事情有些混乱,特别是在一个地方(第 1.1 节),当他们明确表示“不是线程安全的”时,他们说“是线程安全的”。他们在第 1.2 节中正确地重申了这一点:

注意:Xamarin.Android 的 armeabi 代码不是线程安全的,不应该 可用于多 CPU armeabi-v7a 设备(如下所述)。使用 单核 armeabi-v7a 设备上的 aremabi 代码是安全的。

我认为,如果您将第 1.2 节和第 1.1 节中的信息结合起来,Xamarin 告诉您的内容就很清楚了。需要明确的是,我只是重申他们的文档所说的内容,而不是对其文档的真实性做出任何断言。也就是说,如果 armeabi 库(不是线程安全的)被加载到多核或多处理器设备上,可能会发生不好的事情。这种情况可能是由于 ICS (4.0.0-4.0.3) 中的错误引起的。因此:

使用 Xamarin.Android 4.2 或更低版本构建的应用程序应明确指定 armeabi-v7a 作为唯一基于 ARM 的 ABI

以下是他们文档中的实际信息(添加了格式),重新排列成可能有助于使其更清晰的顺序:

来自第 1.2.1 节

注意:Xamarin.Android 的 armeabi 代码不是线程安全的,不应在 多 CPU armeabi-v7a 设备上使用(如下所述)。在单核 armeabi-v7a 设备上使用 aremabi 代码是安全的。

来自第 1.1 节

由于 Android 4.0.0、4.0.1、4.0.2 和 4.0.3 中的一个错误,即使存在 armeabi-v7a 目录并且设备存在,也会从 armeabi 目录中提取本机库是 armeabi-v7a 设备。

注意:由于这些原因,强烈建议使用 Xamarin.Android 4.2 或更低版本构建的应用程序应明确指定 armeabi-v7a 作为唯一基于 ARM 的 ABI。

我认为根据文档的其余部分,这是第 1.1 节的第一段应该说的(粗体编辑是我的):

下面将详细讨论应用程序二进制接口, 但重要的是要记住,使用的 armeabi 运行时 Xamarin.Android 不是线程安全的。如果有 armeabi 的应用程序 支持部署到 multi-CPU armeabi-v7a 设备,许多奇怪和 会发生无法解释的异常。

【讨论】:

  • 很好的诠释,很有说服力。非常感谢!
  • 核心数应该对线程安全没有任何影响。即使在单核设备上,Android 也可以随时切换线程,这可以在内存写入过程中进行。上面的陈述不能让我对 Xamarin 在任何硬件上的稳定性有任何信心。
  • 这是我指出我的回答旨在帮助澄清 Xamarin 文档试图传达的信息的原因之一,而不是对文档的准确性做出任何断言。如果您继续阅读到接近 1.3.2 节的末尾,则表明“这也可能导致模糊的运行时错误,因为 armeabi 不是 SMP 安全的。”我对 JannieT 问题的阅读是“这个 Xamarin 文档试图告诉我什么?”; Xamarin 似乎确实发现了一个问题,并试图警告他们的用户(很糟糕),所以我的意图是帮助解释文档。
  • JannieT 编辑他们的问题以使其特定于 Xamarin 可能是有意义的;它被标记为这样,但问题本身是一般性的,它应该是具体的。
【解决方案3】:

http://www.arm.com/products/processors/instruction-set-architectures/index.php

如果您查看此图,它解释了 ARM 处理器设计的精神。

新的迭代扩展了基本功能集,但不要更改它。 NEON 和 SIMD 需要直接引用才能使用,因此不能从 ARMv5 二进制文件中引用。除非你的二进制文件很大(那是实际的可执行文件,而不是整个 APK),否则我会编译两者并获得两全其美的效果。详情请见this question

无论如何,我会联系 Xamarin 以澄清那个稍微加载的“无法解释的异常”声明。如果他们发现在多个处理器上运行的代码存在问题,那么无论内核数量如何,他们的代码本质上都不是线程安全的。

【讨论】:

  • 谢谢丹尼。如果我包含所有基本库以完全保存和兼容,那么最简单和最小的编译应用程序将大于 8Mb。我想评估我发布较小内容所承担的风险,虽然您的回答更加轻松,但它并不能减轻我的恐惧和疑虑。
  • 恐怕这是基于 Xamarin 之上的应用程序的本质。如果他们没有提供多个 .so 并告诉您需要为 Xamarin 的特定功能包含哪些文件,这将导致应用程序膨胀。您基本上包含了一堆您的应用可能不需要的代码,因为它们是如何捆绑平台的。
【解决方案4】:

是的。

armeabi 是通用基础,armeabi-v7a 包含一些在 armeabi 指令集中找不到的附加指令。 v7a 支持硬件浮点运算,如果它正在执行任何浮点运算,它可以使您的代码更快。如果硬件支持,Android 将首先尝试加载 armeabi-v7a 库,但如果不支持,它将回退到 armeabi 版本。

【讨论】:

  • 你怎么知道的,尼克?请参阅我的说明。
  • Xamarin 的评论暗示那里的代码对我来说可能不是线程安全的,我会联系他们进行澄清,因为他们的声明非常模糊。无论如何,他们应该为两种架构和现在的 x86 提供 .so。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2011-09-09
  • 1970-01-01
  • 2015-03-01
  • 2019-11-25
  • 2014-12-08
相关资源
最近更新 更多