Что делает bitcode_strip (xcrun)?

Добавив TwilioVideo как зависимость от Pods в моем проекте iOS, я понял, что его размер значительно увеличился (+100 Mo).

После некоторых исследований я нашел этот поток и особенно это сообщение, которое советует удалять битовый код с помощью этой команды через Podfile.

Я мало что знал о биткоде, пока не нашел эту замечательную статью об этом: https://lowlevelbits.org/bitcode-demystified/

Теперь я понимаю, что такое битовый код и почему Apple запрашивает его, а также как они используют его для перекомпиляции приложений, если они этого хотят. Тем не менее, я до сих пор не понимаю, что это за операция "раздели битовый код", поэтому я ищу информацию об этом (на самом деле она работала хорошо, поскольку после добавления этих строк в мой Podfile мое приложение теперь "только" на 30 Мо больше).

Спасибо за вашу помощь.

1 ответ

Решение

Вот справочная страница для bitcode_strip

удалить или оставить сегмент битового кода в файле Mach-O

bitcode_strip input [ -r | -m | -l ] -o output

Что такое файл Mach-O?

Mach-O - это формат файлов для исполняемых файлов, объектного кода, общих библиотек, динамически загружаемого кода и дампов ядра.

Mach-O также находится там, где хранятся исполняемые файлы iOS и OS X, а также битовый код.

Вот справочная страница для xcrun

запустить или найти инструменты разработки

xcrun [-sdk SDK] -find <tool_name>

Насколько я понимаю, после прочтения ссылок, которые вы прикрепили, битовый код является промежуточным этапом в процессе компиляции. Если вы отправите свой исходный код в Apple самостоятельно, в конечном итоге в каждом приложении Apple появятся разные версии объектного кода, соответствующие количеству разных типов процессоров, на которых могут работать OS X и iOS (более 4 разных типов). Теперь Apple может скомпилировать ваш исходный код почти полностью в минимальную форму, называемую bitcode, в которой нет багажа, связанного с тем, на каком процессоре он будет работать.

Большая часть пути: он выполняет лексер, синтаксический анализатор, семантический анализ и генерацию кода частей компилятора, который специфичен для вашего исходного кода.

Остальная часть пути: специфичные для машины вещи, такие как оптимизация, сборка и связывание, которые отличаются на iPhone, например, от macbook

Если вы отправите битовый код в магазин приложений, гораздо проще завершить его компиляцию в разные окончательные формы для разных типов процессоров. Похоже, ваша проблема заключалась в том, что битовый код в вашем проекте оказался довольно большим файлом (это произошло из-за того, что Twilio добавил поддержку битового кода). "Удаление" битового кода в основном удаляло битовый код из вашего проекта (удаляет сегмент битового кода из вашего файла Mach-O), позволяя ему соответствовать вашим ограничениям по размеру. Недостатком является то, что у яблока не будет битового кода, у него будет только двоичный файл (и он не сможет перекомпилировать).

Давайте разберем код, который вы указали на github:

source 'https://github.com/twilio/cocoapod-specs'

target 'ObjCVideoQuickstart' do
  pod 'TwilioVideo', '1.0.0-beta14'
end

post_install do |installer|
  # Find bitcode_strip
  bitcode_strip_path = `xcrun -sdk iphoneos --find bitcode_strip`.chop!

  # Find path to TwilioVideo dependency
  path = Dir.pwd
  framework_path = "#{path}/Pods/TwilioVideo/TwilioVideo.framework/TwilioVideo"

  # Strip Bitcode sections from the framework
  strip_command = "#{bitcode_strip_path} #{framework_path} -m -o #{framework_path}" 
  puts "About to strip: #{strip_command}"
  system(strip_command)
end

1.

bitcode_strip_path = `xcrun -sdk iphoneos --find bitcode_strip`.chop!

Находит bitcode_strip инструмент в вашей установке XCode (прочитайте man-страницу, связанную выше для xcrun)

2.

framework_path = "#{path}/Pods/TwilioVideo/TwilioVideo.framework/TwilioVideo"

Находит каркас, из которого вы хотите удалить битовый код

3.

strip_command = "#{bitcode_strip_path} #{framework_path} -m -o #{framework_path}" 
puts "About to strip: #{strip_command}"
system(strip_command)

Создает и выполняет команду для фактического удаления раздела битового кода из исполняемого файла Mach-O. -m указан для удаления (см. связанную страницу man для bitcode_strip)

обратите внимание: использование решения, предоставленного этим сотрудником twilio (или других подобных решений), может оказаться неоправданным, так как битовый код может стать обязательным в магазине приложений

Для получения дополнительной информации, посмотрите на "прореживание приложения"

Другие вопросы по тегам