Bitcode — це проміжне представлення програми на етапі компіляції iOS-додатка. На відміну від машинного коду, Bitcode не прив'язаний до конкретної архітектури процесора. За даними Apple Developer Documentation, App Store здатний перекомпільовувати Bitcode під цільову архітектуру, що підвищує продуктивність і зменшує розмір інсталяційного файлу. Розробник відправляє Bitcode в App Store, а магазин сам генерує оптимізований бінарний файл для кожного типу пристрою.
Головне
Bitcode являє собою проміжне представлення програми (Intermediate Representation, IR), яке генерує інфраструктура компілятора LLVM. Apple впровадила підтримку Bitcode починаючи з Xcode 7 та iOS 9 як обов'язкову вимогу для watchOS-додатків і опційну для iOS та tvOS. З Xcode 14 обов'язковість була скасована для всіх платформ, крім watchOS.
Концепція проміжного представлення коду існує з 2000-х років в рамках проекту LLVM, заснованого Крісом Латтнером в Університеті Іллінойсу. Apple адаптувала LLVM для Xcode у 2011 році, а в 2015 представила Bitcode як спосіб оновлення додатків без повторного відправлення в App Store. Технологія була анонсована на WWDC 2015 в сесії «What's New in Xcode».
Машинний код — це двійкові інструкції для конкретного процесора: arm64, armv7 або x86_64. Bitcode зберігається в апаратно-незалежному форматі, що дозволяє App Store генерувати оптимізовані бінарні файли для різних архітектур з одного вихідного представлення. Ця ключова відмінність визначає всі переваги технології.
| Характеристика | Bitcode | Машинний код |
|---|---|---|
| Залежність від архітектури | Незалежний | Прив'язаний до CPU |
| Розмір бінарного файлу | Компактний | Більший |
| Можливість рекомпіляції | Є | Немає |
| Підтримка App Store | Рекомпілюється | Використовується як є |
| Налагодження | Обмежена | Повна підтримка |
Bitcode не є виконуваним файлом. Це LLVM IR в двійковому форматі, який розробник відправляє в App Store разом з метаданими проекту. Магазин додатків запускає процес рекомпіляції, адаптуючи код під кожну цільову платформу та версію операційної системи.
Процес генерації Bitcode починається з фронтенду компілятора, який перетворює вихідний код Swift або Objective-C в LLVM IR. На етапі лінкування Xcode упаковує IR в файли формату .bc (Bitcode), які потім відправляються в App Store разом з архівом .xcarchive. App Store, у свою чергу, запускає процес рекомпіляції на своєму боці.
Інфраструктура LLVM складається з трьох частин: фронтенду (Clang для C/ObjC, Swift Frontend для Swift), оптимізатора Middle-End та бекенду (генератора машинного коду). Bitcode — це результат перших двох етапів без переходу до генерації асемблерних інструкцій. Middle-End виконує платформонезалежні оптимізації: видалення мертвого коду, інлайнінг та згортання констант.
// Приклад вихідного коду Swift
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR після компіляції (спрощено)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Після генерації IR компілятор виконує серію оптимізацій на рівні представлення: видалення мертвого коду, інлайнінг функцій та згортання констант. Ці оптимізації не залежать від архітектури та зберігаються в Bitcode. Під час рекомпіляції в App Store додаються архітектурно-залежні оптимізації, такі як перестановка інструкцій для конкретного процесора.
App Store Connect приймає архів з Bitcode та запускає власну інфраструктуру компіляції. Система визначає цільову архітектуру пристрою користувача та генерує машинний код, додатково оптимізуючи його під конкретні характеристики процесора. Для arm64e (процесори A12+ та M-серії) застосовуються додаткові оптимізації безпеки.
Цей процес називається App Thinning — технологія, яка дозволяє доставляти на пристрій тільки ті ресурси та код, які необхідні для його архітектури. Користувач iPhone з процесором A17 Pro отримує бінарний файл, оптимізований під arm64e, без зайвих інструкцій для застарілих архітектур. Це скорочує час завантаження та економить місце на пристрої.
Bitcode надає кілька ключових переваг для розробників iOS-додатків. Основна з них — автоматична оптимізація під нові процесори Apple без повторного викладення оновлення в App Store. Це особливо актуально при переході на нові архітектури, такі як перехід з armv7 на arm64.
Коли Apple випускає процесор з новою архітектурою, додатки, відправлені з Bitcode, автоматично перекомпільовуються під неї. Розробнику не потрібно збирати проект заново та публікувати оновлення — App Store робить це на своєму боці при першому завантаженні користувачем. Це особливо важливо для довгоживучих додатків, які підтримуються роками.
App Thinning в поєднанні з Bitcode дозволяє скоротити розмір встановленого додатка на 15-40%. App Store генерує тільки ті машинні інструкції, які потрібні конкретному пристрою, виключаючи код для інших архітектур та варіації для різних версій iOS. На практиці це означає, що користувач з новим iPhone отримує компактний бінарний файл.
За даними Apple WWDC 2015 Session 102, використання Bitcode та App Thinning може зменшити розмір завантажуваного додатка в середньому на 25% порівняно з універсальним бінарним файлом, що містить всі архітектури. Для додатка розміром 100 МБ економія може скласти до 40 МБ на пристрої користувача.
Налаштування Bitcode виконується в конфігурації збірки Xcode. Параметр Enable Bitcode знаходиться в налаштуваннях Build Settings і за замовчуванням увімкнений для нових проектів, але розробники можуть вимкнути його для налагодження або при використанні сторонніх бібліотек без підтримки Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Або через Info.plist для окремих таргетів
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Перевірка статусу Bitcode в конфігурації
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Для перевірки, чи містить архів Bitcode, відкрийте файл .xcarchive через Xcode Organizer або виконайте команду otool -l в Терміналі. Наявність секції __LLVM в бінарному файлі підтверджує, що Bitcode увімкнений та упакований коректно. Якщо секція відсутня — Bitcode не був згенерований під час збірки.
# Перевірка наявності Bitcode в архіві
otool -l YourApp.app/YourApp | grep __LLVM
# Вивід: якщо є секція __LLVM — Bitcode присутній
# Якщо вивід порожній — Bitcode не увімкнений або не згенерований
# Також можна перевірити через команду size
size -m -l YourApp.app/YourApp | grep __LLVM
При використанні сторонніх бібліотек через CocoaPods або SPM переконайтеся, що всі залежності зібрані з Bitcode. Якщо хоча б одна бібліотека не підтримує Bitcode, Xcode згенерує помилку лінкування на етапі архівації. Для CocoaPods перевірте прапорець bitcode_enabled в підспеках або використовуйте use_frameworks! з enable_bitcode.
Bitcode не є універсальним рішенням для всіх типів iOS-проектів. У технології є обмеження, які розробнику важливо враховувати до вмикання опції в конфігурації збірки. Розуміння цих обмежень допомагає уникнути проблем на етапі архівації та публікації.
Не всі сторонні бібліотеки постачаються з підтримкою Bitcode. Якщо бібліотека поширюється тільки у вигляді скомпільованого бінарного файлу без Bitcode, проект з увімкненою опцією не збереться. У цьому випадку розробнику доведеться або вимкнути Bitcode, або запитати у постачальника версію з Bitcode. Це особливо актуально для старих бібліотек, які більше не оновлюються.
Креш-репорти з додатків, зібраних з Bitcode, потребують додаткової обробки. Символи (dSYM) для перекомпільованого коду генеруються App Store та доступні для завантаження через Xcode Organizer. Без завантаження відповідних dSYM-файлів стек викликів у звітах про збої буде нечитабельним, що ускладнює діагностику проблем.
По стану на iOS 17 та Xcode 15 Apple не вимагає обов'язкового вмикання Bitcode для публікації в App Store. Однак для watchOS-додатків Bitcode залишається обов'язковою вимогою на рівні правил App Store Connect. Розробникам рекомендується вмикати Bitcode для нових проектів, якщо всі залежності його підтримують.
Часто задавані питання
Для iOS та tvOS-додатків Bitcode не є обов'язковим починаючи з Xcode 14. Для watchOS підтримка Bitcode залишається обов'язковою. Apple рекомендує вмикати Bitcode для нових проектів, але не блокує публікацію без нього.
Bitcode дозволяє App Store застосовувати App Thinning — генерацію машинного коду тільки під архітектуру пристрою користувача. Це скорочує розмір завантажуваного бінарного файлу на 15-40% залежно від кількості підтримуваних архітектур в проекті.
Так, dSYM-файли необхідні для символізації креш-репортів з перекомпільованих бінарних файлів. App Store надає можливість завантажити dSYM через Xcode Organizer після обробки архіву. Без них стек викликів в Crashlytics та консолі буде містити тільки адреси пам'яті.
SPM підтримує Bitcode, якщо залежності поширюються у вихідному коді, а не у вигляді бінарних файлів. Бінарні залежності через SPM повинні надавати версію з Bitcode, інакше проект з увімкненою опцією не скомпілюється.
Bitcode — це апаратно-незалежне проміжне представлення LLVM IR, яке не може виконуватися безпосередньо процесором. Машинний код містить готові інструкції для конкретної архітектури (arm64, x86_64) та виконується без додаткової компіляції.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також