Даніель Кеннет

Розробник какао, будівельник Lego, власник моделі залізниці.

iKenndac щодо більшості послуг, про які ви хотіли б згадати.

8 лютого 2015 року

Видалення небажаних архітектур із динамічних бібліотек у Xcode

З моменту анонсу iOS 8 розробники змогли скористатися перевагами динамічних бібліотек для розробки iOS.

Для загального розвитку чудово мати єдину динамічну бібліотеку для всіх необхідних архітектур, щоб ви могли працювати на всіх своїх пристроях та iOS Simulator, не змінюючи нічого.

У своєму проекті та його різноманітних розширеннях я використовую Reactive Cocoa і маю його у своєму проекті як попередньо скомпільовану динамічну бібліотеку зі зрізами i386 та x86_64 для симулятора та armv7 та arm64 для пристроїв.

Однак у цього підходу є один недолік - оскільки вони пов’язані під час виконання, коли динамічна бібліотека компілюється окремо від програми, в якій вона потрапляє, неможливо визначити, які архітектури насправді будуть потрібні. Таким чином, Xcode просто копіює все це у ваш пакет додатків під час компіляції. Окрім втраченого простору на диску, теоретично цього немає реального недоліку. Однак на практиці iTunes Connect не любить, як ми додаємо невикористані двійкові фрагменти:

деніел

Отже, як нам обійти це?

Натомість ми могли б використовувати статичні бібліотеки. Однак з кількома цілями та розширеннями в моєму проекті здається безглуздим роздувати всі мої виконувані файли копіями одних і тих же бібліотек.

Ми могли б кожного разу компілювати бібліотеку з джерела, створюючи нову динамічну бібліотеку, що містить лише необхідні архітектури для кожної збірки. Кілька речей мене турбують з цього приводу - по-перше, видається марним постійно перекомпілювати весь цей незмінний код, а друге полягає в тому, що я люблю тримати свої залежності статичними, а створення нових збірок кожного разу означає, що я не обов'язково більше запускає стабільний код, особливо якщо я починаю обдурювати бета-версії Xcode. Що робити, якщо зміна компілятора спричиняє непарні помилки в бібліотеці? Це трапляється дуже рідко, але це трапляється, і я не знаю кодової бази бібліотеки настільки добре, щоб її налагодити.

Якщо у нас немає джерела для початку, ну, нам якось не пощастило.

Ми могли б зрозуміти, як з цим боротися під час побудови, тоді більше ніколи не думати про це. Це звучить більше як це!

Ті, хто може, роблять. Хто не може, пишіть сценарії оболонки

Сьогодні я підготував невеликий сценарій для розробки, щоб розібратися з цим, тому мені ніколи більше не доведеться про це піклуватися.

У моїй папці проекту:

Після натискання кнопки "build":

Без зайвих сумнівів, ось сценарій. Додайте a Запустіть сценарій крок до кроків побудови, поставте його після кроку для вбудування фреймворків, встановіть його на використання/bin/sh і введіть наступний сценарій:

Сценарій перегляне папку Frameworks вашого вбудованого додатка та переконається, що в кожній Framework присутня лише архітектура, яку ви створюєте.

Набагато краще! Тепер я можу кинути на свій проект жирні динамічні бібліотеки, які містять усі архітектури, які мені коли-небудь знадобляться, і мій процес побудови буде вирішувати, які архітектури підходять у будь-який момент.