Bugly iOS自動匯入符號表

2022-09-21 21:02:00
 
前言

      最近在處理Bugly問題的時候順便解決了下符號表上傳的問題,使用最新的上傳工具包,也是順便整理了下可以使用的指令碼新增到了專案中,把這個過程中遇到的問題總結出來,指令碼也會給出來,實測是沒有問題的,希望可以幫助到有需要的小夥伴。首先關於什麼是符號表,符號表是用來幹什麼的,在哪裡找自己的符號表這些問題我們不在這裡說,Bugly檔案裡面說的很詳細也很清楚,需要的小夥伴直接去看官方檔案。
 
      Bugly iOS 符號表設定檔案
 
指令碼設定

      我感覺最方便的是在我 Archive 打包的時候時候直接幫我把符號表傳上去,在平時的開發過程中自己感覺是不太需要去幫我定位什麼問題的,基本上開發過程中的問題都是可以藉助開發工具和第三方工具幫助我們解決問題的。當然,Bugly是可以幫助我們收集各種機器包括模擬、各種環境下的問題的,有需要的我們自己一個可以去試著更改指令碼設定,也當是熟悉指令碼了。我們在Xcode中新增指令碼位置如下:
 
      第一步:下載工具包
 
      符號表工具下載連結 我使用的版本(符號表工具 '3.3.4')
      檢查自己的Java環境,我們在終端中輸入 java -version 要是顯示出版本就說明環境已經設定過了,沒有的話下面連結下載安裝。還有一點需要注意,就是Java的版本要在1.8以上。
 

 

       Java下載安裝

 
      第二步:檢視自己的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 <bugly_app_id> <bugly_app_key> <app_bundle_identifier> <app_version> <dSYM_src_dir> <bSYMBOL_dest_dir>
#
# #
#
# #注意:
# # 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 <bugly_app_id> <bugly_app_key> <app_bundle_identifier> <app_version> <dSYM_src_dir> <bSYMBOL_dest_dir> [upload_dsym_only]\n"
    # 你可以在此處直接設定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

 

      第四步:點選Archive進行打包
 
      打包的過程中我們盯著點打包紀錄檔,指令碼的一些輸出紀錄檔也是在這裡檢視,具體的位置如下:
 
 
      要是打包成功,我們也可以看到符號表上傳成功 dSYM upload complete 的輸出,我自己的如下所示:
 

 

     要是順利的話整個過程還是很快的,當然還是建議大家仔細瞭解下指令碼中的內容,方便我們遇到問題的時候進行排查。

 

遇到的問題


 

      1、關於 buglySymboliOS.jar和dSYMUpload.sh的問題:
 
      要是我們搜尋Bugly自動匯入符號表指令碼的話,很大部分都是在說使用上面的這兩部分,但是我自己在實踐的過程當中,報了一些我自己你沒辦法處理的問題,500 system_error,具體的問題在Bugly問題反饋區也能看到的,但是,沒有官方人員能給我們說明問題出在哪裡。導致這種方式我是放棄了的。具體的錯誤如下:
 
 
      2、Failed to upload the zip archive file to bugly
 
      這個問題大家可以參考下下面的文章,文章給我們解釋了一些問題,能幫助我們查詢自己的問題。
      Bugly 符號表上傳錯誤分析+解決辦法
 
      3、在Debug環境下我們想上傳符號表定位我們的問題,怎麼處理?
 
      首先我們需要改一下指令碼當中的 UPLOAD_DEBUG_SYMBOLS ,讓在Debug模式中也上傳。
      在一個我們需要改一下Xcode下面設定中的設定:Xcode->Targets->Build Settings->Debug information Format 的Debug 為 DWARF with dSYM File