2016-02-23 45 views
7

Da quello che ho capito, il codice consente di generare binari con un formato binario intermedio. Quindi è il passo prima della compilazione su un'architettura ARM o x64.È possibile creare un framework iOS universale usando il bitcode?

È possibile creare il file "reale" .framework per iOS a partire da iOS 8. Tuttavia, i file di framework sono compilati per una sola architettura per impostazione predefinita (emulatore, iPhone). Quando si vuole distribuire un file .framework, è meglio fornire un file compatibile con l'emulatore iOS e anche dispiegabile su un iPhone. Diversi esempi di script possono essere trovati per creare un file così grasso usando lipo.

Tuttavia, sarebbe possibile distribuire solo un .framework compilato come bitcode senza dover creare un file grasso con architetture diverse?

Purtroppo, anche con codice binario che ha permesso per la mia .framework:

  • diversi file vengono creati per impostazione predefinita secondo l'architettura mirata
  • anche se il menu "archivio" sembra essere attivato per un obiettivo quadro, non riesco a trovare il risultato, anche a mio avviso Organizer

faccio a fraintendere qualcosa nel concetto di codice binario che , o mi manca qualcosa?

risposta

7

È necessario fornire una struttura piatta universale. Che viene creato da lipo.

  • Attiva codice binario che, Targets->Build Setting->Enable Bitcode-Yes
  • Add build target per creare quadro universale

    Creare un obiettivo Aggregate e copiare seguente script per 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 

Nota

  • codice binario che è pieno solo su archive generazione per iPhoneOS SDK

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVM per verificare se codice binario che è incluso, se non si specifica il parametro arch, non ci sarà alcun __LLVM, dal momento che solo otool stampare un host arch (simulatore).

+1

Leggere di nuovo la domanda. È esattamente quello che vorrei evitare (ho menzionato 'lipo' nella mia domanda). Non capisco lo scopo di compilare qualcosa come bitcode se ho comunque bisogno di creare un binario universale. E non riesco a trovare il file framework creato con la build 'archive'. –

+0

bitcode è un LLVM IR intermedio compilato da Xcode, ed è dipendente dall'architettura, non come il codice bytec di java, quindi ogni sezione ha bisogno della propria sezione di bitcode. Poiché si tratta di un codice intermedio, quindi Apple può utilizzarlo per ottimizzare il codice macchina finale in futuro senza caricare una nuova versione, questo è lo scopo principale – xfdai

+0

E il framework creato con 'archive' dallo script è su' $ {DEVICE_LIBRARY_PATH}/Moduli/$ {FRAMEWORK_NAME} ' vedere [qui] (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