2016-02-23 5 views
7

Из того, что я понял, bitcode позволяет создавать двоичные файлы с промежуточным двоичным форматом. Таким образом, это шаг перед компиляцией архитектуры ARM или x64.Возможно ли создать универсальную инфраструктуру iOS с использованием битового кода?

Возможно создание «реального» файла .framework для iOS с iOS 8. Однако файлы фреймворка скомпилированы только для одной архитектуры по умолчанию (эмулятор, iPhone). Когда кто-то хочет распространять файл .framework, лучше предоставить файл, совместимый с эмулятором iOS, а также можно установить на iPhone. Можно найти различные примеры скриптов для создания такого жирного файла, используя lipo.

Однако, возможно ли распространять только .framework, скомпилированные в виде битового кода, без необходимости создания жирного файла с различными архитектурами?

К сожалению, даже с битовым код включен для моего .framework:

  • различных файлов по умолчанию создаются в соответствии с целевой архитектурой
  • даже если в меню «архив», кажется, должны быть включено для рамочной цели, Я не могу найти результат, даже на мой взгляд Организатора

ли я неправильно что-то в концепции битового кода, или я что-то пропустила?

ответ

7

Вам необходимо предоставить универсальный плоский каркас. Что создано lipo.

  • Включение битового кода, Targets->Build Setting->Enable Bitcode к Yes
  • Добавить цель сборки для создания универсальной основы

    Создать Aggregate цель и скопировать следующий сценарий к Build Phrase -> Run Script:

 

    ###################### 
    # Options 
    ###################### 

    #verbose 
    set -x 

    REVEAL_ARCHIVE_IN_FINDER=false 

    FRAMEWORK_NAME="${PROJECT_NAME}" 

    SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework" 

    DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework" 

    UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal" 

    FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework" 


    ###################### 
    # Build Frameworks 
    ###################### 
    # Build for simulator 
    xcodebuild -target ${PROJECT_NAME} -sdk iphonesimulator -configuration ${CONFIGURATION} ARCHS="i386 x86_64" ONLY_ACTIVE_ARCH=NO clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator 
    # Build for device 
    xcodebuild -scheme ${PROJECT_NAME} -sdk iphoneos -configuration ${CONFIGURATION} ARCHS="armv7 armv7s arm64" ONLY_ACTIVE_ARCH=NO clean archive CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos 

    ###################### 
    # Create directory for universal 
    ###################### 

    rm -rf "${UNIVERSAL_LIBRARY_DIR}" 

    mkdir "${UNIVERSAL_LIBRARY_DIR}" 

    mkdir "${FRAMEWORK}" 


    ###################### 
    # Copy files Framework 
    ###################### 

    cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}" 


    ###################### 
    # Make an universal binary 
    ###################### 

    lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${FRAMEWORK}/${FRAMEWORK_NAME}" | echo 

    # For Swift framework, Swiftmodule needs to be copied in the universal framework 
    if [ -d "${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then 
    cp -f ${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo 
    fi 

    if [ -d "${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then 
    cp -f ${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo 
    fi 

    ###################### 
    # On Release, copy the result to release directory 
    ###################### 
    OUTPUT_DIR="${PROJECT_DIR}/build/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/" 

    rm -rf "$OUTPUT_DIR" 
    mkdir -p "$OUTPUT_DIR" 

    cp -r "${FRAMEWORK}" "$OUTPUT_DIR" 

    if [ ${REVEAL_ARCHIVE_IN_FINDER} = true ]; then 
    open "${OUTPUT_DIR}/" 
    fi 

Примечание

  • битовый код только упаковывается на archive сборок для iphoneos SDk

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVM проверить, включен ли битовый код, если не указан параметр arch, не будет никакого __LLVM, так как otool просто распечатать одну архитектуру хоста (симулятор).

+1

Пожалуйста, прочитайте снова вопрос. Это именно то, чего я хотел бы избежать (я упомянул «липо» в моем вопросе). Я не понимаю цели компиляции чего-то в качестве битового кода, если мне все равно нужно создать универсальный двоичный код. И я не могу найти файл фрейма, созданный с помощью сборки 'archive'. –

+0

bitcode - это промежуточный LLVM IR, скомпилированный Xcode и зависящий от архитектуры, а не как java-байт-код, поэтому каждому фрагменту нужен свой собственный раздел биткода. Поскольку это промежуточный код, так что яблоко может использовать его для оптимизации до конечного машинного кода в будущем без загрузки новой версии, это основная цель. – xfdai

+0

И фреймворк, созданный с помощью 'archive' из сценария, находится на' $ {DEVICE_LIBRARY_PATH}/Модули/$ {FRAMEWORK_NAME} ' см. [Здесь] (https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#// apple_ref/doc/uid/TP40003931-CH3-SW39) – xfdai

Смежные вопросы