Розуміння архітектури процесора Android (ABI): Чому arm64-v8a, armeabi-v7a та x86 важливі

Diagram showing one app bundle splitting into arm64-v8a, armeabi-v7a, and x86 architecture-specific APKs

Якщо ви коли-небудь об’єднували набір розділених файлів APK і спостерігали, як ваш телефон повідомляє про те, що програма не встановлена, або, що ще гірше, спостерігали, як вона встановлюється нормально, а потім вилітає з ладу, коли ви торкаєтеся значка, є пристойна ймовірність, що справжня проблема не мала нічого спільного з пошкодженим завантаженням. Майже напевно це було пов’язано з архітектурою: невідповідність між ЦП, на якому працює ваш телефон, і ЦП, для якого скомпільовано рідний код програми. Більшості користувачів Android ніколи не доводиться думати про це, аж до моменту, коли він непомітно щось ламає, а потім це швидко стає актуальним. Ось що означає архітектура ЦП для APK, чому один додаток у Play Store таємно постачається як кілька різних збірок і як перевірити сумісність перед тим, як щось інсталювати.

Що таке ABI

ABI означає бінарний інтерфейс програми. З практичної точки зору, це набір інструкцій, який розуміє чіп — формат необробленого машинного коду, який процесор може виконувати безпосередньо. Більшість програм для Android, частини, написані на Java або Kotlin, компілюються в байт-код, який виконується в середовищі виконання Android (ART), і ART особливо не хвилює, на якому чіпі вона знаходиться. Цей рівень не залежить від архітектури, тому програми Android зазвичай «просто працюють» на такому широкому діапазоні обладнання.

Рідний код – це інша історія. Багато додатків, особливо ігор, додатків для камери, інструментів машинного навчання та будь-якого іншого, що виконує важку обробку аудіо чи відео, надсилають рідні бібліотеки, написані на C або C++, через Android NDK. Ці бібліотеки заздалегідь скомпільовані в машинний код для одного конкретного набору інструкцій, і мікросхема, створена для одного набору інструкцій, зазвичай не може виконувати машинний код, написаний для іншого. Це вся причина існування ABI як щось варте розуміння: у той момент, коли програма включає хоча б одну власну бібліотеку .so, її сумісність стає пов’язаною з архітектурою, для якої була створена бібліотека.

Архітектури, на які ви зіткнетеся

Раніше в цьому просторі було більше різноманітності (пам’ятаєте звичайний armeabi або MIPS?), але до 2026 року поле звузилося до чотирьох ABI, про які варто знати:

ABIШирина бітаТипові пристроїПримітки
arm64-v8a64-бітна ARMПрактично кожен телефон, проданий приблизно з 2019 рокуЦіль за умовчанням для нових програм; Google уже кілька років вимагає підтримки 64-розрядної версії для нових додатків у Play Store.
armeabi-v7a32-розрядний ARMСтаріші або бюджетні пристрої, деякі недорогі телефони все ще продаються на ринках, що розвиваютьсяДосі постачається багатьма програмами для зворотної сумісності, хоча більшість активних пристроїв більше не потребують.
x8632-розрядний IntelСтарі планшети на базі Intel, застарілі емуляториПереважно застарілі; сьогодні ви рідко зустрінете справжній 32-розрядний телефон x86.
x86_6464-розрядний IntelДеякі Chromebook, настільні емулятори Android, кілька планшетів x86Важливо, якщо ви тестуєте програми в емуляторі, як-от Android Studio AVD на базі x86, або в певних збірках BlueStacks.

Якщо ви тримаєте в руках телефон, куплений будь-коли за останні п’ять-шість років, це майже напевно arm64-v8a. Винятками, про які варто пам’ятати, є емулятори та комп’ютери Chromebook, які натомість часто працюють на x86_64, оскільки це відповідає базовому процесору ноутбука чи настільного ПК.

Чому програми взагалі турбуються надсиланням кількох збірок

Одне очевидне питання полягає в тому, чому розробники просто не запихають рідні бібліотеки кожної архітектури в один APK і не покінчать із цим. Деякі програми роблять саме це, і це називається універсальним або «жирним» APK. Недоліком є ​​розмір. Розмір гри з вбудованими бібліотеками для arm64-v8a, armeabi-v7a, x86 і x86_64 може легко подвоїтися або потроїтися порівняно з збіркою, яка містить лише ту архітектуру, яка потрібна вашому пристрою. Помножте це на мільйони встановлень, і ви побачите справді значну кількість марнотратної смуги пропускання та пам’яті для коду, який ніколи не запуститься на цьому пристрої.

Щоб уникнути цього марнотратства, Google Play і формат Android App Bundle розбивають програму на невеликий базовий APK плюс ряд конфігураційних APK, один з яких присвячений архітектурі. Коли ваш телефон запитує програму, Play Store доставляє базовий APK разом із лише розділенням архітектури, яке відповідає вашому чіпу, разом із відповідними розділеннями щільності екрана та мови. У кінцевому підсумку ви отримуєте інсталяцію, яка веде себе як окрема програма, але збирається з кількох спеціально створених частин за лаштунками.

Як розділені APK і пакети додатків використовують це

Якщо ви коли-небудь відкривали пакет .apks або .xapk і помічали назви файлів, як-от split_config.arm64_v8a.apk, split_config.armeabi_v7a.apk, split_config.xxhdpi.apk і split_config.en.apk, розташовані поруч із base.apk, це саме ця система в дії, просто експортована як набір файлів, а не доставлена ​​мовчки Play Store. Розділення за щільністю та мовою зазвичай безпечно встановлювати без розбору, оскільки телефон просто ігноруватиме ресурси, які йому не потрібні. Розподіл архітектури інший: установіть неправильну або не встановіть відповідну, і ви зіткнетеся зі справжніми проблемами.

Коли ви використовуєте конвертер для об’єднання розділеного пакета назад в єдиний інстальований APK, процес злиття має вибрати, які розділи архітектури згорнути. Хороший конвертер зберігає кожне розділення архітектури, яке є справді корисним, або дозволяє вам вибрати, а не мовчки зберігати лише один і сподіватися, що він підходить для вашого пристрою.

Що відбувається, коли архітектура не збігається

Варто розрізняти два різних режими збою, оскільки вони виглядають і відчуваються по-різному для звичайного користувача.

По-перше, повна помилка встановлення. Якщо програму майже повністю побудовано на нативному коді без значущої резервної копії, менеджер пакунків Android взагалі відмовиться встановлювати її, зазвичай виявляючи помилку на зразок INSTALL_FAILED_NO_MATCHING_ABIS. Ви ніколи не зможете навіть відкрити програму; монтажник зупиняє вас біля дверей.

Другий, більш неприємний результат – це мовчазний частковий успіх. Якщо програма має точку входу Java або Kotlin, яка нормально завантажується самостійно, але потім намагається викликати рідну бібліотеку, якої просто немає для вашої архітектури, встановлення завершується нормально. Усе виглядає добре, доки ви не торкнетеся значка, після чого програма майже миттєво аварійно завершує роботу, часто з UnsatisfiedLinkError, похованим у журналах. Це класична історія «Я конвертував його, він встановив, потім він просто миттєво закривається», і це майже завжди проблема архітектури, а не пошкоджений файл.

Diagram comparing a matching arm64 APK that installs and runs successfully against an x86-only APK that fails to install on an arm64 phone with error INSTALL_FAILED_NO_MATCHING_ABIS

Як перевірити архітектуру власного телефону

Для переважної більшості людей це просто: якщо ваш телефон випущений у 2019 році чи пізніший, припустіть arm64-v8a та рухайтеся далі. Якщо ви хочете бути впевненими або маєте справу зі старим або незвичайним пристроєм, кілька практичних варіантів:

Як перевірити, які архітектури підтримує APK

Перш ніж установлювати файл із-за меж Play Store, варто перевірити, що в ньому міститься, а не гадати. Власні бібліотеки APK знаходяться в папках, названих за їхньою архітектурою в каталозі lib/, наприклад lib/arm64-v8a/ або lib/armeabi-v7a/. Будь-який інструмент, який може перевірити внутрішню структуру APK, може точно сказати вам, які з цих папок присутні, що точно скаже вам, на яких пристроях запускатиметься файл.

Перевірте перед встановленням

Наш Інструмент APK Info читає внутрішню папку lib/ файлу APK і перераховує всі архітектури, для яких він був створений, тож ви можете підтвердити сумісність, перш ніж щось завантажувати. Коли ви конвертуєте розділений пакет за допомогою нашого Конвертер XAPK в APK, ми також автоматично показуємо це після кожного перетворення, перераховуючи архітектури, знайдені в об’єднаному файлі, і позначаємо це, коли в збірці бракує фрагмента, який потрібен би звичайним пристроям.

Універсальний APK проти Single-ABI APK: який краще використовувати?

ПараметрУніверсальний / жирний APKAPK з одним ABI
Розмір файлуБільші, іноді в 2-4 разиМаленький, містить лише те, що потрібно вашому пристрою
СумісністьПрацює практично на будь-якому пристроїПрацює лише на відповідній архітектурі
Найкраще дляСпільний доступ до одного файлу, який має працювати всюди, невпевнені одержувачіВаш власний пристрій, коли ви вже знаєте його архітектуру
РизикДуже низький ризик невідповідності ABIВиникне збій або збій, якщо ви виберете неправильний

Поширені помилки, які люди роблять із розділеними пакетами

Ключові висновки

  • ABI — це набір інструкцій, який розуміє чіп; це має значення лише для програм, які включають власний код (C/C++).
  • arm64-v8a покриває майже кожен сучасний телефон; armeabi-v7a для старих пристроїв; x86/x86_64 здебільшого відображаються в емуляторах і Chromebook.
  • Програми зазвичай поділяються за архітектурою, щоб уникнути надсилання непотрібного рідного коду на кожен пристрій.
  • Невідповідна архітектура або відразу блокує встановлення, або викликає негайний збій після, здавалося б, успішного встановлення.
  • Ви можете перевірити як архітектуру свого пристрою, так і підтримувані архітектури APK, перш ніж щось інсталювати, повністю уникаючи припущень.

Часті запитання (FAQ)

Чи потрібно мені знати архітектуру свого телефону, щоб установити звичайну програму Play Store?

Ні. Play Store автоматично виявляє ваш пристрій і надає лише відповідну архітектуру, тому це стає актуальним лише тоді, коли ви завантажуєте файли .apk не з Play Store.

Чи може один APK підтримувати декілька архітектур одночасно?

так Універсальний або жирний APK об’єднує рідні бібліотеки для кожної підтримуваної архітектури в одному файлі. Він більший, але його можна встановити на будь-який сумісний пристрій незалежно від чіпа.

Чому мій перетворений файл .apk інсталювався, але потім одразу завершився збій?

Зазвичай це трапляється, коли програма має невелику кількість коду Java, який нормально встановлюється, але потім намагається завантажити рідну бібліотеку, яка не була включена в архітектуру вашого пристрою, викидаючи помилку UnsatisfiedLinkError під час виконання.

Чи arm64-v8a зворотно сумісний із програмами armeabi-v7a?

Загалом так. Більшість чіпів arm64-v8a також можуть виконувати 32-розрядні інструкції ARM, тому APK, призначений тільки для armeabi-v7a, зазвичай все ще працюватиме на сучасному телефоні arm64, а не навпаки.

Чи будуть доступні Android-пристрої x86 у 2026 році?

Сьогодні вони рідко зустрічаються в телефонах, але ви все одно знайдете x86 або x86_64 у деяких старих планшетах на базі Intel, кількох комп’ютерах Chromebook із програмами Android і більшості емуляторів Android для настільних ПК.

Вам не потрібно запам'ятовувати нічого з цього. Коротка версія: сучасні телефони майже завжди arm64-v8a, програми поділяються за архітектурою для економії місця, і якщо щось відмовляється встановлюватися або виходить з ладу відразу після відкриття, невідповідність архітектури є однією з перших речей, які варто виключити, перш ніж припускати, що сам файл зламаний.

Розроблено та задокументовано Mst Shaefale Провідний розробник і архітектор пакетів Android • Перевірено на Android 12–15

Mst Shaefale підтримує злиття XAPK/APKS на стороні клієнта, аналізатор бінарних маніфестів та інструменти підписання APK v1+v2 у xapktoapk.com. Помітили застарілу команду чи зміну ОС? Надіслати редакційну примітку.