Commit 59348341 authored by dsq's avatar dsq

修改一键打包脚本

parent fe1df623
{ {
"app": { "app": {
"bundleName": "com.dong.kmp.testtoolchain", "bundleName": "com.dong.kmp.testtoolchaindebug",
"vendor": "example", "vendor": "example",
"versionCode": 1000000, "versionCode": 1000000,
"versionName": "1.0.0", "versionName": "1.0.0",
"icon": "$media:layered_image", "icon": "$media:layered_image",
"label": "$string:app_name", "label": "$string:app_name"
//"hwasanEnabled": true //"hwasanEnabled": true
//"asanEnabled": true //"asanEnabled": true
} }
......
...@@ -7,11 +7,11 @@ ...@@ -7,11 +7,11 @@
"material": { "material": {
"certpath": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.cer", "certpath": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.cer",
"keyAlias": "debugKey", "keyAlias": "debugKey",
"keyPassword": "0000001B27C22393FFEACF897C523D53BB14B958F86E6EB6F884B402DBAC8C9D7FC6219A51BAEB0EDD9CC2", "keyPassword": "0000001BF55B52AF321260D7C11253AD4CCAEB9CBF05874E8F76DE69349CEE679CF2B07FC1BA797311A0EE",
"profile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p7b", "profile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p7b",
"signAlg": "SHA256withECDSA", "signAlg": "SHA256withECDSA",
"storeFile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p12", "storeFile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p12",
"storePassword": "0000001B34693C04F5C3C24936B75D58936B71CB7347743A9551B05A64CD7F77E3A5ADB34C0A71B6EA0196" "storePassword": "0000001B3D367C47C6BF9BCA4E0B177E5ED5735690CCE7387327A8256026BA3B93E69E8431179401DF27B5"
} }
} }
], ],
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
}, },
{ {
"name": "EntryAbility_label", "name": "EntryAbility_label",
"value": "测试工具链功能" "value": "工具链debug"
}, },
{ {
"name": "vibrate_permission_reason", "name": "vibrate_permission_reason",
......
...@@ -20,11 +20,18 @@ set -e ...@@ -20,11 +20,18 @@ set -e
# Record script start time # Record script start time
START_TIME=$(date +%s) START_TIME=$(date +%s)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# ====================== [1. Default Configuration and Parameter Parsing] ====================== # ====================== [1. Default Configuration and Parameter Parsing] ======================
DEFAULT_PLATFORM="ohosArm64" DEFAULT_PLATFORM="ohosArm64"
DEFAULT_TARGET_ID="127.0.0.1:5555" DEFAULT_TARGET_ID="127.0.0.1:5555"
# bundle 从 harmonyApp/AppScope/app.json5 读取,不存在则用默认
DEFAULT_BUNDLE_NAME="com.example.harmonyapp" DEFAULT_BUNDLE_NAME="com.example.harmonyapp"
APP_JSON5="$SCRIPT_DIR/harmonyApp/AppScope/app.json5"
if [ -f "$APP_JSON5" ]; then
_bundle=$(grep '"bundleName"' "$APP_JSON5" 2>/dev/null | sed 's/.*"bundleName"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' | head -1 | tr -d '\r')
[ -n "$_bundle" ] && DEFAULT_BUNDLE_NAME="$_bundle"
fi
DEFAULT_ABILITY_NAME="EntryAbility" DEFAULT_ABILITY_NAME="EntryAbility"
LOCAL_OHOS_PATH="" LOCAL_OHOS_PATH=""
...@@ -36,7 +43,7 @@ usage() { ...@@ -36,7 +43,7 @@ usage() {
echo " TARGET_ID Device ID (default: $DEFAULT_TARGET_ID)" echo " TARGET_ID Device ID (default: $DEFAULT_TARGET_ID)"
echo "" echo ""
echo "Options:" echo "Options:"
echo " -M MODES 打包类型: debug | release | all (default: 交互选择)" echo " -M MODES 打包类型: debug | release | all (default: all,不交互避免影响后续命令)"
echo " -m MODE Build mode: debug or release (default: debug)" echo " -m MODE Build mode: debug or release (default: debug)"
echo " -b BUNDLE Set bundle name (current: $DEFAULT_BUNDLE_NAME)" echo " -b BUNDLE Set bundle name (current: $DEFAULT_BUNDLE_NAME)"
echo " -a ABILITY Set Ability name (current: $DEFAULT_ABILITY_NAME)" echo " -a ABILITY Set Ability name (current: $DEFAULT_ABILITY_NAME)"
...@@ -144,28 +151,15 @@ export DEVECO_SDK_HOME="$DEVECO_HOME/sdk" ...@@ -144,28 +151,15 @@ export DEVECO_SDK_HOME="$DEVECO_HOME/sdk"
export PATH="$DEVECO_SDK_HOME:$DEVECO_HOME/jbr/Contents/Home/bin:$DEVECO_HOME/tools/node/bin:$DEVECO_HOME/tools/ohpm/bin:$DEVECO_HOME/tools/hvigor/bin:$PATH" export PATH="$DEVECO_SDK_HOME:$DEVECO_HOME/jbr/Contents/Home/bin:$DEVECO_HOME/tools/node/bin:$DEVECO_HOME/tools/ohpm/bin:$DEVECO_HOME/tools/hvigor/bin:$PATH"
# ====================== [2.5 Device List and Build Mode List] ====================== # ====================== [2.5 Device List and Build Mode List] ======================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEVICE_IDS=() DEVICE_IDS=()
while IFS= read -r line; do while IFS= read -r line; do
line=$(echo "$line" | tr -d '\r' | xargs) line=$(echo "$line" | tr -d '\r' | xargs)
[ -n "$line" ] && DEVICE_IDS+=("$line") [ -n "$line" ] && DEVICE_IDS+=("$line")
done < <("$HDC_BIN" list targets 2>/dev/null | awk '{if (NF>=1) print $1}') done < <("$HDC_BIN" list targets 2>/dev/null | awk '{if (NF>=1) print $1}')
# 打包类型:未指定 -M 时交互选择 # 打包类型:仅通过 -M 指定,不做交互 read,避免影响 stdin 导致后续 gradle/推包失败(加入口前无 read,行为一致)
if [ -z "$BUILD_MODES_SELECT" ]; then if [ -z "$BUILD_MODES_SELECT" ]; then
echo "" BUILD_MODES_SELECT="all"
echo "请选择打包类型:"
echo " 1) 仅 debug"
echo " 2) 仅 release"
echo " 3) debug+release"
printf "请输入 [1/2/3,默认 3]: "
read -r BUILD_CHOICE
BUILD_CHOICE=${BUILD_CHOICE:-3}
case "$BUILD_CHOICE" in
1) BUILD_MODES_SELECT="debug" ;;
2) BUILD_MODES_SELECT="release" ;;
3|*) BUILD_MODES_SELECT="all" ;;
esac
fi fi
case "$(echo "$BUILD_MODES_SELECT" | tr '[:upper:]' '[:lower:]')" in case "$(echo "$BUILD_MODES_SELECT" | tr '[:upper:]' '[:lower:]')" in
debug) BUILD_MODES=(debug) ;; debug) BUILD_MODES=(debug) ;;
...@@ -189,18 +183,21 @@ for BUILD_MODE in "${BUILD_MODES[@]}"; do ...@@ -189,18 +183,21 @@ for BUILD_MODE in "${BUILD_MODES[@]}"; do
((TOTAL_COUNT++)) ((TOTAL_COUNT++))
echo "" echo ""
echo "$TARGET_ID 设备 $BUILD_MODE 模式 进行打包" echo "$TARGET_ID 设备 $BUILD_MODE 模式 进行打包"
# 每轮切到项目根,与原脚本一致在项目根执行 gradlew
cd "$SCRIPT_DIR"
# 每次打包前:先删除 entry/builds、entry/libs/arm64_v8a、entry/libs/x86_64,删除后检测,确认无 HAP 与 libs 中间产物后再进行打包(含第一次) # 每轮打包前:先删除 entry/builds、entry/build(含 HAP)、entry/libs/arm64-v8a、entry/libs/x86_64,删除后检测,确认无 HAP 与 libs 中间产物后再进行打包
ENTRY_BASE="$SCRIPT_DIR/harmonyApp/entry" ENTRY_BASE="$SCRIPT_DIR/harmonyApp/entry"
CHECK_BASE="$SCRIPT_DIR/harmonyApp" CHECK_BASE="$SCRIPT_DIR/harmonyApp"
HAP_PATH="$CHECK_BASE/entry/build/default/outputs/default/entry-default-signed.hap" HAP_PATH="$CHECK_BASE/entry/build/default/outputs/default/entry-default-signed.hap"
LIBS_ARM="$CHECK_BASE/entry/libs/arm64_v8a" LIBS_ARM="$CHECK_BASE/entry/libs/arm64-v8a"
LIBS_X86="$CHECK_BASE/entry/libs/x86_64" LIBS_X86="$CHECK_BASE/entry/libs/x86_64"
DEL_RETRY=0 DEL_RETRY=0
while true; do while true; do
rm -rf "$ENTRY_BASE/builds" rm -rf "$ENTRY_BASE/builds"
rm -rf "$ENTRY_BASE/libs/arm64_v8a" rm -rf "$ENTRY_BASE/build"
rm -rf "$ENTRY_BASE/libs/arm64-v8a"
rm -rf "$ENTRY_BASE/libs/x86_64" rm -rf "$ENTRY_BASE/libs/x86_64"
HAP_EXISTS="无"; [ -f "$HAP_PATH" ] && HAP_EXISTS="有" HAP_EXISTS="无"; [ -f "$HAP_PATH" ] && HAP_EXISTS="有"
LIBS_EXISTS="无"; [ -d "$LIBS_ARM" ] || [ -d "$LIBS_X86" ] && LIBS_EXISTS="有" LIBS_EXISTS="无"; [ -d "$LIBS_ARM" ] || [ -d "$LIBS_X86" ] && LIBS_EXISTS="有"
...@@ -210,35 +207,45 @@ while true; do ...@@ -210,35 +207,45 @@ while true; do
fi fi
DEL_RETRY=$((DEL_RETRY + 1)) DEL_RETRY=$((DEL_RETRY + 1))
if [ $DEL_RETRY -ge 5 ]; then if [ $DEL_RETRY -ge 5 ]; then
echo -e "\033[35m删除后检测: HAP包=${HAP_EXISTS}, libs中间产物=${LIBS_EXISTS},清理未完全,继续打包\033[0m" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:清理未完全,HAP包=${HAP_EXISTS}, libs中间产物=${LIBS_EXISTS},须清光后再打包)"
break continue 2
fi fi
sleep 1 sleep 1
done done
# 当前设备先卸载应用,再打包安装
"$HDC_BIN" -t "$TARGET_ID" shell bm uninstall -n "$BUNDLE_NAME" >/dev/null 2>&1 || true
"$HDC_BIN" -t "$TARGET_ID" shell aa force-stop "$BUNDLE_NAME" >/dev/null 2>&1 || true "$HDC_BIN" -t "$TARGET_ID" shell aa force-stop "$BUNDLE_NAME" >/dev/null 2>&1 || true
# ====================== [3. Gradle Build] ====================== # ====================== [3. Gradle Build] ======================
# publish 必须跑完且成功,再进行打包、推包
GRADLE_RET=0
if [ "$PLATFORM" = "ohosArm64" ]; then if [ "$PLATFORM" = "ohosArm64" ]; then
if [ "$BUILD_MODE" = "release" ]; then if [ "$BUILD_MODE" = "release" ]; then
echo ">>> :composeApp:publishReleaseBinariesToHarmonyApp"
if [ -n "$LOCAL_OHOS_PATH" ]; then if [ -n "$LOCAL_OHOS_PATH" ]; then
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH" ./gradlew :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else else
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp ./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
fi fi
GRADLE_RET=$?
else else
echo ">>> :composeApp:publishDebugBinariesToHarmonyApp"
if [ -n "$LOCAL_OHOS_PATH" ]; then if [ -n "$LOCAL_OHOS_PATH" ]; then
./gradlew :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH" ./gradlew :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else else
./gradlew :composeApp:publishDebugBinariesToHarmonyApp ./gradlew :composeApp:publishDebugBinariesToHarmonyApp
fi fi
GRADLE_RET=$?
fi fi
elif [ "$PLATFORM" = "iosSimulatorArm64" ]; then elif [ "$PLATFORM" = "iosSimulatorArm64" ]; then
echo ">>> :composeApp:linkDebugFrameworkIosSimulatorArm64"
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64 ./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
GRADLE_RET=$?
else else
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:不支持的平台 $PLATFORM)"
continue
fi
if [ $GRADLE_RET -ne 0 ]; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:Gradle publish 未成功结束,exit code $GRADLE_RET,须 publish 完成后再打包推包)"
continue continue
fi fi
# SO packaging end time # SO packaging end time
...@@ -254,7 +261,7 @@ else ...@@ -254,7 +261,7 @@ else
fi fi
if [ ! -d "$HARMONY_APP_DIR" ]; then if [ ! -d "$HARMONY_APP_DIR" ]; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:harmonyApp 目录不存在 $HARMONY_APP_DIR"
continue continue
fi fi
cd "$HARMONY_APP_DIR" cd "$HARMONY_APP_DIR"
...@@ -273,30 +280,40 @@ SIGNED_HAP="entry-default-signed.hap" ...@@ -273,30 +280,40 @@ SIGNED_HAP="entry-default-signed.hap"
HAP_FILE="$HAP_DIR/$SIGNED_HAP" HAP_FILE="$HAP_DIR/$SIGNED_HAP"
# Check if signed HAP package exists # Check if signed HAP package exists
if [ ! -f "$HAP_FILE" ]; then if [ ! -f "$HAP_FILE" ]; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:未找到已签名 HAP 包 $HAP_FILE"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
continue continue
fi fi
if ! echo "$AVAILABLE_TARGETS" | grep -q "$TARGET_ID"; then if ! echo "$AVAILABLE_TARGETS" | grep -q "$TARGET_ID"; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:设备离线或未连接)"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
continue continue
fi fi
# Install HAP (using temp directory) # 推包:与原脚本一致,使用绝对路径避免当前目录影响
HAP_FILE_ABS="$(pwd)/entry/build/default/outputs/default/$SIGNED_HAP"
# 安装前先卸载,避免同设备 debug/release 签名冲突(原脚本单次运行无此问题)
"$HDC_BIN" -t "$TARGET_ID" shell bm uninstall -n "$BUNDLE_NAME" >/dev/null 2>&1 || true
REMOTE_HAP_DIR="/data/local/tmp/debug_install" REMOTE_HAP_DIR="/data/local/tmp/debug_install"
"$HDC_BIN" -t "$TARGET_ID" shell mkdir -p "$REMOTE_HAP_DIR" >/dev/null 2>&1 "$HDC_BIN" -t "$TARGET_ID" shell mkdir -p "$REMOTE_HAP_DIR"
"$HDC_BIN" -t "$TARGET_ID" file send "$HAP_FILE" "$REMOTE_HAP_DIR" >/dev/null 2>&1 "$HDC_BIN" -t "$TARGET_ID" file send "$HAP_FILE_ABS" "$REMOTE_HAP_DIR"
INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1) INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1)
sleep 1 sleep 1
INSTALL_RESULT=$? INSTALL_RESULT=$?
if echo "$INSTALL_OUTPUT" | grep -qE "failed"; then if echo "$INSTALL_OUTPUT" | grep -qE "failed|Failed|error|Error"; then
"$HDC_BIN" -t "$TARGET_ID" shell bm uninstall -n "$BUNDLE_NAME" >/dev/null 2>&1 || true "$HDC_BIN" -t "$TARGET_ID" shell bm uninstall -n "$BUNDLE_NAME" >/dev/null 2>&1 || true
sleep 5 sleep 5
INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1) INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1)
sleep 5 sleep 5
fi fi
if echo "$INSTALL_OUTPUT" | grep -qE "failed|Failed|error|Error"; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:安装失败 bm install)"
echo " >>> $INSTALL_OUTPUT"
cd "$SCRIPT_DIR"
continue
fi
# ====================== [6. App Launch and Debug Mount] ====================== # ====================== [6. App Launch and Debug Mount] ======================
"$HDC_BIN" -t "$TARGET_ID" shell rm -rf "$REMOTE_HAP_DIR" >/dev/null 2>&1 "$HDC_BIN" -t "$TARGET_ID" shell rm -rf "$REMOTE_HAP_DIR" >/dev/null 2>&1
sleep 1 sleep 1
...@@ -313,7 +330,7 @@ END_TIME=$(date +%s) ...@@ -313,7 +330,7 @@ END_TIME=$(date +%s)
AA_START_RESULT=$? AA_START_RESULT=$?
# Check if screen lock error # Check if screen lock error
if echo "$AA_START_OUTPUT" | grep -q "10106102\|screen is locked"; then if echo "$AA_START_OUTPUT" | grep -q "10106102\|screen is locked"; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:设备屏幕已锁定,请解锁后重试)"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
continue continue
fi fi
...@@ -323,7 +340,7 @@ get_pid_func() { ...@@ -323,7 +340,7 @@ get_pid_func() {
"$HDC_BIN" -t "$TARGET_ID" shell "pidof $BUNDLE_NAME" 2>/dev/null | tr -d '\r' | tr -d '\n' | awk '{print $1}' "$HDC_BIN" -t "$TARGET_ID" shell "pidof $BUNDLE_NAME" 2>/dev/null | tr -d '\r' | tr -d '\n' | awk '{print $1}'
} }
MAX_WAIT=20 MAX_WAIT=45
COUNT=0 COUNT=0
APP_PID="" APP_PID=""
while [ $COUNT -lt $MAX_WAIT ]; do while [ $COUNT -lt $MAX_WAIT ]; do
...@@ -336,7 +353,8 @@ while [ $COUNT -lt $MAX_WAIT ]; do ...@@ -336,7 +353,8 @@ while [ $COUNT -lt $MAX_WAIT ]; do
done done
if [ -z "$APP_PID" ]; then if [ -z "$APP_PID" ]; then
echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式" echo "错误的 $TARGET_ID 设备 $BUILD_MODE 模式(原因:应用在 ${MAX_WAIT}s 内未启动,请检查设备与安装结果)"
echo " >>> aa start 输出: $AA_START_OUTPUT"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
continue continue
fi fi
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment