Будет ли приложение, построенное с использованием только armeabi, работать на устройствах armeabi-v7a?

документация Xamarin немного неясна. Если я создам свое приложение только с армейцами, отмеченными в настройках сборки, будет мое приложение:

  • Доступно для устройств v7a в Play Маркете?
  • Запуск на устройствах v7a?

Если он запускается, есть ли какие-либо функции, такие как использование потоков, которые приведут к неожиданному поведению или сбоям?

У меня есть простое приложение, и я стараюсь держать его маленьким. Кроме того, у меня нет устройства v7a для быстрого эксперимента.

Разъяснение:

Несмотря на то, что, похоже, есть четкое признание того, что он "безопасен, но не настолько совершенен", чтобы скомпилировать приложение для Android только с библиотекой amreabi (см. этот отличный пост: Зачем использовать armeabi -v7a code over armeabi code?), документы Xamarin по архитектуре процессора, которые, как я предполагаю, относятся к их скомпилированным .so-библиотекам, говорит:

важно помнить, что время выполнения armeabi, используемое Xamarin.Android является потокобезопасным. Если приложение, имеющее armeabi поддержка развертывается на устройстве armeabi-v7a, многие странные и необъяснимые исключения.

С тех пор я смог протестировать свое приложение, которое только что скомпилировано с помощью armeabi на устройстве v7a и не попало ни в какие "странные и необъяснимые исключения" YET.

Update:

Похоже, что документы Xamarin с тех пор были обновлены и теперь (2014-07-14) читает:

важно помнить, что время выполнения armeabi, используемое Xamarin.Android не является потокобезопасным. Если приложение, которое имеет Поддержка armeabi развернута на устройстве armeabi-v7a, многие странные и возникнут необъяснимые исключения.

Ответ 1

Согласно документации Xamarin для Android, код armeabi может неожиданно возникнуть на многоядерном устройстве armeavi-v7.

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

Раздел 1.1

Примечание: код армабиса Xamarin.Androids не является потокобезопасным и не должен используется на многопроцессорных устройствах armeabi-v7a (описано ниже). С помощью Код ismabi на одноядерном устройстве armeabi-v7a безопасен.

Причина, по которой Xamarin Android требует, чтобы включить armeabi-v7a, имеет отношение к потокобезопасному доступу к памяти. Проще говоря, набор инструкций armeabi не содержит инструкций, необходимых для безопасного блокирования памяти на SMP-устройствах.

Наиболее подробное обсуждение проблемы можно найти в этом отчете об ошибке: https://bugzilla.xamarin.com/show_bug.cgi?id=7013

Джонатан Прайор 2012-09-20 11:41:45 EDT

Насколько я могу судить, это (почти) НЕВОЗМОЖНО БЕЗОПАСНО использовать armeabi библиотеки на устройстве SMP armeabi-v7a. Это потому, что у armeabi отсутствует процессор инструкции, необходимые для безопасного блокирования данных на SMP-устройствах, поэтому, если армейцы библиотека содержит данные, которые должны быть защищены от доступа из нескольких потоки, он распался, а libmonodroid.so - такая библиотека. Это может быть исправляется путем создания libmonodroid.so, который динамически определяет время выполнения CPU, позволяя ему использовать инструкции блокировки armeabi или armeabi-v7a соответственно, но это еще не сделано, а сроки реализации неизвестно.

Таким образом, если ваше приложение будет работать на аппаратном обеспечении SMP, вы должны включить armeabi-v7a с вашим приложением. Это можно сделать в параметрах проекта  диалоговое окно.

Эти сбои редки, но катастрофичны и очень трудны для отладки, поскольку возникают случайные повреждения памяти и ошибки сегментации.

Я смог достоверно воспроизвести проблему на Galaxy S3. Некоторое пример кода, демонстрирующий крах, находится в этом отчете об ошибке: https://bugzilla.xamarin.com/show_bug.cgi?id=7167


Неизвестно, влияет ли эта ошибка на другие приложения NDK на Android. Но это определенно влияет на Xamarin Android.

Ответ 2

Я щелкнул и прочитал комментарии Xamarin. Основываясь на их чтении, я думаю, вы задаете неправильный вопрос. Ответ на заданный вами вопрос (как CommonsWare заявил в своем комментарии), "да, если Хамарин не привнесет что-то". К сожалению, их документы указывают на то, что они думают, что они, возможно, что-то придумали. В их документации есть некоторые опечатки, которые немного путают вещи, особенно в одном месте (раздел 1.1), они говорят, что "является потокобезопасным", когда они явно означают, что "НЕ является потокобезопасным". Они верно подтверждают это в Разделе 1.2:

Примечание: код армабиса Xamarin.Androids не является потокобезопасным и не должен используется на многопроцессорных устройствах armeabi-v7a (описано ниже). С помощью Код ismabi на одноядерном устройстве armeabi-v7a безопасен.

Я думаю, что если вы объедините информацию из разделов 1.2 и 1.1, станет ясно, что говорит вам Xamarin. Чтобы быть ясным, я просто повторяю, что говорит их документация, не делая никаких утверждений о достоверности их документации. То есть, в случае, когда libe (небезопасные) armeabi загружаются на многоядерное или многопроцессорное устройство, могут возникнуть плохие вещи. Этот случай может возникнуть из-за ошибки в ICS (4.0.0-4.0.3). Поэтому:

Приложения

созданные с использованием Xamarin.Android 4.2 или ниже, должны явно указывать armeabi-v7a как единственный ABI на основе ARM

Вот фактическая информация из их документов (форматирование добавлена) перестроена в порядок, который может помочь сделать его более ясным:

Из раздела 1.2.1

Примечание. Код armaabi Xamarin.Androids не является безопасным для потолков и не должен использоваться на устройствах multi-CPU armeabi-v7a (описано ниже). Использование ismabi-кода на одноядерном устройстве armeabi-v7a безопасно.

Из раздела 1.1

Из-за ошибки в Android 4.0.0, 4.0.1, 4.0.2 и 4.0.3, родные библиотеки будут взяты из каталога armeabi, даже если имеется каталог armeabi-v7a, и устройство является устройством armeabi-v7a.

Примечание. Из-за этих причин настоятельно рекомендуется, чтобы приложения, созданные с использованием Xamarin.Android 4.2 или ниже, должны явно указывать armeabi-v7a как единственный ABI на основе ARM.

Я думаю, что, основываясь на остальной части документа, это то, что должен сказать первый абзац в разделе 1.1 (жирным шрифтом является мой):

Бинарный интерфейс приложения будет подробно рассмотрен ниже, но важно помнить, что время выполнения armeabi, используемое Xamarin.Android является не потокобезопасным. Если приложение, имеющее armeabi поддержка развертывается на устройстве multi-CPU armeabi-v7a, многие странные и необъяснимые исключения.

Ответ 3

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

Если вы посмотрите на эту диаграмму, это объясняет идеал проектирования процессора ARM. ARM Design

Новые итерации расширяют базовый набор функций, но не меняют его. NEON и SIMD должны быть напрямую привязаны к использованию, поэтому на них нельзя ссылаться из двоичного файла ARMv5. Если ваш бинарный файл не является огромным (что фактический исполняемый файл, а не весь APK), я бы скомпилировал оба и получил лучшее из обоих миров. Подробнее см. этот вопрос.

Независимо от того, я хотел бы связаться с Хамарином, чтобы прояснить это слегка загруженное выражение "необъяснимые исключения". Если они воспринимают проблемы с их кодом, работающим на нескольких процессорах, то их код по своей сути не является потокобезопасным независимо от количества ядер.

Ответ 4

Да.

armeabi - это общая база, а armeabi-v7a содержит некоторые дополнительные инструкции, не найденные в наборе команд armeabi. v7a поддерживает аппаратные операции с плавающей запятой, что может сделать ваш код намного быстрее, если он выполняет операции с плавающей запятой. Android сначала попытается загрузить библиотеку armeabi-v7a, если аппаратное обеспечение поддерживает это, но если нет, оно вернется к версии armeabi.