2016-02-23 13 views
7

Z tego co zrozumiałem, bitcode pozwala na generowanie plików binarnych z pośrednim formatem binarnym. Jest to więc krok przed skompilowaniem do architektury ARM lub x64.Czy można utworzyć uniwersalny framework iOS za pomocą bitcode?

Możliwe jest utworzenie "prawdziwego" pliku .framework dla systemu iOS od wersji iOS 8. Pliki szkieletowe są jednak kompilowane domyślnie tylko dla jednej architektury (emulator, iPhone). Gdy chce się rozpowszechniać plik .framework, lepiej jest dostarczyć plik zgodny z emulatorem iOS, a także można go wdrożyć na iPhonie. Można znaleźć różne przykłady skryptów, aby utworzyć taki gruby plik za pomocą lipo.

Czy możliwe jest jednak rozpowszechnianie tylko pliku .framework skompilowanego jako bitcod, bez konieczności tworzenia grubego pliku z różnymi architekturami?

Niestety, nawet z bitcode włączona do mojego .framework:

  • różne pliki są domyślnie tworzone w zależności od docelowej architektury
  • nawet jeśli menu „Archiwum” wydaje się być włączona cel ramowej nie mogę znaleźć wynik, nawet moim zdaniem Organizatora

czy rozumieją coś w pojęciu bitcode, czy brakuje czegoś?

Odpowiedz

7

Potrzebujesz uniwersalnego płaskiego szkieletu. Który jest tworzony przez lipo.

  • Włącz Bitcode, Targets->Build Setting->Enable Bitcode do Yes
  • Dodaj cel build do stworzenia uniwersalnej ramy

    Tworzenie Aggregate cel i skopiuj poniższy skrypt do 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 

nocie

  • bitcode pakowany jest tylko na archive budowania iPhoneOS SDK

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVM sprawdzić czy bitcode jest wliczone, jeśli nie określono parametru arch, nie będzie __LLVM, ponieważ właśnie otool wydrukuj jeden host arch (symulator).

+1

Proszę ponownie przeczytać pytanie. Dokładnie tego chciałbym uniknąć (wspomniałem o "lipo" w moim pytaniu). Nie rozumiem celu, jakim jest skompilowanie czegoś w postaci bitu, jeśli i tak muszę utworzyć uniwersalny plik binarny. I nie mogę znaleźć pliku szkieletu utworzonego za pomocą kompilacji 'archive'. –

+0

Bitcode jest pośrednim LLVM IR skompilowanym przez Xcode, i jest zależne od architektury, a nie jak kod bajtowy Java, więc każdy kawałek potrzebuje własnej sekcji bitcodowej. Ponieważ jest to kod pośredni, więc Apple może go użyć do optymalizacji do ostatecznego kodu maszynowego w przyszłości bez przesłania nowej wersji, to jest główny cel – xfdai

+0

A framework stworzony z 'archive' ze skryptu jest na' $ {DEVICE_LIBRARY_PATH}/Moduły/$ {FRAMEWORK_NAME} ' zobacz [tutaj] (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

Powiązane problemy