在armeabi-v7a设备上运行仅使用armeabi构建的应用程序?

Jan*_*sen 12 android build cpu-architecture xamarin.android xamarin

Xamarin文档是对这个有点不清楚.如果我构建我的应用程序只在构建首选项中勾选了armeabi,那么我的应用程序是:

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

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

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

澄清:

虽然似乎很明显的验收,这是"安全的,但没有这么高性能的"编译Android应用程序只与amreabi库(见这个优秀的帖子:为什么在armeabi代码中使用armeabi-V7A代码)时,Xamarin文档上CPU架构,我认为适用于自己编译的.so库,说:

需要记住的是由Xamarin.Android使用的armeabi运行时是线程安全是很重要的.如果具有armeabi支持的应用程序部署到armeabi-V7A设备,将出现许多奇怪的和无法解释的异常.

因为我已经能够测试我的应用程序,只是与armeabi编制了V7A设备上,并没有遇到任何"奇怪和无法解释的异常"呢.

更新:

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

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

Jar*_*lls 8

根据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

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

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

这些崩溃是罕见的,但灾难性的,并且很难调试,因为您遇到随机内存损坏和分段错误.

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


不知道这个bug是否会影响Android上的其他NDK应用程序.但它肯定会影响Xamarin Android.


ajh*_*158 7

我点击了阅读Xamarin评论.在阅读它们的基础上,我认为你提出了错误的问题.你问的问题的答案是(正如CommonsWare在他的评论中所述),"是的,除非Xamarin搞砸了什么".不幸的是,他们的文档表明他们认为他们确实搞砸了.在他们的文档中有一些拼写错误,特别是在一个地方(第1.1节)他们说"线程安全",当他们明确表示"不是线程安全"时.他们在第1.2节中正确地重申了这一点:

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

我想如果你结合第1.2和1.1节中的信息,很明显Xamarin告诉你什么.要清楚,我只是重述他们的文档所说的内容,而不是对其文档的真实性做出任何断言.也就是说,在armeabi libs(非线程安全)被加载到多核或多处理器设备上的情况下,可能发生不好的事情.这种情况可能是由于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节中的第一段应该说的(粗体编辑是我的):

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