前言
最近在处理Bugly问题的时候顺便解决了下符号表上传的问题,使用最新的上传工具包,也是顺便整理了下可以使用的脚本添加到了项目中,把这个过程中遇到的问题总结出来,脚本也会给出来,实测是没有问题的,希望可以帮助到有需要的小伙伴。首先关于什么是符号表,符号表是用来干什么的,在哪里找自己的符号表这些问题我们不在这里说,Bugly文档里面说的很详细也很清楚,需要的小伙伴直接去看官方文档。
脚本设置
我感觉最方便的是在我 Archive 打包的时候时候直接帮我把符号表传上去,在平时的开发过程中自己感觉是不太需要去帮我定位什么问题的,基本上开发过程中的问题都是可以借助开发工具和第三方工具帮助我们解决问题的。当然,Bugly是可以帮助我们收集各种机器包括模拟、各种环境下的问题的,有需要的我们自己一个可以去试着更改脚本配置,也当是熟悉脚本了。我们在Xcode中添加脚本位置如下:
第一步:下载工具包
符号表工具下载链接 我使用的版本(符号表工具 '3.3.4')
检查自己的Java环境,我们在终端中输入 java -version 要是显示出版本就说明环境已经配置过了,没有的话下面链接下载安装。还有一点需要注意,就是Java的版本要在1.8以上。
第二步:查看自己的user下面是否有bin文件,没有的话我们手动创建这个文件。
然后把我们下载的Bugly工具包当中的 buglyqq-upload-symbol.jar 文件直接添加进去。
第三步:添加脚本
前面已经提过了Xcode添加脚本的位置,我们把下面的脚本添加进去之后修改一下前面需要我们配置的一些基础信息:
# # #我们项目Bugly的Appid BUGLY_APP_ID="" # #我们项目Bugly的AppKey BUGLY_APP_KEY="" # #自己项目的BundleID BUNDLE_IDENTIFIER="" # # UPLOAD_DSYM_ONLY=1 # # # 脚本默认配置的版本格式为CFBundleShortVersionString(CFBundleVersion), 如果你修改默认的版本格式, 请设置此变量, 如果不想修改, 请忽略此设置 # CUSTOMIZED_APP_VERSION="" # # # Debug模式编译是否上传,1=上传 0=不上传,默认不上传 UPLOAD_DEBUG_SYMBOLS=0 # # # 模拟器编译是否上传,1=上传 0=不上传,默认不上传 UPLOAD_SIMULATOR_SYMBOLS=0 # # #只有Archive操作时上传, 1=支持Archive上传 0=所有Release模式编译都上传 UPLOAD_ARCHIVE_ONLY=1 # # # # source dSYMUpload.sh # # --- END OF SCRIPT --- # # # # ####################################################### # 2. 脚本根据输入参数处理 ####################################################### # # #命令行下输入应用基本信息, .dSYM文件的父目录路径, 输出文件目录即可 # # sh dSYMUpload.sh# # # # # #注意: # # 1. dSYMUpload.sh会调用buglySymboliOS.jar进行.dSYM解析,所以依赖Java运行时环境 # # 2. dSYMUpload.sh和buglySymboliOS.jar的文件路径需一致 # # # # --- CONTENT OF SCRIPT --- # # dsym文件 AppDsymFile = "" # Bugly服务域名 BUGLY_DSYM_UPLOAD_DOMAIN="api.bugly.qq.com" # 注意jar工具的路径跟dSYMUpload.sh脚本路径一致, 请务必保证jar路径的正确性 BUGLY_SYMBOL_JAR_PATH="dsymtool/buglySymboliOS.jar" # 查找添加到系统目录的jar工具 if [ ! -f "${BUGLY_SYMBOL_JAR_PATH}" ]; then BUGLY_SYMBOL_JAR_PATH="$HOME/bin/buglySymboliOS.jar" fi BUGLFQQ_UPLOAD_SYMOBL_PATH="$HOME/bin/buglyqq-upload-symbol.jar" # 打印错误信息 function exitWithMessage(){ echo "--------------------------------" echo "${1}" echo "--------------------------------" exit ${2} } # 上传bSYMBOL文件 function dSYMUpload() { P_APP_ID="$1" P_APP_KEY="$2" P_APP_BUNDLE_ID="$3" P_APP_VERSION="$4" P_BSYMBOL_ZIP_FILE="$5" dsymFile = "$6" # P_BSYMBOL_ZIP_FILE_NAME=${P_BSYMBOL_ZIP_FILE##*/} P_BSYMBOL_ZIP_FILE_NAME=${P_BSYMBOL_ZIP_FILE_NAME//&/_} P_BSYMBOL_ZIP_FILE_NAME="${P_BSYMBOL_ZIP_FILE_NAME// /_}" DSYM_UPLOAD_URL="https://${BUGLY_DSYM_UPLOAD_DOMAIN}/openapi/file/upload/symbol?app_id=${P_APP_ID}&app_key=${P_APP_KEY}" echo "dSYM upload url: ${DSYM_UPLOAD_URL}" echo "-----------------------------" # STATUS=$(/usr/bin/curl -k "${DSYM_UPLOAD_URL}" --form "api_version=1" --form "app_id=${P_APP_ID}" --form "app_key=${P_APP_KEY}" --form "symbolType=2" --form "bundleId=${BUNDLE_IDENTIFIER}" --form "productVersion=${BUGLY_APP_VERSION}" --form "fileName=${P_BSYMBOL_ZIP_FILE_NAME}" --form "file=@${P_BSYMBOL_ZIP_FILE}" --verbose) #防止太快,打包不了 sleep 30 (/usr/bin/java -Xms512m -Xmx1024m -Dfile.encoding=UTF8 -jar ${BUGLFQQ_UPLOAD_SYMOBL_PATH} -appid "${P_APP_ID}" -appkey "${P_APP_KEY}" -bundleid "${BUNDLE_IDENTIFIER}" -version "${BUGLY_APP_VERSION}" -platform "IOS" -inputSymbol ${dsymFile}) echo "-----------------------------" echo "dSYM upload complete." # UPLOAD_RESULT="FAILTURE" # echo "Bugly server response: ${STATUS}" # if [ ! "${STATUS}" ]; then # echo "Error: Failed to upload the zip archive file." # elif [[ "${STATUS}" == *"{\"reponseCode\":\"0\"}"* ]]; then # echo "Success to upload the dSYM for the app [${BUNDLE_IDENTIFIER} ${BUGLY_APP_VERSION}]" # UPLOAD_RESULT="SUCCESS" # else # echo "Error: Failed to upload the zip archive file to Bugly." # fi #Remove temp dSYM archive #echo "Remove temporary zip archive: ${DSYM_ZIP_FPATH}" #/bin/rm -f "${DSYM_ZIP_FPATH}" # if [ "$?" -ne 0 ]; then # exitWithMessage "Error: Failed to remove temporary zip archive." 0 # fi # echo "--------------------------------" # echo "${UPLOAD_RESULT} - dSYM upload complete." # if [[ "${UPLOAD_RESULT}" == "FAILTURE" ]]; then # echo "--------------------------------" # echo "Failed to upload the dSYM" # echo "Please check the script and try it again." # fi } # .dSYM解析为bSYMBOL文件 function dSYMParse() { DSYM_FILE="$1" DSYM_SYMBOL_FILE="$2" echo "--------------------------------" echo "Extract symbol info from .dSYM file. to ${DSYM_SYMBOL_FILE}" (/usr/bin/java -Xms512m -Xmx1024m -Dfile.encoding=UTF8 -jar "${BUGLY_SYMBOL_JAR_PATH}" -i "${DSYM_FILE}" -o "${DSYM_SYMBOL_FILE}" ) || exitWithMessage "Error: Failed to extract symbols." 1 echo "--------------------------------" } # 执行 function run() { CONFIG_BUGLY_APP_ID="$1" CONFIG_BUGLY_APP_KEY="$2" CONFIG_BUGLY_APP_BUNDLE_IDENTIFIER="$3" CONFIG_BUGLY_APP_VERSION="$4" CONFIG_DSYM_SOURCE_DIR="$5" CONFIG_DSYM_DEST_DIR="$6" CONFIG_UPLOAD_DSYM_ONLY="$7" # 检查必须参数是否设置 if [ ! "${CONFIG_BUGLY_APP_ID}" ]; then exitWithMessage "Error: Bugly App ID not defined. Please set 'BUGLY_APP_ID' " 0 fi if [[ "${CONFIG_BUGLY_APP_ID}" == *"App ID"* ]]; then exitWithMessage "Error: Bugly App ID not defined." 0 fi if [ ! "${CONFIG_BUGLY_APP_KEY}" ]; then exitWithMessage "Error: Bugly App Key not defined." 0 fi if [ ! "${CONFIG_BUGLY_APP_BUNDLE_IDENTIFIER}" ]; then exitWithMessage "Error: Bundle Identifier not defined." 0 fi if [ ! "${CONFIG_BUGLY_APP_VERSION}" ]; then exitWithMessage "Error: App Version not defined." 0 fi if [ ! -e "${CONFIG_DSYM_SOURCE_DIR}" ]; then exitWithMessage "Error: Invalid dir ${CONFIG_DSYM_SOURCE_DIR}" 0 fi if [ ! "${CONFIG_DSYM_DEST_DIR}" ]; then exitWithMessage "Error: Invalid dir ${CONFIG_DSYM_DEST_DIR}" 0 fi if [ ! -e "${CONFIG_DSYM_DEST_DIR}" ]; then mkdir ${CONFIG_DSYM_DEST_DIR} fi DSYM_FOLDER="${CONFIG_DSYM_SOURCE_DIR}" IFS=$'\n' echo "Scaning dSYM FOLDER: ${DSYM_FOLDER} ..." RET="F" # for dsymFile in $(find "$DSYM_FOLDER" -name '*.dSYM'); do RET="T" echo "Found dSYM file: $dsymFile" DSYM_FILE_NAME=${dsymFile##*/} DSYM_SYMBOL_ZIP_FILE_NAME="${DSYM_FILE_NAME}.zip" DSYM_SYMBOL_ZIP_FILE_NAME="${DSYM_SYMBOL_ZIP_FILE_NAME// /_}" DSYM_SYMBOL_ZIP_FILE=${CONFIG_DSYM_DEST_DIR}/${DSYM_SYMBOL_ZIP_FILE_NAME} if [ $CONFIG_UPLOAD_DSYM_ONLY -eq 1 ]; then if [ -e $DSYM_SYMBOL_ZIP_FILE ]; then rm -f $DSYM_SYMBOL_ZIP_FILE fi # 如果只上传dSYM,直接压缩dSYM目录 zip -r -j $DSYM_SYMBOL_ZIP_FILE $dsymFile -x *.plist else # 使用符号表工具来生成Symbol文件 dSYMParse $dsymFile $DSYM_SYMBOL_ZIP_FILE fi # 上传 # dSYMUpload $CONFIG_BUGLY_APP_ID $CONFIG_BUGLY_APP_KEY $CONFIG_BUGLY_APP_BUNDLE_IDENTIFIER $CONFIG_BUGLY_APP_VERSION $DSYM_SYMBOL_ZIP_FILE $dsymFile if echo "$dsymFile" | grep -q -E '\.app.dSYM$'; then dSYMUpload $CONFIG_BUGLY_APP_ID $CONFIG_BUGLY_APP_KEY $CONFIG_BUGLY_APP_BUNDLE_IDENTIFIER $CONFIG_BUGLY_APP_VERSION $DSYM_SYMBOL_ZIP_FILE $dsymFile fi done if [ $RET = "F" ]; then exitWithMessage "No .dSYM found in ${DSYM_FOLDER}" 0 fi } # 在Xcode工程中执行 function runInXcode(){ echo "Uploading dSYM to Bugly in Xcode ..." echo "Info.Plist : ${INFOPLIST_FILE}" # BUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleVersion' "${INFOPLIST_FILE}") # BUNDLE_SHORT_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "${INFOPLIST_FILE}") BUNDLE_VERSION="$MARKETING_VERSION" BUNDLE_SHORT_VERSION="$CURRENT_PROJECT_VERSION" # 组装Bugly默认识别的版本信息(格式为CFBundleShortVersionString(CFBundleVersion), 例如: 1.0(1)) # if [ ! "${CUSTOMIZED_APP_VERSION}" ]; then # BUGLY_APP_VERSION="${BUNDLE_SHORT_VERSION}(${BUNDLE_VERSION})" # else BUGLY_APP_VERSION="${BUNDLE_VERSION}" # fi echo "--------------------------------" echo "Prepare application information." echo "--------------------------------" echo "Product Name: ${PRODUCT_NAME}" echo "Bundle Identifier: ${BUNDLE_IDENTIFIER}" echo "Version: ${BUNDLE_SHORT_VERSION}" echo "Build: ${BUNDLE_VERSION}" echo "Bugly App ID: ${BUGLY_APP_ID}" echo "Bugly App key: ${BUGLY_APP_KEY}" echo "Bugly App Version: ${BUGLY_APP_VERSION}" echo "--------------------------------" echo "Check the arguments ..." ##检查模拟器编译是否允许上传符号 if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then if [ $UPLOAD_SIMULATOR_SYMBOLS -eq 0 ]; then exitWithMessage "Warning: Build for simulator and skipping to upload. \nYou can modify 'UPLOAD_SIMULATOR_SYMBOLS' to 1 in the script." 0 fi fi ##检查是否是Release模式编译 if [ "${CONFIGURATION=}" == "Debug" ]; then if [ $UPLOAD_DEBUG_SYMBOLS -eq 0 ]; then exitWithMessage "Warning: Build for debug mode and skipping to upload. \nYou can modify 'UPLOAD_DEBUG_SYMBOLS' to 1 in the script." 0 fi fi ##检查是否Archive操作 if [ $UPLOAD_ARCHIVE_ONLY -eq 1 ]; then if [[ "$TARGET_BUILD_DIR" == *"/Archive"* ]]; then echo "Archive the package" else exitWithMessage "Warning: Build for NOT Archive mode and skipping to upload. \nYou can modify 'UPLOAD_ARCHIVE_ONLY' to 0 in the script." 0 fi fi # run ${BUGLY_APP_ID} ${BUGLY_APP_KEY} ${BUNDLE_IDENTIFIER} ${BUGLY_APP_VERSION} ${DWARF_DSYM_FOLDER_PATH} ${BUILD_DIR}/BuglySymbolTemp ${UPLOAD_DSYM_ONLY} } # 根据Xcode的环境变量判断是否处于Xcode环境 INFO_PLIST_FILE="${INFOPLIST_FILE}" BuildInXcode="F" if [ -f "${INFO_PLIST_FILE}" ]; then BuildInXcode="T" fi if [ $BuildInXcode = "T" ]; then runInXcode else echo "\nUsage: dSYMUpload.sh " # 你可以在此处直接设置BuglyAppID和BuglyAppKey,排除不常变参数的输入 BUGLY_APP_ID="$1" BUGLY_APP_KEY="$2" BUNDLE_IDENTIFIER="$3" BUGLY_APP_VERSION="$4" DWARF_DSYM_FOLDER_PATH="$5" SYMBOL_OUTPUT_PATH="$6" UPLOAD_DSYM_ONLY=$7 run ${BUGLY_APP_ID} ${BUGLY_APP_KEY} ${BUNDLE_IDENTIFIER} ${BUGLY_APP_VERSION} ${DWARF_DSYM_FOLDER_PATH} ${SYMBOL_OUTPUT_PATH} ${UPLOAD_DSYM_ONLY} fi [upload_dsym_only]\n
第四步:点击Archive进行打包
打包的过程中我们盯着点打包日志,脚本的一些输出日志也是在这里查看,具体的位置如下:
要是打包成功,我们也可以看到符号表上传成功 dSYM upload complete 的输出,我自己的如下所示:
要是顺利的话整个过程还是很快的,当然还是建议大家仔细了解下脚本中的内容,方便我们遇到问题的时候进行排查。
遇到的问题
1、关于 buglySymboliOS.jar和dSYMUpload.sh的问题:
要是我们搜索Bugly自动导入符号表脚本的话,很大部分都是在说使用上面的这两部分,但是我自己在实践的过程当中,报了一些我自己你没办法处理的问题,500 system_error,具体的问题在Bugly问题反馈区也能看到的,但是,没有官方人员能给我们说明问题出在哪里。导致这种方式我是放弃了的。具体的错误如下:
2、Failed to upload the zip archive file to bugly
这个问题大家可以参考下下面的文章,文章给我们解释了一些问题,能帮助我们查找自己的问题。
3、在Debug环境下我们想上传符号表定位我们的问题,怎么处理?
首先我们需要改一下脚本当中的 UPLOAD_DEBUG_SYMBOLS ,让在Debug模式中也上传。
在一个我们需要改一下Xcode下面设置中的配置:Xcode->Targets->Build Settings->Debug information Format 的Debug 为 DWARF with dSYM File