美文网首页iOS Kit
iOS .a 和.framework库文件支持 CPU 架构

iOS .a 和.framework库文件支持 CPU 架构

作者: 好大一棵树6 | 来源:发表于2019-06-13 15:55 被阅读34次

    查看CPU结构

    查看.a的CPU架构

    lipo -info  xx.a
    

    查看.framework的CPU架构

    1、cd到xx.framework的目录下面
    2、lipo -info xx 
    

    指令集对应的机型

    2018 A12芯片arm64e : iPhone XS、 iPhone XS Max、 iPhoneXR
    2017 A11芯片arm64: iPhone 8, iPhone 8 Plus, and iPhone X
    2016 A10芯片arm64:iPhone 7 , 7 Plus, iPad (2018)
    2015 A9芯片arm64: iPhone 6S , 6S Plus
    2014 A8芯片arm64: iPhone 6 , iPhone 6 Plus
    2013 A7芯片arm64: iPhone 5S
    armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
    armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4

    模拟器32位 i386架构,
    模拟器64位 x86_64架构,
    真机32位 armv7 armv7s架构,
    真机64位处理器需要arm64 arm64e架构。

    .a库文件

    编写自己的.a库的时候一般是需要支持(这样真机和模拟器都能使用)

    armv7  arm64 i386 x86_64
    

    如果全一点的话也可以包括armv7s、arm64e

    armv7 armv7s  arm64 arm64e i386 x86_64
    

    每增加一种架构库的大小就会多一倍。

    查看Architectures

    使用标准架构(Standard architectures) 81CC564AE6BCA0898E7E18DB3C02E6E9.png 模拟器中会生成:i386 x86_64

    只会包含2种架构:armv7 arm64

    如果真机需要4种都有的话需要手动填写,在Architectures中加入armv7、armv7s、arm64、arm64e ,注意这种模式下模拟器编译不了的(模拟器需要使用Standard architectures)。

    具体如下图 2381CD52F917CDBD8B3B50313CBA3B88.png

    合并模拟和真机的.a文件

    • 手动合并
    lipo -create "模拟器xx.a" "真机xx.a" -output "xx.a"
    lipo -create "xx.a" "xx.a" -output "xx.a"
    
    • 脚本合并

      在.a库的工程中添加一个Aggegate目标文件 4D6F1318-EE0F-49A2-8248-004E020EA220.png
      在build Phases 添加Run Script项

      然后加入脚本

    if [ "${ACTION}" = "build" ]
    then
    
    #要build的target名
    target_Name=${PROJECT_NAME}
        echo "target_Name=${target_Name}"
    
    #build之后的文件夹路径
    build_DIR=${SRCROOT}/build
    echo "build_DIR=${build_DIR}"
    
    #真机build生成的头文件的文件夹路径
    DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
        echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"
    
    #真机build生成的.a文件路径
    DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
        echo "DEVICE_DIR_A=${DEVICE_DIR_A}"
    
    #模拟器build生成的.a文件路径
    SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
        echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"
    
    #目标文件夹路径
    INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
        echo "INSTALL_DIR=${INSTALL_DIR}"
    
    #目标头文件文件夹路径
    INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
        echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"
    
    #目标.a路径
    INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
        echo "INSTALL_DIR_A=${INSTALL_DIR_A}"
    
    #判断build文件夹是否存在,存在则删除
    if [ -d "${build_DIR}" ]
    then
    rm -rf "${build_DIR}"
    fi
    
    #判断目标文件夹是否存在,存在则删除该文件夹
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    #创建目标文件夹
    mkdir -p "${INSTALL_DIR}"
    
    #build之前clean一下
    xcodebuild -target ${target_Name} clean
    
    #模拟器build
    xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator
    
    #真机build
    xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos
    
    #复制头文件到目标文件夹
    cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"
    
    #合成模拟器和真机.a包
    lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"
    
    #打开目标文件夹
    open "${INSTALL_DIR}"
    
    fi
    

    使用默认设置会生成支持4中架构的.a静态库文件(armv7 arm64 i386 x86_64)
    具体怎么使用Aggegate可以查看
    地址

    .framework库

    如同.a库一样使用脚本生成支持4种架构的库

    脚本如下

    # Sets the target folders and the final framework product.
    FRAMEWORK_NAME=${PROJECT_NAME}
    FRAMEWORK_CONFIG=Release
    
    # Install dir will be the final output to the framework.
    # The following line create it in the root folder of the current project.
    INSTALL_DIR=${PROJECT_DIR}/Products/${FRAMEWORK_NAME}.framework
    
    # Working dir will be deleted after the framework creation.
    WORK_DIR=build
    DEVICE_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphoneos/${FRAMEWORK_NAME}.framework
    SIMULATOR_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphonesimulator/${FRAMEWORK_NAME}.framework
    
    xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphoneos
    
    echo "Build simulator"
    xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphonesimulator
    
    # Creates install directory if it not exits.
    if [ ! -d "${INSTALL_DIR}" ]
    then
    mkdir -p "${INSTALL_DIR}"
    fi
    
    # Creates headers directory if it not exits.
    if [ ! -d "${INSTALL_DIR}/Headers" ]
    then
    mkdir -p "${INSTALL_DIR}/Headers"
    fi
    
    # Remove all files in the headers diectory.
    for file in `ls "${INSTALL_DIR}/Headers"`
    do
    rm "${INSTALL_DIR}/Headers/${file}"
    done
    
    # Remove binary library file.
    rm -f ${INSTALL_DIR}/${FRAMEWORK_NAME}
    
    # Copies the headers files to the final product folder.
    if [ -d "${DEVICE_DIR}/Headers" ]
    then
    for file in `ls "${DEVICE_DIR}/Headers"`
    do
    cp "${DEVICE_DIR}/Headers/${file}" "${INSTALL_DIR}/Headers/${file}"
    done
    fi
    
    # copy nibs to bundle,then copy bundle to final folder
    BUNDLE_DIR=${DEVICE_DIR}/${FRAMEWORK_NAME}.bundle
    
    if [ -d "${BUNDLE_DIR}" ];then
    if ls ${DEVICE_DIR}/*.nib >/dev/null 2>&1;then
    rm -rf ${BUNDLE_DIR}/*.nib
    cp -rf ${DEVICE_DIR}/*.nib ${BUNDLE_DIR}
    fi
    rm -rf "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
    cp -R "${BUNDLE_DIR}" "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
    fi
    
    echo "Merge with simulator"
    # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
    lipo -create "${DEVICE_DIR}/${FRAMEWORK_NAME}" "${SIMULATOR_DIR}/${FRAMEWORK_NAME}" -output "${INSTALL_DIR}/${FRAMEWORK_NAME}"
    
    rm -r "${WORK_DIR}"
    
    
    

    相关文章

      网友评论

        本文标题:iOS .a 和.framework库文件支持 CPU 架构

        本文链接:https://www.haomeiwen.com/subject/akplfctx.html