Зачем использовать код armeabi-v7a вместо кода armeabi?

142

В моем текущем проекте я использую несколько файлов .so. Они находятся в папках armeabi и armeabi-v7a. К сожалению, размер одного из файлов .so составляет 6 МБ, и мне нужно уменьшить размер файла. Вместо толстого APK-файла я хотел бы использовать только файлы armeabi и удалить папку armeabi-v7a.

Согласно документации NDK, код armeabi-v7a - это расширенный код armeabi, который может содержать дополнительные инструкции ЦП. Все это выходит за рамки моего опыта, но я сомневаюсь, почему нужно иметь и код armeabi-v7a, и код armeabi. Должна быть веская причина иметь и то, и другое, верно?

На моих тестовых устройствах все работает нормально. У них есть процессоры ARM v7. Можно ли предположить, что сейчас все работает?

PaulT
источник
2
Возможно, вы захотите прочитать этот пост сейчас. Он подробный и актуальный: androidbycode.wordpress.com/tag/armeabi-v7a
Игорь
2
А теперь документ говорит:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Амир Резазаде
1
Для тех, кто придет позже, загляните сюда .
Амир Резазаде

Ответы:

163

Зависит от того, что делает ваш собственный код, но v7a поддерживает аппаратные операции с плавающей запятой, что имеет огромное значение. armeabi будет нормально работать на всех устройствах, но будет намного медленнее и не будет использовать возможности ЦП новых устройств. Сделайте несколько тестов для вашего конкретного приложения, но удаление двоичных файлов armeabi-v7a, как правило, не является хорошей идеей. Если вам нужно уменьшить размер, вы можете иметь два отдельных apks для старых (armeabi) и новых (armeabi-v7a) устройств.

Николай Еленков
источник
1
Где я могу найти разницу между обоими ABI? Мне очень хочется понять настоящие различия ...
webshaker
8
Руководства по ARM? infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/…
Николай Еленков
1
есть ли идеи об элегантном решении для получения Google Play, позволяющего загружать эти два разных APK? В манифесте невозможно отличить, что они разные, поэтому Google Play просто хочет заменить одно другим (у них разные коды версий),
Дин Уайлд,
11
@DeanWild Google добавил поддержку для разных архитектур ЦП в Play Store с функцией нескольких APK: developer.android.com/guide/google/play/publishing/…
Чарльз Харли,
1
@IgorGanapolsky, спасибо, что указали на это. Теперь это правильная ссылка: developer.android.com/google/play/publishing/…
Чарльз Харли,
60

EABI = бинарный интерфейс встроенного приложения. Это такие спецификации, которым исполняемый файл должен соответствовать, чтобы выполняться в определенной среде выполнения. Он также определяет различные аспекты компиляции и связывания, необходимые для взаимодействия между инструментальными цепочками, используемыми для архитектуры ARM. В этом контексте, когда мы говорим об armeabi, мы говорим об архитектуре ARM и ОС GNU / Linux. Android следует за прямым порядком байтов ARM GNU / Linux ABI.

Приложение armeabi будет работать на ARMv5 (например, ARM9) и ARMv6 (например, ARM11). Вы можете использовать оборудование с плавающей запятой, если вы создаете свое приложение с использованием правильных опций GCC, таких как -mfpu = vfpv3 -mfloat-abi = softfp, который сообщает компилятору генерировать инструкции с плавающей запятой для оборудования VFP и включает соглашения о вызовах soft-float. armeabi не поддерживает соглашения о вызовах с жесткой плавающей запятой (это означает, что регистры FP не используются для хранения аргументов функции), но операции FP в HW все еще поддерживаются.

Приложение armeabi-v7a будет работать на устройствах Cortex A #, таких как Cortex A8, A9 и A15. Он поддерживает многоядерные процессоры и поддерживает -mfloat-abi = hard . Итак, если вы создаете свое приложение с помощью -mfloat-abi = hard , многие из ваших вызовов функций будут быстрее.

Психоделия
источник
1
По developer.android.com/ndk/guides/abis.html : The armeabi-v7a ABI uses the -mfloat-abi=softfp switch. Так что вы подразумеваете под support -mfloat-abi = hard ?
Игорь Ганапольский 08
8

Вместо толстого APK-файла я хотел бы использовать только файлы armeabi и удалить папку armeabi-v7a.

Противоположное - гораздо лучшая стратегия. Если вам нужно minSdkVersion14 и загрузите свой apk в игровой магазин, вы заметите, что будете поддерживать одинаковое количество устройств, независимо от того, поддерживаете вы это armeabiили нет. Следовательно, нет устройств с Android 4 и выше, от которых можно было бы выиграть armeabi.

Вероятно, поэтому Android NDK даже armeabiбольше не поддерживает версию r17b. [ источник ]

Кристан
источник