1. 打包
RN热更打包时,带上 --sourcemap-output 参数,使得打包jsbundle的同时生成map符号表文件。
完整的打包jsbundle、生成map符号表文件,并将jsbundle和map文件上传SVN的脚本
# 给双平台打热更包、符号表,并自动上传至SVN
# 前置条件:安装了 svn(brew install svn)、jq(brew install jq)
# npm run build (all | ios | android) (coffeemachine | audit | ...) [upload]
PLATFORM=$1
BUNDLE_NAME=$2
UPLOAD=$3
BRANCH=`git branch | grep \* | cut -d ' ' -f2`
VERSION=`jq -r '.buildVersion' ${BUNDLE_NAME}.manifest.json`
DEPENDENCY=`jq -r '.dependency[0]' ${BUNDLE_NAME}.manifest.json`
echo "==== platform: ${PLATFORM}; package: ${BUNDLE_NAME}; branch: ${BRANCH}; version: ${VERSION}; dependency: ${DEPENDENCY} ===="
NAME_BASE="${BUNDLE_NAME}_${VERSION}(dep-${DEPENDENCY})(branch-${BRANCH})"
DIR_BASE="$HOME/Desktop/MiniAppPackages_${BUNDLE_NAME}"
rm -rf $DIR_BASE
mkdir -p $DIR_BASE
buildIos() {
BUNDLE_OUTPUT="${DIR_BASE}/ios"
rm -rf $BUNDLE_OUTPUT
mkdir -p $BUNDLE_OUTPUT
react-native bundle \
--entry-file "${BUNDLE_NAME}.index.js" \
--platform ios \
--dev false \
--bundle-output "${BUNDLE_OUTPUT}/main.jsbundle" \
--assets-dest ${BUNDLE_OUTPUT} \
--sourcemap-output "${DIR_BASE}/ios.bundle.map"
if [[ $? == 0 ]]; then
cp "${BUNDLE_NAME}.manifest.json" "${BUNDLE_OUTPUT}/manifest.json"
else
exit 1
fi
}
buildAndroid() {
BUNDLE_OUTPUT="${DIR_BASE}/android"
rm -rf $BUNDLE_OUTPUT
mkdir -p $BUNDLE_OUTPUT
react-native bundle \
--entry-file "${BUNDLE_NAME}.index.js" \
--platform android \
--dev false \
--bundle-output "${BUNDLE_OUTPUT}/main.jsbundle" \
--assets-dest ${BUNDLE_OUTPUT} \
--sourcemap-output "${DIR_BASE}/android.bundle.map"
if [[ $? == 0 ]]; then
cp "${BUNDLE_NAME}.manifest.json" "${BUNDLE_OUTPUT}/manifest.json"
else
exit 1
fi
}
if [[ "$PLATFORM" == "ios" || "$PLATFORM" == "all" ]]; then
echo "==== 打包: ${BUNDLE_NAME} ios ====================================="
buildIos
fi
if [[ "$PLATFORM" == "android" || "$PLATFORM" == "all" ]]; then
echo "==== 打包: ${BUNDLE_NAME} android ====================================="
buildAndroid
fi
if [[ "$PLATFORM" == "ios" || "$PLATFORM" == "all" ]]; then
echo "==== 压缩 iOS ====================================="
cd "${DIR_BASE}/ios"
zip -r -q "${DIR_BASE}/${NAME_BASE}_ios.zip" *
fi
if [[ "$PLATFORM" == "android" || "$PLATFORM" == "all" ]]; then
echo "==== 压缩 android ====================================="
cd "${DIR_BASE}/android"
zip -r -q "${DIR_BASE}/${NAME_BASE}_android.zip" *
fi
echo "==== 删除缓存文件 ====================================="
rm -rf ${DIR_BASE}/android
rm -rf ${DIR_BASE}/ios
if [[ "$UPLOAD" == "upload" ]]; then
echo "==== 上传至SVN /工作站热更备份/${NAME_BASE} ====================================="
cd "${DIR_BASE}"
svn import . http://svn.luckincoffee.com/svn/luckincoffee/App_Dev/工作站热更备份/${NAME_BASE} -m "import ${DIR_BASE}"
fi
echo "==== 完成 ====================================="
2. 解析
bugly上异常信息一般是这样的:

解析符号表得到源码行列数的脚本:
/** * npm install [email protected] * node parse_error.js path line column // 参数为 map文件的路径、行号、列号 */ var fs = require('fs'); var sourceMap = require('source-map'); var arguments = process.argv.splice(2); console.log('所传递的参数是:', arguments); function parseJSError(aPath, aLine, aColumn) { fs.readFile(aPath, 'utf8', function (err, data) { var smc = new sourceMap.SourceMapConsumer(data); let parseData = smc.originalPositionFor({ line: parseInt(aLine), column: parseInt(aColumn) }); // 输出到控制台 console.log(parseData); // 输出到文件中 fs.appendFile('./parsed.txt', JSON.stringify(parseData) + '\n', 'utf8', function(err) { if(err) { console.log(err); } }); }); } var path = arguments[0]; var line = arguments[1]; var column = arguments[2]; parseJSError(path, line, column);
先安装source-map,注意该脚本只支持0.5.6版本。npm install [email protected]
输入map文件路径以及bugly中的行列数,运行得到源码中的行列数,同时导出了parsed.txt文件:
node parse_error.js android.bundle.map 2054 2326
所传递的参数是: [ 'android.bundle.map', '2054', '2326' ]
{ source:
'/Users/wuzongheng/DEV/luckin/code/common-frontend/luckin-employee/LuckinEmployee/store/pages/storeDuty/dayTable/LKDayTableDetail.js',
line: 109,
column: 43,
name: 'doneTimeStr' }
