Будет ли приложение, построенное с использованием только 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.