Bugly多環(huán)境上傳符號(hào)表

Bugly

相信大家有這樣的經(jīng)歷细移,App有很多套環(huán)境甚至有不同的BundleID程梦,需要上傳符號(hào)表到不同的bugly賬號(hào)上去,為了方便分析崩潰定位問題借宵。今天我來分享我們采用的解決辦法幌衣,實(shí)現(xiàn)一個(gè)腳本多套配置上傳,同樣適用其他上傳符號(hào)表的腳本壤玫。

原理

在info.plist中添加一項(xiàng)Application Target作為環(huán)境變量豁护。shell腳本中,獲取info.plist的Application Target并使用對(duì)應(yīng)的配欲间。是不是So Easy楚里!
在Jenkins打包前,使用腳本訪問plist修改成想要環(huán)境的值即可猎贴,打包完成后腳本會(huì)自動(dòng)上傳符號(hào)表腻豌。

info.plist

實(shí)現(xiàn)

定義默認(rèn)配置

#!/bin/sh
#
# Copyright 2016 Bugly, Tencent. All rights reserved.
#
# V1.4.0
#
# 2016.08.03
#
#

##Debug模式下直接退出
if [ "${CONFIGURATION=}" == "Debug" ]; then
exit
fi

定義變量

#
######################################################
# 1. 腳本集成到Xcode工程的Target
######################################################
#
# --- Copy the SCRIPT to the Run Script of Build Phases in the Xcode project ---
#
# # 定義變量
BUGLY_APP_ID="APPID1"
# #
BUGLY_APP_KEY="APPKEY1"
# #
BUNDLE_IDENTIFIER="IDENTIFIER1"
# #
UPLOAD_DSYM_ONLY=1
#
# # 腳本默認(rèn)配置的版本格式為CFBundleShortVersionString(CFBundleVersion),  如果你修改默認(rèn)的版本格式, 請(qǐng)?jiān)O(shè)置此變量, 如果不想修改, 請(qǐng)忽略此設(shè)置
# CUSTOMIZED_APP_VERSION=""
#
# # Debug模式編譯是否上傳,1=上傳 0=不上傳嘱能,默認(rèn)不上傳
# UPLOAD_DEBUG_SYMBOLS=0
#
# # 模擬器編譯是否上傳,1=上傳 0=不上傳虱疏,默認(rèn)不上傳
# UPLOAD_SIMULATOR_SYMBOLS=0
#
# #只有Archive操作時(shí)上傳, 1=支持Archive上傳 0=所有Release模式編譯都上傳
# UPLOAD_ARCHIVE_ONLY=0
#
# #
# source dSYMUpload.sh
#
# --- END OF SCRIPT ---
#

獲取變量并使用對(duì)應(yīng)配置

# 獲取環(huán)境變量
resultcell =$(/usr/libexec/PlistBuddy -c 'Print Application\ Target' "${INFOPLIST_FILE}")
if [ $resultcell == 1 ]; then
#statements
BUGLY_APP_ID="APPID1"
BUGLY_APP_KEY="APPKEY1"
echo "開發(fā)環(huán)境"
elif [ $resultcell == 2 ]; then
#statements
BUGLY_APP_ID="APPID2"
BUGLY_APP_KEY="APPKEY2"
echo "測(cè)試環(huán)境"
elif [ $resultcell == 3 ]; then
#statements
BUGLY_APP_ID="APPID3"
BUGLY_APP_KEY="APPKEY3"
echo "預(yù)發(fā)布環(huán)境"
elif [ $resultcell == 4 ]; then
#statements
BUGLY_APP_ID="APPID4"
BUGLY_APP_KEY="APPKEY4"
echo "生產(chǎn)環(huán)境"
else
echo "Error: Unable to identify惹骂!"
fi

剩余代碼

#
#
#
#######################################################
# 2. 腳本根據(jù)輸入?yún)?shù)處理
#######################################################
#
# #命令行下輸入應(yīng)用基本信息, .dSYM文件的父目錄路徑, 輸出文件目錄即可
#
# sh dSYMUpload.sh <bugly_app_id> <bugly_app_key> <app_bundle_identifier> <app_version> <dSYM_src_dir> <bSYMBOL_dest_dir>
#
# #
#
# #注意:
# # 1. dSYMUpload.sh會(huì)調(diào)用buglySymboliOS.jar進(jìn)行.dSYM解析,所以依賴Java運(yùn)行時(shí)環(huán)境
# # 2. dSYMUpload.sh和buglySymboliOS.jar的文件路徑需一致
#
#

#
# --- CONTENT OF SCRIPT ---
#

# Bugly服務(wù)域名
BUGLY_DSYM_UPLOAD_DOMAIN="api.bugly.qq.com"

# 注意jar工具的路徑跟dSYMUpload.sh腳本路徑一致, 請(qǐng)務(wù)必保證jar路徑的正確性
BUGLY_SYMBOL_JAR_PATH="dsymtool/buglySymboliOS.jar"
# 查找添加到系統(tǒng)目錄的jar工具
if [ ! -f "${BUGLY_SYMBOL_JAR_PATH}" ]; then
BUGLY_SYMBOL_JAR_PATH="$HOME/bin/buglySymboliOS.jar"
fi

# 打印錯(cuò)誤信息
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"
    
    #
    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)
            echo "-----------------------------"
            
            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 "--------------------------------"
            
        }
        
        # 執(zhí)行
        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"
            
            # 檢查必須參數(shù)是否設(shè)置
            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
                # 使用符號(hào)表工具來生成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
                done
                
                if [ $RET = "F" ]; then
                exitWithMessage "No .dSYM found in ${DSYM_FOLDER}" 0
                fi
            }
            
            # 在Xcode工程中執(zhí)行
            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}")
                
                # 組裝Bugly默認(rèn)識(shí)別的版本信息(格式為CFBundleShortVersionString(CFBundleVersion), 例如: 1.0(1))
                if [ ! "${CUSTOMIZED_APP_VERSION}" ]; then
                BUGLY_APP_VERSION="${BUNDLE_SHORT_VERSION}(${BUNDLE_VERSION})"
                else
                BUGLY_APP_VERSION="${CUSTOMIZED_APP_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 ..."
                
                ##檢查模擬器編譯是否允許上傳符號(hào)
                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}
            }
            
            # 根據(jù)Xcode的環(huán)境變量判斷是否處于Xcode環(huán)境
            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"
            # 你可以在此處直接設(shè)置BuglyAppID和BuglyAppKey对粪,排除不常變參數(shù)的輸入
            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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末右冻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子著拭,更是在濱河造成了極大的恐慌纱扭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儡遮,死亡現(xiàn)場(chǎng)離奇詭異乳蛾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鄙币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門肃叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人十嘿,你說我怎么就攤上這事因惭。” “怎么了绩衷?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蹦魔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我咳燕,道長(zhǎng)勿决,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任迟郎,我火速辦了婚禮剥险,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪肖。我一直安慰自己表制,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布控乾。 她就那樣靜靜地躺著么介,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕衡。 梳的紋絲不亂的頭發(fā)上壤短,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音慨仿,去河邊找鬼久脯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镰吆,可吹牛的內(nèi)容都是我干的帘撰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼万皿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摧找!你這毒婦竟也來了核行?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蹬耘,失蹤者是張志新(化名)和其女友劉穎芝雪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體综苔,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惩系,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了休里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛆挫。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妙黍,靈堂內(nèi)的尸體忽然破棺而出悴侵,到底是詐尸還是另有隱情,我是刑警寧澤拭嫁,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布可免,位于F島的核電站,受9級(jí)特大地震影響做粤,放射性物質(zhì)發(fā)生泄漏浇借。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一怕品、第九天 我趴在偏房一處隱蔽的房頂上張望妇垢。 院中可真熱鬧,春花似錦肉康、人聲如沸闯估。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涨薪。三九已至,卻和暖如春炫乓,著一層夾襖步出監(jiān)牢的瞬間刚夺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工末捣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侠姑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓箩做,卻偏偏與公主長(zhǎng)得像莽红,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卒茬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理船老,服務(wù)發(fā)現(xiàn),斷路器圃酵,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,804評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 貝葉斯分類是機(jī)器學(xué)習(xí)中一個(gè)重要的分類算法柳畔,由于其簡(jiǎn)單高效,所以在實(shí)戰(zhàn)中非常受歡迎郭赐。本文將介紹貝葉斯分類中兩個(gè)比較典...
    石馬木寸閱讀 707評(píng)論 0 0
  • 麻麻問:什么是“野蠻”薪韩? 涵寶:就是沒有讀書的人…… 希望下次涵寶不愿意早起上學(xué)時(shí),“野蠻”這個(gè)詞能激勵(lì)她去學(xué)校[...
    pan02閱讀 139評(píng)論 0 0