Настройки сборки Android NDK ARM для работы на большинстве устройств?

У меня есть несколько приложений Android NDK, и люди жалуются, что мое приложение не работает на их телефонах. Что я хотел бы знать, так это то, какие параметры компиляции будут поддерживать большинство, если не все устройства ARM на рынке?

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

Я использовал сценарии сборки NDK по умолчанию для armeabi и armeabi-v7a, в которых указано: -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3

Это не работает на некоторых устройствах, например на Acer A500 (процессор Nvidia Tegra2 (Dual Cortex A9)). Этот ЦП не реализует NEON, из того, что я узнаю здесь http://wiki.debian.org/ArmHardFloatPort/VfpComparison.

Авария, в частности, такова:

F/libc    (15549): Fatal signal 4 (SIGILL) at 0x5bfd9260 (code=1)
...(snip)...
I/DEBUG   (   81): #00 pc 0005b260 /data/data/com.burnsmod.oscpad/lib/libapplication.so (tanf)

Глядя на libapplication.so, я вижу, что tanf генерируется как:

0005b25c <tanf>:
5b25c:       ee070a90        fmsr    s15, r0
5b260:       eef70ae7        fcvtds  d16, s15
5b264:       e92d4010        push    {r4, lr}
5b268:       ec510b30        vmov    r0, r1, d16
5b26c:       ebff4b6c        bl      2e024 <_ZN15ButtonUIHandler10FreeImagesEv-0x6ac>
5b270:       ec410b30        vmov    d16, r0, r1
5b274:       eef77be0        fcvtsd  s15, d16
5b278:       ee170a90        fmrs    r0, s15
5b27c:       e8bd8010        pop     {r4, pc}

Итак, каков ответ? вфпв2? вфп? вфпв3? вфпв3-д16?

Прямо сейчас, если я использую readelf, я нахожу зависимости моей библиотеки приложений:

MacBook:armeabi-v7a tom$ arm-linux-androideabi-readelf -A libapplication.so
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_VFP_arch: VFPv3
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP

VFP2: компиляция с параметрами '-mfpu=vfpv2' или '-mfpu=vfp2' не поддерживается в NDK 7, оба возвращают сообщение об ошибке.


person gravitron    schedule 06.08.2012    source источник
comment
Обычно, когда совместимость важнее оптимизации, вы стремитесь к наименьшему общему знаменателю.   -  person Seva Alekseyev    schedule 06.08.2012
comment
@Сева Определенно. Так что же это? VFP упоминается как «устаревший», так что это VFPv2?   -  person gravitron    schedule 06.08.2012


Ответы (2)


Оказывается, моя проблема заключалась в том, что я использовал NDK r7b, в котором были ошибки, связанные с включением кода VFPv3 в некоторые основные библиотеки.

http://code.google.com/p/android/issues/detail?id=26199

Это было исправлено в r7c, и после обновления до r8b, похоже, я решил проблему.

person gravitron    schedule 22.08.2012

Создавая как ванильную, так и оптимизированную для armv7 библиотеку (armeabi и armeabi-v7a), вы охватываете ситуации с armv7 и без armv7, поскольку менеджер пакетов выберет соответствующую библиотеку, когда пользователь установит ваше приложение.

В оптимизированной для armv7 библиотеке вы можете использовать android_getCpuFeatures() для обнаружения поддержки для VFPv3-D16 и NEON и выберите соответствующий путь кода на основе этого. То есть вы можете выполнить любой код, оптимизированный для VFPv3-D16, который у вас есть, если установлен ANDROID_CPU_ARM_FEATURE_VFPv3, и любой код, оптимизированный для NEON/VFPv3-D32, если установлен ANDROID_CPU_ARM_FEATURE_NEON (при условии, что никакие устройства не лгут о том, что они поддерживают).

person Michael    schedule 06.08.2012
comment
Спасибо за информацию - но я не пишу код, зависящий от VFPv3/NEON. Он выбирается для меня во время компиляции (т.е. tanf генерируется в зависимости от vfpv3) - person gravitron; 06.08.2012
comment
В этом случае лучше всего скомпилировать библиотеку armeabi-v7a с помощью -mfpu=vfpv3, если вы действительно хотите поддерживать устройства на базе Tegra 2 и не хотите иметь версию своего приложения, специфичную для Tegra 2. - person Michael; 06.08.2012
comment
На самом деле Tegra2 поддерживает только vfpv3-d16. Я отправил копию своего приложения, созданного с его помощью, людям, которые жаловались на сбои, надеюсь, это решит проблему, и я смогу вернуться к продуктивному кодированию. - person gravitron; 06.08.2012
comment
Да, извините, я имел в виду vfpv3-d16 (ошибка копирования-вставки). Другой возможностью может быть создание нескольких версий вашей библиотеки armeabi-v7a, например. один с неоновой оптимизацией и один с оптимизацией vfpv3-d16 - и решите, какой из них загружать во время выполнения, основываясь на том, что возвращает getCpuFeatures (я сам не пробовал этот подход, поэтому я не могу ничего сказать о том, насколько это было бы практично). - person Michael; 06.08.2012