2016-02-23 16 views
7

Từ những gì tôi đã hiểu, bitcode cho phép tạo các tệp nhị phân có định dạng nhị phân trung gian. Vì vậy, đó là bước trước khi biên dịch kiến ​​trúc ARM hoặc x64.Có thể tạo một khung công tác iOS phổ dụng bằng bitcode không?

Có thể tạo tệp "thực" .framework cho iOS từ iOS 8. Tuy nhiên, các tệp khuôn khổ được biên dịch cho chỉ một kiến ​​trúc theo mặc định (trình mô phỏng, iPhone). Khi muốn phân phối tệp .framework, tốt hơn là nên cung cấp tệp tương thích với trình mô phỏng iOS và cũng có thể triển khai cho iPhone. Có thể tìm thấy các ví dụ khác về tập lệnh để tạo một tệp chất béo như vậy bằng cách sử dụng lipo.

Tuy nhiên, sẽ chỉ có thể phân phối .framework được biên dịch dưới dạng bitcode mà không phải tạo tệp chất béo với các kiến ​​trúc khác nhau?

Thật không may, ngay cả với bitcode kích hoạt cho .framework tôi:

  • tập tin khác nhau được tạo ra theo mặc định theo kiến ​​trúc nhắm mục tiêu
  • ngay cả khi "archive" đơn dường như được kích hoạt cho một mục tiêu khuôn khổ, Tôi không thể tìm thấy kết quả, ngay cả trong chế độ xem Tổ chức của tôi

Tôi có hiểu nhầm điều gì đó trong khái niệm bitcode hay không?

Trả lời

7

Bạn cần cung cấp một khung phẳng chung. Được tạo bởi lipo.

  • Enable Bitcode, Targets->Build Setting->Enable Bitcode-Yes
  • Add xây dựng mục tiêu để tạo ra khuôn khổ phổ

    Tạo một mục tiêu Aggregate và sao chép sau kịch bản để 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 

Note

  • bitcode chỉ đóng gói trên archive xây dựng cho iphoneos SDK

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVM để kiểm tra xem bitcode được bao gồm, nếu bạn không chỉ định tham số arch, sẽ không có __LLVM, vì otool chỉ in một máy chủ lưu trữ (mô phỏng).

+1

Vui lòng đọc lại câu hỏi. Đó là chính xác những gì tôi muốn tránh (tôi đã đề cập đến 'lipo' trong câu hỏi của tôi). Tôi không hiểu mục đích của việc biên dịch một cái gì đó như bitcode nếu tôi cần phải tạo ra một nhị phân phổ anyway. Và tôi không thể tìm thấy tệp khuôn khổ được tạo bằng bản dựng 'archive'. –

+0

bitcode là một LLVM IR trung gian được biên dịch bởi Xcode, và phụ thuộc vào arch, không giống như bytecode java, vì vậy mỗi slice cần phần bitcode riêng của nó. Vì đây là mã trung gian nên táo có thể sử dụng nó để tối ưu hóa mã máy cuối cùng trong tương lai mà không cần tải lên phiên bản mới, đây là mục đích chính – xfdai

+0

Và khung được tạo bằng 'lưu trữ' từ tập lệnh là trên' $ {DEVICE_LIBRARY_PATH}/Mô-đun/$ {FRAMEWORK_NAME} ' xem [tại đây] (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

Các vấn đề liên quan