Android-приложения для архитектуры «armeabi-v7a» и «x86»: SoC, процессор и ABI

Загружая приложения для Android, я иногда видел приложения для armeabi-v7aархитектуры x86.

Я прочитал некоторые ссылки для armeabi-v7aи x86архитектуры. Однако в итоге я так и не смог окончательно определить, какие мобильные процессоры и архитектуры относятся armeabi-v7aк x86.

Насколько мне известно, мобильные процессоры, обычно используемые в устройствах Android, — это Snapdragon (от Qualcomm), MediaTek, Exynos (от Samsung) и Kirin (от Huawei). Почти все бренды объясняют характеристики смартфона, и почти во всех спецификациях указывается, является ли мобильный процессор 64-битным или нет. Стоит ли делать вывод, что 64-битные мобильные процессоры (Snapdragon, MediaTek, Exynos или Kirin) относятся к архитектуре ARM?

РЕДАКТИРОВАТЬ:
Чтобы понять, какая SoC поддерживает armeabi-v7aAndroid apk, а какая SoC поддерживает x86Android apk, я изучил спецификации MediaTek Helio X30и Snapdragon 855. В спецификации Helio X30 говорится, что он поддерживает двухъядерный ARM Cortex-A73 и четырехъядерный ARM Cortex-A53, но ARM нигде не упоминается в спецификации Snapdragon 855. Из этого следует вывод, что Helio X30 будет поддерживать приложения Android и armeabi-v7aSnapdragon 855 не будет поддерживать armeabi-v7aприложения?

Пожалуйста, разъясните мои заблуждения.

Ответы (2)

Вот мои неполные краткие заметки по этому вопросу, но достаточно, чтобы ответить на ваш вопрос.

НАБОР ИНСТРУКЦИЙ:

Процессоры изготавливаются из полупроводниковых кристаллов, обычно из монокристаллического кремния электронного класса. Они не знают английского или любого другого человеческого языка, они понимают только 0и 1. Таким образом, разработчик процессора сообщает нам, в какой последовательности нулей и единиц мы можем проинструктировать этот конкретный процессор. Этот числовой язык инструкций стандартизирован, так Machine Languageкак набор машинных инструкций называется Instruction Set. Процессор может действовать только с определенным типом (типами) набора инструкций.
Наборы инструкций могут быть 8/16/32/64-битными (определяют, сколько инструкций процессор может обрабатывать одновременно), последние 2 являются распространенными в наши дни.

ЯЗЫКИ НИЗКОГО УРОВНЯ:

Но написание программного кода (инструкций) непосредственно на машинном языке (исполняемом файле) почти невозможно, потому что на написание и отладку достаточно большой программы (которую в наши дни мы можем написать за несколько часов) уйдут годы. Поэтому, чтобы облегчить жизнь программистам, был разработан язык ассемблера, по-прежнему ориентированный на процессор, но относительно простой для понимания. Код, написанный на языке ассемблера, преобразуется в машинный код Assemblerпрограммой, написанной на машинном языке. Оба они называются языками низкого уровня.

ЯЗЫКИ ВЫСОКОГО УРОВНЯ:

Чтобы еще больше сократить человеческие усилия при общении с оборудованием, были разработаны языки высокого уровня, которые не привязаны к определенному набору инструкций (обозначающему определенную архитектуру). Они идентичны человеческим языкам, поэтому их легко писать, понимать, отлаживать и применять к различным архитектурам. Код, написанный на языке высокого уровня, преобразуется в язык низкого уровня с помощью Compilerпрограммы, написанной на языке низкого уровня. Одним из наиболее часто используемых языков высокого уровня является C. Но иногда код предварительно не компилируется в машинный код, а выполняется напрямую (или компилируется во время выполнения) с помощью Interpreter. Java является одним из таких языков «написать один раз, запустить где угодно» (WORA) , который компилируется, byte-codeа затем интерпретируется Virtual Machine- снова скомпилированной программой.

ПРИЛОЖЕНИЕ БИНАРНЫЙ ИНТЕРФЕЙС (ABI):

Поскольку архитектурно-независимая программа (код) может быть преобразована в архитектурно-зависимый код для любого процессора, компилятор обязан позаботиться обо всех требованиях конкретной архитектуры. Это то, что определяет Application Binary Interface (ABI). Проще говоря, ABI представляет собой одну или несколько конкретных архитектур. Дополнительные сведения о встроенных ABI требуют понимания этапов сборки и компиляции; объектный код, Executable and Linkable Format (ELF), статическое (архивирование) и динамическое связывание библиотек и т. д.

Теперь перейдем к вашему вопросу:

ЧТО ТАКОЕ x86И ARM?

x86 — это семейство наборов инструкций, в основном разработанное и производимое компаниями Intel и AMD. ARM — это еще одно семейство, разработанное одной организацией ARM Holdingsи лицензированное многими производителями встраиваемых решений, включая Qualcomm, Mediatek, Samsung и Huawei. Snapdragon, Exynos и Kirin — их торговые марки. Они не являются производителями процессоров, но у них есть лицензии на включение процессоров ARM в свои собственные схемы System on Chip (SoC).

ЧТО ТАКОЕ SoC?

Система на кристалле (SoC) — это небольшая схема, которая включает процессоры вместе с другими компонентами, такими как графический процессор, оперативная память, флэш-память/eMMC (эквивалент жесткого диска или твердотельного накопителя), модуль Wi-Fi и Bluetooth, подключение через USB, UART (последовательные порты), JTAG. (протокол последовательной связи очень низкого уровня), GPS, модемы (для сотовой связи) и, возможно, другие.

ARM ABI:

Хотя большая часть приложений для Android написана на Java, можно программировать на родных языках, таких как C и C++, которые необходимо компилировать. Android предоставляет собственный комплект разработки ( NDK ), включающий (библиотеки, файлы заголовков и) компилятор, который может компилировать код для нескольких ABI, включая armeabi-v7a( armhfв сообществе Linux) и x86.

Приложение Android (Java) само по себе не зависит от архитектуры. В процессе сборки приложения Android SDK преобразует исходный код Java в байт-код ( файлы) , .classа затем компилирует его в исполняемый ( ) файл Dalvik EX.dex , который упакован .apkфайлами. Этот байт-код Dalvik интерпретируется и запускается в отдельном экземпляре Dalvik Virtual Machine/ ARTдля каждого приложения процессом с именем Zygote. Или он может быть постоянно скомпилирован в собственный машинный код ( .odexили .oat) в соответствии с архитектурой устройства во время установки приложения (или позже ). Но если файл apk (zip) дополнительно содержит двоичные файлы/библиотеки ELF, они зависят от архитектуры. Разработчики обычно включают в свои приложения нативные библиотеки для нескольких архитектур.

Собственные приложения/программы/двоичные файлы/исполняемые файлы/библиотеки, созданные с помощью наборов компиляторов ARM Embedded ABI v7a( armeabi-v7a ), могут быть запущены на Application profile of 7th version of ARM processors( Armv7-A ).
Код, скомпилированный с помощью цепочек инструментов , предоставленных другими поставщиками, для той же архитектуры (хотя и с другими именами ABI), также должен работать на устройствах Android.

32-БИТНАЯ ПРОТИВ. 64-БИТ:

Процессор ARM может быть 32-битным или 64-битным. Это зависит от производителей SoC, что они хотят построить со своей встроенной системой, например, Snapdragon может быть 32-битным или 64-битным. 32-разрядные процессоры ARM были улучшены для повышения производительности, и были добавлены новые возможности от версии 2 до версии 7. 64-разрядная поддержка была введена в ARMv8.

Чтобы узнать, является ли устройство 32-битным или 64-битным, вам необходимо проверить спецификации его SoC, а затем его процессора. Например, SoC в Redmi Note 4 — это Qualcomm Snapdragon 625 (MSM 8953) , который содержит процессор Cortex-A53. Из технических характеристик Cortex-53 видно , что он основан на ARMv8архитектуре, которая может обрабатывать 2 типа наборов инструкций: aarch64(который использует Android arm64-v8a ABI) и aarch32(который использует Android armeabi-v7a ABI, т.е. обратно совместим с ARMv7).

Таким образом, он может запускать двоичные файлы/библиотеки, скомпилированные для обоих этих ABI, но не для x86 или armeabi(называемый armel в сообществе Linux; который предназначался для архитектуры ARMv5/v6и был удален в NDK r17).


СВЯЗАННЫЕ: Может ли 64-битное аппаратное устройство запускать 32-битную версию Android?

Боковое примечание: для поддержки 32-битной ARM и 64-битной ARM - Google предписывает поддержку 32-битной ARM на 64-битной ARM как часть документа определения совместимости с Android, начиная с Android 6.0. Любопытно, что CDD для Android 9.0 упоминается armeabiтолько для обратной поддержки.
Начиная с Android 9 поддержка 32-разрядной версии ARM на 64-разрядных устройствах стала необязательной. Пока они его предоставляют, но это изменится, когда новые ядра перестанут поддерживать Aarch32.

Количество аппаратных устройств, использующих x86, никогда не было очень большим. Несколько лет назад у Intel было несколько процессоров x86 (Intel Atom), которые использовались в некоторых планшетах Android (например, Samsung Galaxy Tab 10.3).

Однако эти планшеты так и не достигли больших объемов продаж на рынке. И я не уверен, есть ли на рынке смартфон или планшет x86, которые все еще используют процессор x86.

Однако есть один очень распространенный случай использования, когда вы сталкиваетесь с «устройством x86 Android»: эмуляторы Android, такие как тот, который содержится в Android SDK, или другие эмуляторы, такие как Genymotion, BlueStacks, ...

Поскольку ПК, на котором работает эмулятор, обычно использует ЦП x86, эмуляторы, которые запускают образ x86 (вместо образа на основе ARMv7 или ARMv8/ARM64), могут использовать методы виртуализации, интегрированные в ЦП, что приводит к гораздо более высокой скорости.

Спасибо за подробное объяснение. Я хотел бы взять пример. Если я прав, будь то процессор или SoC, термин x86 связан с Intel и AMD. Я хотел бы взять пример.
Я перешел по ссылке apkmirror.com/apk/mozilla/firefox/firefox-65-0-1-release для загрузки APK-файла Firefox для Android. Я видел там два варианта; Firefox Android apk для архитектуры armeabi-v7a и Firefox Android apk для архитектуры x86. Мое замешательство началось оттуда.
SoC известных Android-устройств — Snapdragon, MediaTek, Exynos, Kirin и т. д. Поэтому, я считаю, мне нужно скачать android apk для ARM. Я прав?
@user741975 user741975 На данный момент, если вы выберете, armeabi-v7aон будет работать с вероятностью более 99%. Если у вас есть текущее устройство среднего или высокого класса, это также arm64-v8aможет быть вариантом. В любом случае, вы можете просто скачать его и попробовать установить. Если архитектура неправильная, установка просто завершится ошибкой.