• iOS编译SDK自动化脚本(.framework+.a)


    之前研究过静态库打包合成的问题,为此踩了不少坑, 写了一篇关于静态库打包的半自动的文章

    不知道是Xcode的问题还是系统的问题,之前在网上找过了一些脚本,发现不可以直接在SDK工程中加入脚本,不然MacBook就直接发烫电风扇转不停了,当时没有找到好的办法,所以搞了个半自动...

    最近发现有Aggregate这么个玩意儿,终于可以全自动了哈哈哈,需要在SDK的工程里创建一个聚合类型的targetAggregate

    并在Build Phases新建一个RunScript里面执行脚本,无论是.framework还是.a都是一样的

    开整:

    创建Aggregate

    自动构建.framework脚本如下:

    set -e
    #SDK的名字
    SDK_NAME=${PROJECT_NAME}
    #SDK产出目录
    INSTALL_DIR=${SRCROOT}/Products/${SDK_NAME}.framework
    
    #清空编译缓存
    rm -rf ${BUILD_DIR}
    
    # 执行模拟器编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphonesimulator build
    #执行真机编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphoneos  build
    
    #真机目录
    DEVICE_DIR="build"/${CONFIGURATION}-iphoneos/${SDK_NAME}.framework
    #模拟器目录
    SIMULATOR_DIR="build"/${CONFIGURATION}-iphonesimulator/${SDK_NAME}.framework
    
    #清除旧的安装目录
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    #创建新的安装目录
    mkdir -p "${INSTALL_DIR}"
    #拷贝编译产物到安装目录
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    
    #合并真机和模拟器的编译产物
    lipo -create "${DEVICE_DIR}/${SDK_NAME}" "${SIMULATOR_DIR}/${SDK_NAME}" -output "${INSTALL_DIR}/${SDK_NAME}"
    
    #打开安装目录查看结果
    open "${SRCROOT}/Products/"
    
    rm -rf "${SRCROOT}/build"
    
    #查看此次编译的架构支持
    lipo_info=`lipo -info ${INSTALL_DIR}/${SDK_NAME}`
    icon_path=`pwd`/Xcode.icns
    icon_file=$(osascript -e "set thePath to POSIX file \"${icon_path}\" as string")
    echo $icon_file
    archs=${lipo_info##*are:}
    osascript -e "display dialog \"${archs}\" with title \"查看静态库信息\" buttons {\"OK\"} default button 1 with icon file \"${icon_file}\""
    echo "脚本跑完了"
    

    framework脚本执行结果

    自动构建.a脚本如下:

    set -e
    #SDK的名字
    SDK_NAME=${PROJECT_NAME}
    #SDK产出目录
    INSTALL_DIR=${SRCROOT}/Products/${SDK_NAME}
    
    #清空编译缓存
    rm -rf ${BUILD_DIR}
    
    # 执行模拟器编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphonesimulator build
    #执行真机编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphoneos  build
    
    #真机目录
    DEVICE_DIR="build"/${CONFIGURATION}-iphoneos
    #模拟器目录
    SIMULATOR_DIR="build"/${CONFIGURATION}-iphonesimulator
    
    #清除旧的安装目录
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    #创建新的安装目录
    mkdir -p "${INSTALL_DIR}"
    #拷贝编译产物到安装目录
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    rm -rf "${INSTALL_DIR}/usr"
    
    #合并真机和模拟器的编译产物
    lipo -create "${DEVICE_DIR}/lib${SDK_NAME}.a" "${SIMULATOR_DIR}/lib${SDK_NAME}.a" -output "${INSTALL_DIR}/lib${SDK_NAME}.a"
    
    #打开安装目录查看结果
    open "${SRCROOT}/Products/"
    #删除编译冗余数据
    rm -rf "${SRCROOT}/build"
    
    #查看此次编译的架构支持
    lipo_info=`lipo -info ${INSTALL_DIR}/lib${SDK_NAME}.a`
    icon_path=`pwd`/Xcode.icns 
    icon_file=$(osascript -e "set thePath to POSIX file \"${icon_path}\" as string")
    echo $icon_file
    archs=${lipo_info##*are:}
    osascript -e "display dialog \"${archs}\" with title \"查看静态库信息\" buttons {\"OK\"} default button 1 with icon file \"${icon_file}\""
    echo "脚本跑完了"
    

    lib.a静态库脚本执行结果

    真机架构:

    • armv7
    • armv7s
    • arm64
    • arm64e

    模拟器架构:

    • i386
    • x86_64

    不过现在Xcode13默认armv7和 arm64为标准架构,x86_64为PC端模拟器架构,需要自己手动调整Xcode配置剔除

    如图:

    Xcode SDK架构设置

    升级版

    • 优化了架构配置,无需Xcode编辑,直接调用脚本传参即可
    • 优化了脚本使用体验,新增了一些GUI配置

    xcode_build_framework.sh如下:

    <<EOF
    #注释说明: 保存本文件名为xcode_build_framework.sh,放到工程根目录即可
    # Aggregate里新建RunScript 调用如下:
    #一键产出通用包 传参指定架构打包
    sh xcode_build_framework.sh "armv7,armv7s,arm64,arm64e,x86_64,i386"
    #sh xcode_build_framework.sh  # 不传参则弹出GUI选择菜单
    EOF
    
    set -e
    #SDK的名字
    SDK_NAME=${PROJECT_NAME}
    #SDK产出目录
    INSTALL_DIR=${SRCROOT}/Products/${SDK_NAME}.framework
    #清空编译缓存
    rm -rf ${BUILD_DIR}
    
    if [ "x$1" = "x" ] ; #无入参则弹窗去选择
    then
    #弹出选择架构菜单
    select_arch=$(osascript <<EOF
    choose from list {"i386","x86_64","armv7","armv7s","arm64","arm64e"} with title "指定架构编译SDK" with prompt "选择架构" OK button name "编译" cancel button name "取消" default items {"armv7","arm64"} with multiple selections allowed
    EOF
    )
    else
    #输入指定架构 "arm64,armv7,..." 用逗号隔开即可
    select_arch=${1}
    fi
    
    # 默认已选择armv7和arm64 点取消才会走这里
    if [[ $select_arch = false ]] ;
    then
        echo "未选择架构,已取消本次编译."
        exit 0;
    fi
    
    simulator_archs=()
    if [[ $select_arch =~ "i386" ]] ;
    then
        simulator_archs+=("i386")
    fi
    
    if [[ $select_arch =~ "x86_64" ]] ;
    then
        simulator_archs+=("x86_64")
    fi
    
    echo "模拟器架构为: "${simulator_archs[*]}
    
    #模拟器架构个数,如果个数为0,则不需要模拟器参与编译了
    simulator_archs_length=${#simulator_archs[*]}
    if [[ $simulator_archs_length == 0 ]] ;
    then
        echo "模拟器架构数为0,模拟器无需参与编译"
    else
        # 剔除模拟器架构
        select_arch=${select_arch//i386/ }
        select_arch=${select_arch//x86_64/ }
    fi
    
    # 获取真机的架构
    iphoneos_archs=(${select_arch//,/ })
    echo "真机架构为: "${iphoneos_archs[*]}
    
    if [[ $simulator_archs_length > 0 ]] ;
    then
    # 执行模拟器编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphonesimulator build ARCHS="${simulator_archs[*]}"
    fi
    
    #执行真机编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphoneos  build ARCHS="${iphoneos_archs[*]}"
    
    #真机目录
    DEVICE_DIR="build"/${CONFIGURATION}-iphoneos/${SDK_NAME}.framework
    #模拟器目录
    SIMULATOR_DIR="build"/${CONFIGURATION}-iphonesimulator/${SDK_NAME}.framework
    
    #清除旧的输出目录
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    #创建新的输出目录
    mkdir -p "${INSTALL_DIR}"
    #拷贝编译产物到输出目录
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    
    # 有模拟器编译才需要合并
    if [[ $simulator_archs_length > 0 ]] ;
    then
    #合并真机和模拟器的编译产物
    lipo -create "${DEVICE_DIR}/${SDK_NAME}" "${SIMULATOR_DIR}/${SDK_NAME}" -output "${INSTALL_DIR}/${SDK_NAME}"
    fi
    
    #打开输出目录查看结果
    open "${SRCROOT}/Products/"
    
    rm -rf "${SRCROOT}/build"
    
    #查看此次编译的架构支持
    lipo_info=`lipo -info ${INSTALL_DIR}/${SDK_NAME}`
    icon_path=`pwd`/Xcode.icns
    icon_file=$(osascript -e "set thePath to POSIX file \"${icon_path}\" as string")
    echo $icon_file
    osascript -e "display dialog \"SDK包含架构: ${lipo_info##*are:}\" with title \"当前SDK架构信息\" buttons {\"OK\"} default button 1 with icon file \"${icon_file}\""
    echo "脚本跑完了"
    

    xcode_build_lib.sh如下:

    <<EOF
    #注释说明: 保存本文件名为xcode_build_lib.sh,放到工程根目录即可
    # Aggregate里新建RunScript 调用如下:
    #一键产出通用包 传参指定架构打包
    sh xcode_build_lib.sh "armv7,armv7s,arm64,arm64e,x86_64,i386"
    #sh xcode_build_lib.sh  # 不传参则弹出GUI选择菜单
    EOF
    
    set -e
    #SDK的名字
    SDK_NAME=${PROJECT_NAME}
    #SDK产出目录
    INSTALL_DIR=${SRCROOT}/Products/${SDK_NAME}
    
    #清空编译缓存
    rm -rf ${BUILD_DIR}
    
    if [ "x$1" = "x" ] ; #无入参则弹窗去选择
    then
    #弹出选择架构菜单
    select_arch=$(osascript <<EOF
    choose from list {"i386","x86_64","armv7","armv7s","arm64","arm64e"} with title "指定架构编译SDK" with prompt "选择架构" OK button name "编译" cancel button name "取消" default items {"armv7","arm64"} with multiple selections allowed
    EOF
    )
    else
    #输入指定架构 "arm64,armv7,..." 用逗号隔开即可
    select_arch=${1}
    fi
    # 默认已选择armv7和arm64 点取消才会走这里
    if [[ $select_arch = false ]] ;
    then
        echo "未选择架构,已取消本次编译."
        exit 0;
    fi
    
    simulator_archs=()
    if [[ $select_arch =~ "i386" ]] ;
    then
        simulator_archs+=("i386")
    fi
    
    if [[ $select_arch =~ "x86_64" ]] ;
    then
        simulator_archs+=("x86_64")
    fi
    
    echo "模拟器架构为: "${simulator_archs[*]}
    
    #模拟器架构个数,如果个数为0,则不需要模拟器参与编译了
    simulator_archs_length=${#simulator_archs[*]}
    if [[ $simulator_archs_length == 0 ]] ;
    then
        echo "模拟器架构数为0,模拟器无需参与编译"
    else
        # 剔除模拟器架构
        select_arch=${select_arch//i386/ }
        select_arch=${select_arch//x86_64/ }
    fi
    
    # 获取真机的架构
    iphoneos_archs=(${select_arch//,/ })
    echo "真机架构为: "${iphoneos_archs[*]}
    
    if [[ $simulator_archs_length > 0 ]] ;
    then
    # 执行模拟器编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphonesimulator build ARCHS="${simulator_archs[*]}"
    fi
    
    #执行真机编译指令
    xcodebuild -configuration ${CONFIGURATION} -target "${SDK_NAME}" -sdk iphoneos  build ARCHS="${iphoneos_archs[*]}"
    
    #真机目录
    DEVICE_DIR="build"/${CONFIGURATION}-iphoneos
    #模拟器目录
    SIMULATOR_DIR="build"/${CONFIGURATION}-iphonesimulator
    
    #清除旧的安装目录
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    #创建新的安装目录
    mkdir -p "${INSTALL_DIR}"
    #拷贝编译产物到安装目录
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    rm -rf "${INSTALL_DIR}/usr"
    
    # 有模拟器编译才需要合并
    if [[ $simulator_archs_length > 0 ]] ;
    then
    #合并真机和模拟器的编译产物
    lipo -create "${DEVICE_DIR}/lib${SDK_NAME}.a" "${SIMULATOR_DIR}/lib${SDK_NAME}.a" -output "${INSTALL_DIR}/lib${SDK_NAME}.a"
    fi
    
    #打开安装目录查看结果
    open "${SRCROOT}/Products/"
    #删除编译冗余数据
    rm -rf "${SRCROOT}/build"
    
    #查看此次编译的架构支持
    lipo_info=`lipo -info ${INSTALL_DIR}/lib${SDK_NAME}.a`
    icon_path=`pwd`/Xcode.icns
    icon_file=$(osascript -e "set thePath to POSIX file \"${icon_path}\" as string")
    echo $icon_file
    osascript -e "display dialog \"SDK包含架构: ${lipo_info##*are:}\" with title \"当前SDK架构信息\" buttons {\"OK\"} default button 1 with icon file \"${icon_file}\""
    echo "脚本跑完了"
    
    未经作者授权,禁止转载
    THE END
  • 相关阅读:
    双列集合
    单列集合
    Comparable和Comparator的区别
    用友U8 |【固定资产】固定资产生成凭证,点完计提折旧后没有凭证出来
    用友U8 |【应收管理】为什么在应收模块弃审销售发票,弃审不成功?
    用友U8 | 【总账】应收核销明细报错,提示:将截断字符串或二进制数据
    用友U8 | 【网上银行】网上银行模块网银支付后台字段说明
    用友U8 | 【实施导航】引入交易单位档案,提示:账号不能为空!
    用友U8 | 【实施导航】已经创建的人员档案,如何更新维护银行信息
    用友U8 |【合同管理】合同结算单不能失效
  • 原文地址:https://www.cnblogs.com/wgb1234/p/15840799.html
Copyright © 2020-2023  润新知