zoukankan      html  css  js  c++  java
  • Qt Framework 问题之 framework/Versions/A:bundle format unrecognized, invalid, or unsuitable

    在解决标题提到的问题之后,先来介绍下Qt Framework一些基本知识。
    基于QT的Mac端工程,在打包时需要对所有需要嵌入到APP的framework及dylib文件进行手动签名处理。

    一、签名处理的流程

    1. 先编译工程生成APP。
    2. 对所有framework/dylib进行签名,命令为:
    codesign --force --verify --verbose --sign "Developer ID Application: XXXX. (XXXXXXX)" MMMMMM.framework

    在终端输入即可,注意MMMMMM.framework 需要是绝对路径。

    3. 对所有framework执行签名后,对app进行签名处理:
    codesign --force --verify --verbose --sign "Developer ID Application: XXXXXX. (XXXXX)" NNNNNNN.app
    在终端输入即可,注意NNNNNNN.app是绝对路径。

    二、验证APP是否签名成功 

    如果想验证下APP是否签名成功,可以输入下面任意一个命令:

    (1)第一条命令:用于判断APP及所有framework是否签名工程

    codesign -v --strict --deep --verbose=2 aaaaa.app

    如果提示下面两行表示成功:

    aaaaa.app: valid on disk
    aaaaa.app: satisfies its Designated Requirement

    如果提示类似下面的提示,表示失败:

    In subcomponent /XXXX/XXXX/XXXX/ff.framework

    表示这个framework签名不合格,需要查看此framework内部文件结构是否正常等,完成之后重新进行签名,再对APP进行签名。

    (2)第二条命令:用于查看APP签名信息及嵌入到APP的dylib和framework等

     codesign -d --deep --verbose=2 -r- aaaaa.app

    提示如下表示成功:

    (3)第三条命令:

    spctl --assess -vv NNNNN.app

    提示如下表示成功:

    aaaaa.app: accepted
    source=Developer ID
    origin=Developer ID Application: XXXXXXXXX. (XXXXXX)

    三、Qt Framework/dylib文件签名失败问题

    xcode 提示 " framework/Versions/A:bundle format unrecognized, invalid, or unsuitable" ,

    说明当前framework不符合apple官方对framework这种bundle的格式要求。查看Versions/A文件夹下为空。

    以QtConcurrent.framework(Qt 5.5.1版本)为例说明问题,提示的framework结构为:

    由于发版时都是基于release版本编译,因此移除根目录下QtConcurrent_debug和QtConcurrent_debug.prl文件,然后重新对当前framework进行签名处理,

    此时会提示“Unsealed contents present in the root directory of an embedded framework”,说明在framework的根目录下存在不符合要求的文件,

    此时除了软连接文件,就剩余QtConcurrent.prl文件,经查阅发现此文件用于在链接时查找库的依赖关系,因此此文件不能删除。

    那不删除又无法签名成功,该如何处理呢?

    可以将QtConcurrent.prl移动到Resources(软连接的文件夹)文件夹中,此时进行签名OK,签名成功后,文件目录为:
     

    QtConcurrent.framework根目录下没有了QtConcurrent.prl,并且在/5/目录下生成了一个名为 _CodeSignature的文件夹,表示当前framework签名成功。

    对于APP所依赖所有Qt的framework进行上述处理,而对于其他dylib文件则比较简单,直接输入签名命令进行签名即可。

    需要特别注意的是QtWebEngineCore.framework,对此进行签名之前,需要先对/Versions/5/Helpers/QtWebEngineProcess.app进行签名。

    等所有依赖的库签名成功后,再对APP进行签名:

    codesign --force --verify --verbose --sign "Developer ID Application: XXXXX (XXXXX)" aaaaaa.app

    其中aaaaa.app代表app的绝对路径如果app签名也成功,那么在APP/Contents根目录下会多出一个_CodeSignature文件夹和embedded.provisionfile文件。

    四、处理脚本

    为了方便编译,自己封装了一个脚本(codesign_framework_test.sh),在xcode的配置即可,如下图所示。

      

    codesign_frameworks_test.sh的内容为:

      1 #!/bin/sh
      2 
      3 # WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY! 
      4 echo ">>>>>>>>start to process unseable files in framework <<<<<<"
      5 ITEMS=""
      6 
      7 echo "build dir:"
      8 echo $TARGET_BUILD_DIR
      9 
     10 FRAMEWORKS_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
     11 
     12 echo "Framework path:"
     13 echo $FRAMEWORKS_DIR
     14 
     15 # Prefer the expanded name, if available.
     16 CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
     17 if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
     18     # Fall back to old behavior.
     19     CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
     20 fi
     21 
     22 echo "Identity:"
     23 echo "${CODE_SIGN_IDENTITY_FOR_ITEMS}"
     24 
     25 if [ -d "$FRAMEWORKS_DIR" ] ; then
     26     FRAMEWORKS=$(find "${FRAMEWORKS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle")
     27     RESULT=$?
     28     if [[ $RESULT != 0 ]] ; then
     29         exit 1
     30     fi
     31     ITEMS="${FRAMEWORKS}"
     32 fi
     33 
     34 echo "Framworks_Found:"
     35 
     36 for ITEM in $ITEMS;
     37 do
     38     framework_filepath="${ITEM##*/}"
     39     # file name  no ext
     40     framework_filename="${framework_filepath%.*}"
     41     # file name with ext
     42     current_framework_name="${framework_filepath##*/}"
     43     echo "**************:"$current_framework_name
     44     # ext
     45     extension=${ITEM##*.}
     46 
     47     if [ "$extension" != "framework" ]
     48         then
     49             # code sign
     50             codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${ITEM}"
     51             continue
     52     fi
     53     # debug file
     54     debug_name="${framework_filename}_debug"
     55     framework_debug="${ITEM}/${debug_name}"
     56     
     57     # debug prl file
     58     debug_prl_name="${framework_filename}_debug.prl"
     59     framework_debug_prl="${ITEM}/${debug_prl_name}"
     60 
     61     echo "${framework_debug} deleting >>>"
     62     echo "${framework_debug_prl} deleting >>>"
     63 
     64     # delete files
     65     rm $framework_debug
     66     rm $framework_debug_prl
     67 
     68     # delete folder
     69     rm -rf "${ITEM}/Versions/A"
     70     
     71     resources_folder="${ITEM}/Versions/5/Resources"
     72     echo $resources_folder
     73     release_prl_name="${framework_filename}.prl"
     74     framework_release_prl="${ITEM}/${release_prl_name}"
     75     echo $framework_release_prl
     76     echo "move ${framework_release_prl} to Resources folder::"
     77     mv $framework_release_prl $resources_folder
     78 
     79     if [ "QtWebEngineCore" == "$framework_filename" ]
     80         then
     81             QtWebEngineProcess_app="${ITEM}/Versions/5/Helpers/QtWebEngineProcess.app"
     82             codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${QtWebEngineProcess_app}"
     83     fi
     84     # code sign
     85     codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${ITEM}"
     86 done
     87 
     88 MacOS_DIR="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/MacOS"
     89 MacOS_ITEMS=""
     90 
     91 if [ -d "$MacOS_DIR" ] ; then
     92     MacOSLibs=$(find "${MacOS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle")
     93     RESULT=$?
     94     if [[ $RESULT != 0 ]] ; then
     95         exit 1
     96     fi
     97     MacOS_ITEMS="${MacOSLibs}"
     98 fi
     99 
    100 echo "MacOSItems:"
    101 for MacOS_ITEM in $MacOS_ITEMS;
    102 do
    103     framework_filepath="${MacOS_ITEM##*/}"]
    104     # file name with ext
    105     current_framework_name="${framework_filepath##*/}"
    106     echo "**************:"$current_framework_name
    107     # code sign
    108     codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${MacOS_ITEM}"
    109 done
    110 
    111 PROJECT_NAME="${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}"
    112 echo $PROJECT_NAME
    113 #code sign app
    114 codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${PROJECT_NAME}"
    115 
    116 #用于判断是否签名
    117 codesign -v --strict --deep --verbose=2 "${PROJECT_NAME}"

    注意:

    1. 如果未使用ZipArchive.framework,则不需要特殊处理。

    2.如果未使用etcpack和convert,也无需签名处理。

  • 相关阅读:
    docker harbor 修改密码 重置密码 sql
    mongodb监控并在服务挂掉后自动重启脚本
    centos7 ffmpeg安装 rtsp相关
    vscode vue 自动格式化代码
    开启go module
    Python3.x:打包为exe执行文件(window系统)
    Docker 日志都在哪里?怎么收集?
    HttpsURLConnection信任任何证书
    SP3734 PERIODNI
    联赛前的记录
  • 原文地址:https://www.cnblogs.com/calence/p/11920803.html
Copyright © 2011-2022 走看看