Commit 00f42d8c authored by dsq's avatar dsq

一键删除

parent c4b2e98d
......@@ -7,11 +7,11 @@
"material": {
"certpath": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.cer",
"keyAlias": "debugKey",
"keyPassword": "0000001BF55B52AF321260D7C11253AD4CCAEB9CBF05874E8F76DE69349CEE679CF2B07FC1BA797311A0EE",
"keyPassword": "0000001ACF94E8199DC5062321EC905F3A254531A9FC40398EB3B3D17C32799CFC8CA6217DBAA5C0AF5B",
"profile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p7b",
"signAlg": "SHA256withECDSA",
"storeFile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p12",
"storePassword": "0000001B3D367C47C6BF9BCA4E0B177E5ED5735690CCE7387327A8256026BA3B93E69E8431179401DF27B5"
"storePassword": "0000001A8317BE0A5EB151014338C7A12BD97954BED4ABD53239B70B94F41430F857A19AD42FBD70C7F7"
}
}
],
......
......@@ -43,7 +43,7 @@ usage() {
echo " TARGET_ID Device ID (default: $DEFAULT_TARGET_ID)"
echo ""
echo "Options:"
echo " -M MODES 打包类型: debug | release | all (default: all,不交互避免影响后续命令)"
echo " -M MODES 打包类型: debug | release | all(不传 -M 时在终端用 1/2/3 选择;非终端或 RUNOHOS_NO_MENU=1 则默认 all)"
echo " -m MODE Build mode: debug or release (default: debug)"
echo " -b BUNDLE Set bundle name (current: $DEFAULT_BUNDLE_NAME)"
echo " -a ABILITY Set Ability name (current: $DEFAULT_ABILITY_NAME)"
......@@ -55,7 +55,7 @@ usage() {
echo " $0 ohosArm64 127.0.0.1:5555"
echo " $0 -M debug # 仅打 debug 包"
echo " $0 -M release # 仅打 release 包"
echo " $0 -M all # debug+release(默认可交互选择)"
echo " $0 -M all # debug+release(等价于菜单选 3)"
echo " $0 -b com.test.app -a MainAbility"
echo " $0 -p /path/to/external/ohos/project"
exit 0
......@@ -65,7 +65,8 @@ usage() {
BUNDLE_NAME=$DEFAULT_BUNDLE_NAME
ABILITY_NAME=$DEFAULT_ABILITY_NAME
BUILD_MODE="debug"
BUILD_MODES_SELECT="" # 空表示打包前交互选择;可选 debug | release | all
BUILD_MODES_SELECT=""
M_FLAG_SET=0
DEBUG_MODE="attach"
RED='\033[0;31m'
GREEN='\033[0;32m'
......@@ -74,7 +75,7 @@ NC='\033[0m' # No Color
POSITIONALS=()
while [[ $# -gt 0 ]]; do
case $1 in
-M) BUILD_MODES_SELECT="$2"; shift 2 ;;
-M) M_FLAG_SET=1; BUILD_MODES_SELECT="$2"; shift 2 ;;
-m) BUILD_MODE="$2"; shift 2 ;;
-b) BUNDLE_NAME="$2"; shift 2 ;;
-a) ABILITY_NAME="$2"; shift 2 ;;
......@@ -98,7 +99,7 @@ TARGET_ID=${POSITIONALS[1]:-$DEFAULT_TARGET_ID}
echo -e "\033[32m▶ Run environment configuration:\033[0m"
echo " - Platform: $PLATFORM"
echo " - Devices: from hdc list targets (see below)"
echo " - Build modes: 由 -M 或打包前选择 (debug / release / debug+release)"
echo " - Build modes: 由 -M 或菜单 1/2/3 选择 (debug / release / debug+release)"
echo " - Debug mode: $DEBUG_MODE"
echo " - Bundle: $BUNDLE_NAME"
echo " - Ability: $ABILITY_NAME"
......@@ -157,7 +158,35 @@ while IFS= read -r line; do
[ -n "$line" ] && DEVICE_IDS+=("$line")
done < <("$HDC_BIN" list targets 2>/dev/null | awk '{if (NF>=1) print $1}')
# 打包类型:仅通过 -M 指定,不做交互 read,避免影响 stdin 导致后续 gradle/推包失败(加入口前无 read,行为一致)
# 打包类型:未传 -M 时在交互终端用 1/2/3 选择;CI / 管道输入用 RUNOHOS_NO_MENU=1 或默认 all
pick_build_modes_interactive() {
if [[ -n "${RUNOHOS_NO_MENU:-}" ]]; then
BUILD_MODES_SELECT="all"
return
fi
if [[ ! -t 0 ]]; then
BUILD_MODES_SELECT="all"
return
fi
echo ""
echo "请选择打包类型(输入数字后回车):"
echo " 1) 仅 debug"
echo " 2) 仅 release"
echo " 3) debug + release(全部)"
local _c
read -r -p "请输入 1 / 2 / 3 [默认 3]: " _c || true
_c=${_c:-3}
case "$_c" in
1) BUILD_MODES_SELECT=debug ;;
2) BUILD_MODES_SELECT=release ;;
3) BUILD_MODES_SELECT=all ;;
*) echo "无效输入,使用默认 3(debug+release)"; BUILD_MODES_SELECT=all ;;
esac
}
if [[ "$M_FLAG_SET" -eq 0 ]]; then
pick_build_modes_interactive
fi
if [ -z "$BUILD_MODES_SELECT" ]; then
BUILD_MODES_SELECT="all"
fi
......@@ -189,7 +218,7 @@ echo "$TARGET_ID 设备 $BUILD_MODE 模式 进行打包"
# 每轮切到项目根,与原脚本一致在项目根执行 gradlew
cd "$SCRIPT_DIR"
# 每轮打包前:先删除 entry/builds、entry/build(含 HAP)、entry/libs/arm64-v8a、entry/libs/x86_64,删除后检测,确认无 HAP 与 libs 中间产物后再进行打包
# 每轮打包前:先删除 entry/builds、entry/build(含 HAP)、entry/libs 下全部 .so 与 arm64-v8a/x86_64 目录,删除后检测再打包
ENTRY_BASE="$SCRIPT_DIR/harmonyApp/entry"
CHECK_BASE="$SCRIPT_DIR/harmonyApp"
HAP_PATH="$CHECK_BASE/entry/build/default/outputs/default/entry-default-signed.hap"
......@@ -200,10 +229,18 @@ DEL_RETRY=0
while true; do
rm -rf "$ENTRY_BASE/builds"
rm -rf "$ENTRY_BASE/build"
if [ -d "$ENTRY_BASE/libs" ]; then
find "$ENTRY_BASE/libs" -type f \( -name '*.so' -o -name '*.SO' \) -delete 2>/dev/null || true
fi
rm -rf "$ENTRY_BASE/libs/arm64-v8a"
rm -rf "$ENTRY_BASE/libs/x86_64"
HAP_EXISTS="无"; [ -f "$HAP_PATH" ] && HAP_EXISTS="有"
LIBS_EXISTS="无"; [ -d "$LIBS_ARM" ] || [ -d "$LIBS_X86" ] && LIBS_EXISTS="有"
LIBS_EXISTS="无"
if [ -d "$LIBS_ARM" ] || [ -d "$LIBS_X86" ]; then LIBS_EXISTS="有"; fi
if [ -d "$ENTRY_BASE/libs" ]; then
_any_so=$(find "$ENTRY_BASE/libs" -type f \( -name '*.so' -o -name '*.SO' \) 2>/dev/null | head -1)
[ -n "$_any_so" ] && LIBS_EXISTS="有"
fi
if [ "$HAP_EXISTS" = "无" ] && [ "$LIBS_EXISTS" = "无" ]; then
echo -e "\033[35m删除后检测: HAP包=无, libs中间产物=无,已确认清理完成\033[0m"
break
......
......@@ -18,6 +18,7 @@ set "BUNDLE_NAME=%DEFAULT_BUNDLE_NAME%"
set "ABILITY_NAME=%DEFAULT_ABILITY_NAME%"
set "BUILD_MODE=debug"
set "BUILD_MODES_SELECT="
set "M_FLAG_SET=0"
set "DEBUG_MODE=attach"
set "LOCAL_OHOS_PATH="
set "PLATFORM="
......@@ -36,7 +37,7 @@ if exist "%APP_JSON5%" (
REM Parse options any position e.g. ohosArm64 -M release
:parse
if "%~1"=="" goto done_parse
if "%~1"=="-M" (set "BUILD_MODES_SELECT=%~2" & shift & shift & goto parse)
if "%~1"=="-M" (set "BUILD_MODES_SELECT=%~2" & set "M_FLAG_SET=1" & shift & shift & goto parse)
if "%~1"=="-m" (set "BUILD_MODE=%~2" & shift & shift & goto parse)
if /i "%~1"=="-b" (set "BUNDLE_NAME=%~2" & shift & shift & goto parse)
if /i "%~1"=="-a" (set "ABILITY_NAME=%~2" & shift & shift & goto parse)
......@@ -57,6 +58,7 @@ goto parse
if "!SHOW_HELP!"=="1" call :usage & popd & exit /b 0
if "!PLATFORM!"=="" set "PLATFORM=%DEFAULT_PLATFORM%"
if "!M_FLAG_SET!"=="0" call :prompt_build_modes_auto
if "!BUILD_MODES_SELECT!"=="" set "BUILD_MODES_SELECT=all"
set "HAS_DEBUG=0"
set "HAS_RELEASE=0"
......@@ -70,7 +72,7 @@ call :get_epoch START_TIME
echo Run environment configuration:
echo - Platform: %PLATFORM%
echo - Devices: from hdc list targets ^(see below^)
echo - Build modes: 由 -M 或打包前选择 ^(debug / release / debug+release^)
echo - Build modes: 由 -M 或菜单 1/2/3 ^(debug / release / debug+release^)
echo - Debug mode: %DEBUG_MODE%
echo - Bundle: %BUNDLE_NAME%
echo - Ability: %ABILITY_NAME%
......@@ -235,6 +237,26 @@ popd
if !SUCCESS_COUNT! lss !TOTAL_COUNT! exit /b 1
exit /b 0
:prompt_build_modes_auto
if /i "!RUNOHOS_NO_MENU!"=="1" (
set "BUILD_MODES_SELECT=all"
exit /b 0
)
echo.
echo 请选择打包类型(输入数字后回车):
echo 1 = 仅 debug
echo 2 = 仅 release
echo 3 = debug + release(全部)
set "BMENU="
set /p "BMENU=请输入 1 / 2 / 3 [默认 3]: "
if "!BMENU!"=="" set "BMENU=3"
if "!BMENU!"=="1" set "BUILD_MODES_SELECT=debug" & exit /b 0
if "!BMENU!"=="2" set "BUILD_MODES_SELECT=release" & exit /b 0
if "!BMENU!"=="3" set "BUILD_MODES_SELECT=all" & exit /b 0
echo 无效输入,使用默认 3(debug+release)
set "BUILD_MODES_SELECT=all"
exit /b 0
:get_epoch
set "_epf=%TEMP%\ro_epoch_!RANDOM!.txt"
set "RO_EPOCH=!_epf!"
......@@ -254,7 +276,7 @@ echo PLATFORM Build platform ^(default: %DEFAULT_PLATFORM%^)
echo Note devices from hdc list targets, no TARGET_ID argument
echo.
echo Options:
echo -M MODES 打包类型: debug ^| release ^| all ^(default: all,不交互避免影响后续命令^)
echo -M MODES 打包类型: debug ^| release ^| all ^(不传 -M 时提示输入 1/2/3;设 RUNOHOS_NO_MENU=1 则默认 all^)
echo -m MODE Build mode: debug or release ^(default: debug^)
echo -b BUNDLE Set bundle name ^(current: %DEFAULT_BUNDLE_NAME%^)
echo -a ABILITY Set Ability name ^(current: %DEFAULT_ABILITY_NAME%^)
......@@ -287,6 +309,9 @@ set "DEL_RETRY=0"
:cleanup_loop
if exist "!ENTRY_BASE!\builds" rmdir /s /q "!ENTRY_BASE!\builds" 2>nul
if exist "!ENTRY_BASE!\build" rmdir /s /q "!ENTRY_BASE!\build" 2>nul
if exist "!ENTRY_BASE!\libs\" (
for /r "!ENTRY_BASE!\libs" %%F in (*.so) do if exist "%%F" del /f /q "%%F" 2>nul
)
if exist "!ENTRY_BASE!\libs\arm64-v8a" rmdir /s /q "!ENTRY_BASE!\libs\arm64-v8a" 2>nul
if exist "!ENTRY_BASE!\libs\x86_64" rmdir /s /q "!ENTRY_BASE!\libs\x86_64" 2>nul
set "HAP_EXISTS=0"
......@@ -294,6 +319,11 @@ if exist "!HAP_PATH!" set "HAP_EXISTS=1"
set "LIBS_EXISTS=0"
if exist "!LIBS_ARM!" set "LIBS_EXISTS=1"
if exist "!LIBS_X86!" set "LIBS_EXISTS=1"
if exist "!ENTRY_BASE!\libs\" (
for /r "!ENTRY_BASE!\libs" %%F in (*.so) do (
if exist "%%F" set "LIBS_EXISTS=1"
)
)
if "!HAP_EXISTS!"=="0" if "!LIBS_EXISTS!"=="0" (
echo 删除后检测: HAP包=无, libs中间产物=无,已确认清理完成
goto cleanup_ok
......
......@@ -20,6 +20,7 @@ set -e
# Record script start time
START_TIME=$(date +%s)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# ====================== [1. Default Configuration and Parameter Parsing] ======================
DEFAULT_PLATFORM="ohosArm64"
......@@ -36,7 +37,8 @@ usage() {
echo " TARGET_ID Device ID (default: $DEFAULT_TARGET_ID)"
echo ""
echo "Options:"
echo " -m MODE Build mode: debug or release (default: debug)"
echo " -M MODES Build set: debug | release | all(不传 -M/-m 时在终端用 1/2/3 选;非终端或 RUNOHOS_NO_MENU=1 则默认 debug)"
echo " -m MODE 仅 debug 或 release;与 -M 二选一,传了 -m 则不再弹出菜单"
echo " -b BUNDLE Set bundle name (current: $DEFAULT_BUNDLE_NAME)"
echo " -a ABILITY Set Ability name (current: $DEFAULT_ABILITY_NAME)"
echo " -d MODE Debug mode: debug or attach (default: attach)"
......@@ -45,7 +47,9 @@ usage() {
echo ""
echo "Examples:"
echo " $0 ohosArm64 127.0.0.1:5555"
echo " $0 -m release # Release build"
echo " $0 -M all # debug then release on same device"
echo " $0 -M release # release only"
echo " $0 -m release # release only (shorthand)"
echo " $0 -b com.test.app -a MainAbility"
echo " $0 -p /path/to/external/ohos/project"
exit 0
......@@ -55,6 +59,9 @@ usage() {
BUNDLE_NAME=$DEFAULT_BUNDLE_NAME
ABILITY_NAME=$DEFAULT_ABILITY_NAME
BUILD_MODE="debug"
BUILD_MODES_SELECT=""
M_EXPLICIT=0
m_EXPLICIT=0
DEBUG_MODE="attach"
RED='\033[0;31m'
GREEN='\033[0;32m'
......@@ -63,7 +70,8 @@ NC='\033[0m' # No Color
POSITIONALS=()
while [[ $# -gt 0 ]]; do
case $1 in
-m) BUILD_MODE="$2"; shift 2 ;;
-M) M_EXPLICIT=1; BUILD_MODES_SELECT="$2"; shift 2 ;;
-m) m_EXPLICIT=1; BUILD_MODE="$2"; shift 2 ;;
-b) BUNDLE_NAME="$2"; shift 2 ;;
-a) ABILITY_NAME="$2"; shift 2 ;;
-d) DEBUG_MODE="$2"; shift 2 ;;
......@@ -83,10 +91,53 @@ done
PLATFORM=${POSITIONALS[0]:-$DEFAULT_PLATFORM}
TARGET_ID=${POSITIONALS[1]:-$DEFAULT_TARGET_ID}
pick_rundebug_build_modes() {
if [[ -n "${RUNOHOS_NO_MENU:-}" ]]; then
BUILD_MODES_SELECT="debug"
return
fi
if [[ ! -t 0 ]]; then
BUILD_MODES_SELECT="debug"
return
fi
echo ""
echo "请选择构建类型(输入数字后回车):"
echo " 1) 仅 debug"
echo " 2) 仅 release"
echo " 3) debug + release(先后各跑一轮)"
local _c
read -r -p "请输入 1 / 2 / 3 [默认 1]: " _c || true
_c=${_c:-1}
case "$_c" in
1) BUILD_MODES_SELECT=debug ;;
2) BUILD_MODES_SELECT=release ;;
3) BUILD_MODES_SELECT=all ;;
*) echo "无效输入,使用默认 1(debug)"; BUILD_MODES_SELECT=debug ;;
esac
}
if [[ "$M_EXPLICIT" -eq 1 ]]; then
:
elif [[ "$m_EXPLICIT" -eq 1 ]]; then
BUILD_MODES_SELECT="$BUILD_MODE"
else
pick_rundebug_build_modes
fi
case "$(echo "$BUILD_MODES_SELECT" | tr '[:upper:]' '[:lower:]')" in
debug) BUILD_MODES=(debug) ;;
release) BUILD_MODES=(release) ;;
all) BUILD_MODES=(debug release) ;;
*)
echo "Error: -M must be debug, release, or all (got: $BUILD_MODES_SELECT)"
exit 2
;;
esac
echo -e "\033[32m▶ Run environment configuration:\033[0m"
echo " - Platform: $PLATFORM"
echo " - Device: $TARGET_ID"
echo " - Build mode: $BUILD_MODE"
echo " - Build modes: ${BUILD_MODES[*]}"
echo " - Debug mode: $DEBUG_MODE"
echo " - Bundle: $BUNDLE_NAME"
echo " - Ability: $ABILITY_NAME"
......@@ -136,224 +187,185 @@ DEVECO_HOME="${DEVECO_HOME:-$DEVECO_PATH/Contents}"
HDC_BIN="$DEVECO_HOME/sdk/default/openharmony/toolchains/hdc"
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"
"$HDC_BIN" -t "$TARGET_ID" shell aa force-stop "$BUNDLE_NAME" >/dev/null 2>&1 || true
# ====================== [3. Gradle Build] ======================
echo "Working path: $(pwd)"
echo "Building OpenHarmony ARM64..."
if [ "$PLATFORM" = "ohosArm64" ]; then
# Execute Gradle build in project root
if [ "$BUILD_MODE" = "release" ]; then
if [ -n "$LOCAL_OHOS_PATH" ]; then
echo "Using external OHOS path: $LOCAL_OHOS_PATH"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else
echo "/gradlew :composeApp:publishReleaseBinariesToHarmonyApp"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
fi
else
if [ -n "$LOCAL_OHOS_PATH" ]; then
echo "Using external OHOS path: $LOCAL_OHOS_PATH"
./gradlew :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else
echo "/gradlew :composeApp:publishDebugBinariesToHarmonyApp"
./gradlew :composeApp:publishDebugBinariesToHarmonyApp
fi
fi
elif [ "$PLATFORM" = "iosSimulatorArm64" ]; then
if [ "$PLATFORM" = "iosSimulatorArm64" ]; then
cd "$SCRIPT_DIR"
echo "Working path: $(pwd)"
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
else
echo -e "\033[31mError: Unsupported platform '$PLATFORM'\033[0m"
exit 4
exit 0
fi
# SO packaging end time
HAP_START_TIME=$(date +%s)
# --- Subsequent install logic (hdc install etc.) ---
# ====================== [4. HAP Package Build] ======================
# Switch to harmonyApp directory for subsequent OHOS commands
# Use external path if specified, otherwise use default harmonyApp directory
if [ -n "$LOCAL_OHOS_PATH" ]; then
HARMONY_APP_DIR="$LOCAL_OHOS_PATH"
else
HARMONY_APP_DIR="harmonyApp"
HARMONY_APP_DIR="$SCRIPT_DIR/harmonyApp"
fi
if [ ! -d "$HARMONY_APP_DIR" ]; then
echo -e "\033[31mError: harmonyApp directory not found: $HARMONY_APP_DIR\033[0m"
exit 4
fi
cd "$HARMONY_APP_DIR"
echo "Switched to harmonyApp directory: $(pwd)"
echo "Running Hvigor sync and HAP packaging (buildMode=$BUILD_MODE)..."
ohpm install --all
node "$DEVECO_HOME/tools/hvigor/bin/hvigorw.js" --sync -p product=default -p buildMode="$BUILD_MODE" --analyze=normal --parallel --incremental --daemon
if [ "$BUILD_MODE" = "release" ]; then
node "$DEVECO_HOME/tools/hvigor/bin/hvigorw.js" --mode module -p module=entry -p product=default -p buildMode=release -p requiredDeviceType=phone assembleHap compileNative --analyze=normal --parallel --incremental --daemon
else
node "$DEVECO_HOME/tools/hvigor/bin/hvigorw.js" --mode module -p module=entry@default -p product=default -p buildMode=debug -p requiredDeviceType=phone assembleHap --analyze=normal --parallel --incremental --daemon
fi
# ====================== [5. Install and Push Debug Components] ======================
AVAILABLE_TARGETS=$("$HDC_BIN" list targets)
HAP_DIR="./entry/build/default/outputs/default"
SIGNED_HAP="entry-default-signed.hap"
HAP_FILE="$HAP_DIR/$SIGNED_HAP"
echo "Package path: $HAP_DIR/$SIGNED_HAP"
# Check if signed HAP package exists
if [ ! -f "$HAP_FILE" ]; then
echo -e "\033[31mError: Signed HAP package not found!\033[0m"
for BUILD_MODE in "${BUILD_MODES[@]}"; do
echo ""
echo -e "\033[33mExpected path:\033[0m"
echo " $HARMONY_APP_DIR/entry/build/default/outputs/default/entry-default-signed.hap"
echo ""
echo -e "\033[33mPossible causes:\033[0m"
echo " • HAP package has not been built yet"
echo " • Build process failed"
echo " • HAP package is not signed"
echo ""
echo -e "\033[36mSuggested actions:\033[0m"
echo " 1. Check the build logs above for errors"
echo " 2. Verify DevEco Studio signing configuration is correct"
echo " 3. Manually build and sign HAP package in DevEco Studio"
echo " 4. Check files in entry/build/default/outputs/default/ directory"
exit 6
fi
AVAILABLE_TARGETS=$("$HDC_BIN" list targets)
if ! echo "$AVAILABLE_TARGETS" | grep -q "$TARGET_ID"; then
echo -e "\033[31mError: Device $TARGET_ID is offline!\033[0m"
exit 5
fi
echo "============================================================"
echo " buildMode=$BUILD_MODE "
echo "============================================================"
echo "Pushing debug components and installing HAP..."
echo " - Device: $TARGET_ID"
# Install HAP (using temp directory)
REMOTE_HAP_DIR="/data/local/tmp/debug_install"
"$HDC_BIN" -t "$TARGET_ID" shell mkdir -p "$REMOTE_HAP_DIR"
"$HDC_BIN" -t "$TARGET_ID" file send "$HAP_FILE" "$REMOTE_HAP_DIR"
INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1)
sleep 1
INSTALL_RESULT=$?
echo "Install status: $INSTALL_OUTPUT"
if echo "$INSTALL_OUTPUT" | grep -qE "failed"; then
echo "Install failed detected, uninstalling and reinstalling..."
"$HDC_BIN" -t "$TARGET_ID" shell bm uninstall -n "$BUNDLE_NAME" >/dev/null 2>&1 || true
sleep 5
INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1)
sleep 5
fi
# ====================== [6. App Launch and Debug Mount] ======================
echo -e "\033[33mLaunching app and starting debug listener...\033[0m"
"$HDC_BIN" -t "$TARGET_ID" shell rm -rf "$REMOTE_HAP_DIR"
sleep 1
# Get system version
#SYSTEM_VERSION=$($HDC_BIN -t $TARGET_ID shell param get const.ohos.apiversion 2>/dev/null || echo "unknown")
#echo "Detected system version: $SYSTEM_VERSION"
# Check screen lock status and prompt
echo ""
echo -e "\033[33m⚠ Important:\033[0m"
echo -e " If device screen is locked, please unlock it manually"
echo -e " System cannot auto-unlock in developer mode (security restriction)"
echo ""
# Step 1: Start app (with -D if debug mode enabled)
echo " -> Executing aa start (launch app)..."
if [ "$DEBUG_MODE" = "debug" ]; then
echo " -> Debug mode, starting with -D flag"
AA_START_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell aa start -a "$ABILITY_NAME" -b "$BUNDLE_NAME" -D 2>&1)
else
echo " -> Attach mode, starting without -D flag"
AA_START_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell aa start -a "$ABILITY_NAME" -b "$BUNDLE_NAME" 2>&1)
fi
# Package push complete time
END_TIME=$(date +%s)
"$HDC_BIN" -t "$TARGET_ID" shell aa force-stop "$BUNDLE_NAME" >/dev/null 2>&1 || true
AA_START_RESULT=$?
# Check if screen lock error
if echo "$AA_START_OUTPUT" | grep -q "10106102\|screen is locked"; then
echo -e "\033[31mError: Device screen is locked!\033[0m"
echo ""
echo -e "\033[33mPlease follow these steps:\033[0m"
echo " 1. Manually unlock device screen"
echo " 2. Keep screen awake (recommended for dev: Settings -> Display & Brightness -> Screen timeout -> Never)"
echo " 3. Run this script again"
echo ""
echo -e "\033[36mNote: Auto-unlock is not available in developer mode (system security restriction)\033[0m"
exit 1
fi
# If start failed but not screen lock error, continue anyway
if [ $AA_START_RESULT -ne 0 ]; then
echo -e "\033[33m⚠ App start command returned non-zero exit code, but continuing...\033[0m"
fi
# Push lldb-server
"$HDC_BIN" -t "$TARGET_ID" shell mkdir -p /data/local/tmp/debugserver
"$HDC_BIN" -t "$TARGET_ID" shell rm -f /data/local/tmp/debugserver/lldb-server
"$HDC_BIN" -t "$TARGET_ID" file send "$DEVECO_HOME/sdk/default/hms/native/lldb/aarch64-linux-ohos/lldb-server" /data/local/tmp/debugserver
"$HDC_BIN" -t "$TARGET_ID" shell chmod 755 /data/local/tmp/debugserver/lldb-server
# Step 2: Get app PID
get_pid_func() {
"$HDC_BIN" -t "$TARGET_ID" shell "pidof $BUNDLE_NAME" 2>/dev/null | tr -d '\r' | tr -d '\n' | awk '{print $1}'
}
# ====================== [3. Gradle Build] ======================
cd "$SCRIPT_DIR"
echo "Working path: $(pwd)"
echo "Building OpenHarmony ($PLATFORM)..."
if [ "$PLATFORM" = "ohosArm64" ]; then
if [ "$BUILD_MODE" = "release" ]; then
if [ -n "$LOCAL_OHOS_PATH" ]; then
echo "Using external OHOS path: $LOCAL_OHOS_PATH"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
fi
else
if [ -n "$LOCAL_OHOS_PATH" ]; then
echo "Using external OHOS path: $LOCAL_OHOS_PATH"
./gradlew :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else
./gradlew :composeApp:publishDebugBinariesToHarmonyApp
fi
fi
else
echo -e "\033[31mError: Unsupported platform '$PLATFORM'\033[0m"
exit 4
fi
HAP_START_TIME=$(date +%s)
# ====================== [4. HAP Package Build] ======================
cd "$HARMONY_APP_DIR"
echo "Switched to harmonyApp directory: $(pwd)"
echo "Running Hvigor sync and HAP packaging (buildMode=$BUILD_MODE)..."
ohpm install --all
node "$DEVECO_HOME/tools/hvigor/bin/hvigorw.js" --sync -p product=default -p buildMode="$BUILD_MODE" --analyze=normal --parallel --incremental --daemon
if [ "$BUILD_MODE" = "release" ]; then
node "$DEVECO_HOME/tools/hvigor/bin/hvigorw.js" --mode module -p module=entry -p product=default -p buildMode=release -p requiredDeviceType=phone assembleHap compileNative --analyze=normal --parallel --incremental --daemon
else
node "$DEVECO_HOME/tools/hvigor/bin/hvigorw.js" --mode module -p module=entry@default -p product=default -p buildMode=debug -p requiredDeviceType=phone assembleHap --analyze=normal --parallel --incremental --daemon
fi
echo -n "Waiting for app to start"
MAX_WAIT=20
COUNT=0
APP_PID=""
while [ $COUNT -lt $MAX_WAIT ]; do
APP_PID=$(get_pid_func)
if [[ "$APP_PID" =~ ^[0-9]+$ ]]; then
echo -e "\nApp started (PID: $APP_PID)"
break
# ====================== [5. Install and Push Debug Components] ======================
AVAILABLE_TARGETS=$("$HDC_BIN" list targets)
HAP_DIR="./entry/build/default/outputs/default"
SIGNED_HAP="entry-default-signed.hap"
HAP_FILE="$HAP_DIR/$SIGNED_HAP"
echo "Package path: $HAP_DIR/$SIGNED_HAP"
if [ ! -f "$HAP_FILE" ]; then
echo -e "\033[31mError: Signed HAP package not found!\033[0m"
echo ""
echo -e "\033[33mExpected path:\033[0m"
echo " $HARMONY_APP_DIR/entry/build/default/outputs/default/entry-default-signed.hap"
echo ""
exit 6
fi
AVAILABLE_TARGETS=$("$HDC_BIN" list targets)
if ! echo "$AVAILABLE_TARGETS" | grep -q "$TARGET_ID"; then
echo -e "\033[31mError: Device $TARGET_ID is offline!\033[0m"
exit 5
fi
echo -n "."
echo "Pushing debug components and installing HAP..."
echo " - Device: $TARGET_ID"
REMOTE_HAP_DIR="/data/local/tmp/debug_install"
"$HDC_BIN" -t "$TARGET_ID" shell mkdir -p "$REMOTE_HAP_DIR"
"$HDC_BIN" -t "$TARGET_ID" file send "$HAP_FILE" "$REMOTE_HAP_DIR"
INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1)
sleep 1
echo "Install status: $INSTALL_OUTPUT"
if echo "$INSTALL_OUTPUT" | grep -qE "failed"; then
echo "Install failed detected, uninstalling and reinstalling..."
"$HDC_BIN" -t "$TARGET_ID" shell bm uninstall -n "$BUNDLE_NAME" >/dev/null 2>&1 || true
sleep 5
INSTALL_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell bm install -p "$REMOTE_HAP_DIR/$SIGNED_HAP" 2>&1)
sleep 5
fi
# ====================== [6. App Launch and Debug Mount] ======================
echo -e "\033[33mLaunching app and starting debug listener...\033[0m"
"$HDC_BIN" -t "$TARGET_ID" shell rm -rf "$REMOTE_HAP_DIR"
sleep 1
let COUNT=COUNT+1
done
if [ -z "$APP_PID" ]; then
echo -e "\n\033[31mFailed: App did not start within expected time!\033[0m"
echo ""
echo -e "\033[33mPossible causes:\033[0m"
echo " • Device screen is locked (most common)"
echo " • App installation failed"
echo " • Device performance issue causing startup timeout"
echo -e "\033[33m⚠ Important:\033[0m"
echo -e " If device screen is locked, please unlock it manually"
echo ""
echo -e "\033[36mSuggested actions:\033[0m"
echo " 1. Ensure device screen is unlocked"
echo " 2. Check device connection: hdc list targets"
echo " 3. Manually launch app to verify it runs"
exit 1
fi
"$HDC_BIN" -t "$TARGET_ID" shell aa attach -b "$BUNDLE_NAME"
# Step 3: Start lldb-server and attach to process
echo " -> Starting lldb-server and attaching to process (PID: $APP_PID)..."
"$HDC_BIN" -t "$TARGET_ID" shell aa process -a "$ABILITY_NAME" -b "$BUNDLE_NAME" -D "/data/local/tmp/debugserver/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
echo "------------------------------------------------------------"
echo -e "\033[32mBuild, install and app launch completed!\033[0m"
# Calculate total duration
ELAPSED_TIME=$((END_TIME - START_TIME))
MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60))
echo -e "App info:"
echo -e " - Bundle: $BUNDLE_NAME"
echo -e " - PID: $APP_PID"
echo -e " - Device: $TARGET_ID"
ELAPSED_TIME=$((HAP_START_TIME - START_TIME))
MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60))
echo -e " - SO build time: ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)"
ELAPSED_TIME=$((END_TIME - HAP_START_TIME))
MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60))
echo -e " - HAP package and push time: ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)"
ELAPSED_TIME=$((END_TIME - START_TIME))
MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60))
echo -e " - Total time: ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)"
echo -e "\033[36mNote: You can now connect via LLDB to debug on the device\033[0m"
echo "------------------------------------------------------------"
\ No newline at end of file
echo " -> Executing aa start (launch app)..."
if [ "$DEBUG_MODE" = "debug" ]; then
echo " -> Debug mode, starting with -D flag"
AA_START_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell aa start -a "$ABILITY_NAME" -b "$BUNDLE_NAME" -D 2>&1)
else
echo " -> Attach mode, starting without -D flag"
AA_START_OUTPUT=$("$HDC_BIN" -t "$TARGET_ID" shell aa start -a "$ABILITY_NAME" -b "$BUNDLE_NAME" 2>&1)
fi
END_TIME=$(date +%s)
AA_START_RESULT=$?
if echo "$AA_START_OUTPUT" | grep -q "10106102\|screen is locked"; then
echo -e "\033[31mError: Device screen is locked!\033[0m"
exit 1
fi
if [ $AA_START_RESULT -ne 0 ]; then
echo -e "\033[33m⚠ App start command returned non-zero exit code, but continuing...\033[0m"
fi
"$HDC_BIN" -t "$TARGET_ID" shell mkdir -p /data/local/tmp/debugserver
"$HDC_BIN" -t "$TARGET_ID" shell rm -f /data/local/tmp/debugserver/lldb-server
"$HDC_BIN" -t "$TARGET_ID" file send "$DEVECO_HOME/sdk/default/hms/native/lldb/aarch64-linux-ohos/lldb-server" /data/local/tmp/debugserver
"$HDC_BIN" -t "$TARGET_ID" shell chmod 755 /data/local/tmp/debugserver/lldb-server
get_pid_func() {
"$HDC_BIN" -t "$TARGET_ID" shell "pidof $BUNDLE_NAME" 2>/dev/null | tr -d '\r' | tr -d '\n' | awk '{print $1}'
}
echo -n "Waiting for app to start"
MAX_WAIT=20
COUNT=0
APP_PID=""
while [ $COUNT -lt $MAX_WAIT ]; do
APP_PID=$(get_pid_func)
if [[ "$APP_PID" =~ ^[0-9]+$ ]]; then
echo -e "\nApp started (PID: $APP_PID)"
break
fi
echo -n "."
sleep 1
let COUNT=COUNT+1
done
if [ -z "$APP_PID" ]; then
echo -e "\n\033[31mFailed: App did not start within expected time!\033[0m"
exit 1
fi
"$HDC_BIN" -t "$TARGET_ID" shell aa attach -b "$BUNDLE_NAME"
echo " -> Starting lldb-server and attaching to process (PID: $APP_PID)..."
"$HDC_BIN" -t "$TARGET_ID" shell aa process -a "$ABILITY_NAME" -b "$BUNDLE_NAME" -D "/data/local/tmp/debugserver/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
echo "------------------------------------------------------------"
echo -e "\033[32mRound completed (buildMode=$BUILD_MODE)\033[0m"
echo -e "App info:"
echo -e " - Bundle: $BUNDLE_NAME"
echo -e " - PID: $APP_PID"
echo -e " - Device: $TARGET_ID"
ELAPSED_TIME=$((HAP_START_TIME - START_TIME))
MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60))
echo -e " - SO build time (from script start): ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)"
ELAPSED_TIME=$((END_TIME - HAP_START_TIME))
MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60))
echo -e " - HAP package and push (this round): ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)"
echo -e "\033[36mNote: You can connect LLDB after each round; last round is the final install on device.\033[0m"
echo "------------------------------------------------------------"
done
echo -e "\033[32mAll selected build modes finished: ${BUILD_MODES[*]}\033[0m"
\ No newline at end of file
@echo off
setlocal EnableDelayedExpansion
REM Run OHOS app and debug on Windows (paths and commands differ from Mac)
REM Run OHOS app and debug on Windows
REM Usage: runDebugOhosApp-Win.bat [options] [PLATFORM] [TARGET_ID]
REM Options: -b BUNDLE -a ABILITY -p LOCAL_OHOS_PATH
REM Example: runDebugOhosApp-Win.bat ohosArm64 127.0.0.1:5555
REM -M / -m 二选一;都不传时在控制台用 1/2/3 选择。RUNOHOS_NO_MENU=1 则默认 debug。
set "SCRIPT_DIR=%~dp0"
set "PROJECT_ROOT=%~dp0.."
set DEFAULT_PLATFORM=ohosArm64
set DEFAULT_TARGET_ID=127.0.0.1:5555
set DEFAULT_BUNDLE_NAME=com.example.harmonyapp
......@@ -12,45 +13,63 @@ set DEFAULT_ABILITY_NAME=EntryAbility
set BUNDLE_NAME=%DEFAULT_BUNDLE_NAME%
set ABILITY_NAME=%DEFAULT_ABILITY_NAME%
set BUILD_MODE=debug
set BUILD_MODES_SELECT=
set M_WAS_SET=0
set m_was_set=0
set DEBUG_MODE=attach
set LOCAL_OHOS_PATH=
set PLATFORM=
set TARGET_ID=
REM Parse options (supports options in any position, e.g. ohosArm64 62Q0226107024702 -m release)
:parse
if "%~1"=="" goto done_parse
if "%~1"=="-m" (set "BUILD_MODE=%~2" & shift & shift & goto parse)
if /i "%~1"=="-M" (set "BUILD_MODES_SELECT=%~2" & set "M_WAS_SET=1" & shift & shift & goto parse)
if "%~1"=="-m" (set "BUILD_MODE=%~2" & set "m_was_set=1" & shift & shift & goto parse)
if "%~1"=="-b" (set "BUNDLE_NAME=%~2" & shift & shift & goto parse)
if "%~1"=="-a" (set "ABILITY_NAME=%~2" & shift & shift & goto parse)
if "%~1"=="-d" (set "DEBUG_MODE=%~2" & shift & shift & goto parse)
if "%~1"=="-p" (set "LOCAL_OHOS_PATH=%~2" & shift & shift & goto parse)
if "%~1"=="-h" goto show_help
REM Positional: first=PLATFORM, second=TARGET_ID
if "!PLATFORM!"=="" (set "PLATFORM=%~1") else if "!TARGET_ID!"=="" (set "TARGET_ID=%~1")
shift
goto parse
:done_parse
if "!PLATFORM!"=="" set "PLATFORM=%DEFAULT_PLATFORM%"
if "!TARGET_ID!"=="" set "TARGET_ID=%DEFAULT_TARGET_ID%"
REM Record script start time (epoch seconds for elapsed calculation)
if "!M_WAS_SET!"=="1" (
rem BUILD_MODES_SELECT from -M
) else if "!m_was_set!"=="1" (
set "BUILD_MODES_SELECT=!BUILD_MODE!"
) else (
call :prompt_debug_build_modes_win
)
if "!BUILD_MODES_SELECT!"=="" set "BUILD_MODES_SELECT=debug"
set "HAS_DEBUG=0"
set "HAS_RELEASE=0"
if /i "!BUILD_MODES_SELECT!"=="debug" set "HAS_DEBUG=1"
if /i "!BUILD_MODES_SELECT!"=="release" set "HAS_RELEASE=1"
if /i "!BUILD_MODES_SELECT!"=="all" set "HAS_DEBUG=1" & set "HAS_RELEASE=1"
if "!HAS_DEBUG!!HAS_RELEASE!"=="00" set "HAS_DEBUG=1" & set "HAS_RELEASE=1"
for /f %%t in ('powershell -NoProfile -Command "[int][double]::Parse((Get-Date -UFormat '%%s'))"') do set START_TIME=%%t
echo Run environment configuration:
echo - Platform: %PLATFORM%
echo - Device: %TARGET_ID%
echo - Build mode: %BUILD_MODE%
echo - Build modes:
if "!HAS_DEBUG!"=="1" echo debug
if "!HAS_RELEASE!"=="1" echo release
echo - Debug mode: %DEBUG_MODE%
echo - Bundle: %BUNDLE_NAME%
echo - Ability: %ABILITY_NAME%
if not "%LOCAL_OHOS_PATH%"=="" echo - External OHOS path: %LOCAL_OHOS_PATH%
if not "!LOCAL_OHOS_PATH!"=="" echo - External OHOS path: !LOCAL_OHOS_PATH!
echo ------------------------------------------------------------
REM ====================== [2. Environment Path and SDK Configuration] ======================
REM DevEco/SDK path: OHOS_SDK_HOME env or default Windows location
if not "%OHOS_SDK_HOME%"=="" (
set "SDK_HOME=%OHOS_SDK_HOME%"
if not "!OHOS_SDK_HOME!"=="" (
set "SDK_HOME=!OHOS_SDK_HOME!"
) else (
if exist "C:\Program Files\Huawei\DevEco Studio" (
set "SDK_HOME=C:\Program Files\Huawei\DevEco Studio"
......@@ -61,245 +80,252 @@ if not "%OHOS_SDK_HOME%"=="" (
exit /b 1
)
)
echo DevEco Studio Path: %SDK_HOME%
echo DevEco Studio Path: !SDK_HOME!
echo Checking environment configuration...
set "MIN_VERSION=6.0.0"
set "PRODUCT_INFO=%SDK_HOME%\product-info.json"
if exist "%PRODUCT_INFO%" (
for /f "tokens=*" %%v in ('powershell -NoProfile -Command "(Get-Content '%PRODUCT_INFO%' | ConvertFrom-Json).version"') do set "CURRENT_VERSION=%%v"
set "PRODUCT_INFO=!SDK_HOME!\product-info.json"
if exist "!PRODUCT_INFO!" (
for /f "tokens=*" %%v in ('powershell -NoProfile -Command "(Get-Content '!PRODUCT_INFO!' ^| ConvertFrom-Json).version"') do set "CURRENT_VERSION=%%v"
) else (
echo Warning: product-info.json not found, skipping version check.
set "CURRENT_VERSION=unknown"
)
if not "%CURRENT_VERSION%"=="unknown" (
echo Current DevEco version: %CURRENT_VERSION%
echo Minimum required version: %MIN_VERSION%
for /f "tokens=1,2 delims=." %%a in ("%CURRENT_VERSION%") do (
set "CUR_MAJOR=%%a"
set "CUR_MINOR=%%b"
)
for /f "tokens=1,2 delims=." %%a in ("%MIN_VERSION%") do (
set "REQ_MAJOR=%%a"
set "REQ_MINOR=%%b"
)
if not "!CURRENT_VERSION!"=="unknown" (
echo Current DevEco version: !CURRENT_VERSION!
echo Minimum required version: !MIN_VERSION!
for /f "tokens=1,2 delims=." %%a in ("!CURRENT_VERSION!") do (set "CUR_MAJOR=%%a" & set "CUR_MINOR=%%b")
for /f "tokens=1,2 delims=." %%a in ("!MIN_VERSION!") do (set "REQ_MAJOR=%%a" & set "REQ_MINOR=%%b")
if !CUR_MAJOR! lss !REQ_MAJOR! (
echo -------------------------------------------------------
echo Error: DevEco version is too low!
echo Current version: %CURRENT_VERSION%
echo Minimum required: %MIN_VERSION%+
echo Please upgrade DevEco Studio and run this script again.
echo -------------------------------------------------------
exit /b 5
)
if !CUR_MAJOR! equ !REQ_MAJOR! if !CUR_MINOR! lss !REQ_MINOR! (
echo -------------------------------------------------------
echo Error: DevEco version is too low!
echo Current version: %CURRENT_VERSION%
echo Minimum required: %MIN_VERSION%+
echo Please upgrade DevEco Studio and run this script again.
echo -------------------------------------------------------
exit /b 5
)
echo DevEco version meets requirements (%CURRENT_VERSION%)
echo DevEco version meets requirements ^(!CURRENT_VERSION!^)
)
set "HDC_BIN=%SDK_HOME%\sdk\default\openharmony\toolchains\hdc.exe"
set "DEVECO_SDK_HOME=%SDK_HOME%\sdk"
set "PATH=%SDK_HOME%\tools\node;%SDK_HOME%\tools\ohpm\bin;%SDK_HOME%\tools\hvigor\bin;%DEVECO_SDK_HOME%;%PATH%"
set "HDC_BIN=!SDK_HOME!\sdk\default\openharmony\toolchains\hdc.exe"
set "DEVECO_SDK_HOME=!SDK_HOME!\sdk"
set "PATH=!SDK_HOME!\tools\node;!SDK_HOME!\tools\ohpm\bin;!SDK_HOME!\tools\hvigor\bin;!DEVECO_SDK_HOME!;!PATH!"
if not exist "%HDC_BIN%" (
echo Error: hdc not found at %HDC_BIN%
if not exist "!HDC_BIN!" (
echo Error: hdc not found at !HDC_BIN!
exit /b 1
)
"%HDC_BIN%" -t %TARGET_ID% shell aa force-stop %BUNDLE_NAME% 2>nul
REM ====================== Gradle Build ======================
echo Working path: %CD%
echo Building OpenHarmony (%PLATFORM%)...
if not "!LOCAL_OHOS_PATH!"=="" (
set "HARMONY_APP_DIR=!LOCAL_OHOS_PATH!"
) else (
set "HARMONY_APP_DIR=!PROJECT_ROOT!\harmonyApp"
)
if not exist "!HARMONY_APP_DIR!" (
echo Error: harmonyApp directory not found: !HARMONY_APP_DIR!
exit /b 4
)
cd /d "!PROJECT_ROOT!"
echo Project root: !CD!
if "!HAS_DEBUG!"=="1" (
set "BUILD_MODE=debug"
call :debug_one_mode
if errorlevel 1 exit /b 1
)
if "!HAS_RELEASE!"=="1" (
set "BUILD_MODE=release"
call :debug_one_mode
if errorlevel 1 exit /b 1
)
echo.
echo All selected build modes finished.
exit /b 0
:debug_one_mode
echo.
echo ============================================================
echo buildMode=!BUILD_MODE!
echo ============================================================
"!HDC_BIN!" -t !TARGET_ID! shell aa force-stop !BUNDLE_NAME! 2>nul
echo Working path: !CD!
echo Building OpenHarmony ^(!PLATFORM!^)...
if "%PLATFORM%"=="ohosArm64" (
REM for ohosArm64 ohos in windows x86_64 build
if "%BUILD_MODE%"=="release" (
if not "%LOCAL_OHOS_PATH%"=="" (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="%LOCAL_OHOS_PATH%"
if "!PLATFORM!"=="ohosArm64" (
if "!BUILD_MODE!"=="release" (
if not "!LOCAL_OHOS_PATH!"=="" (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="!LOCAL_OHOS_PATH!"
) else (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp
)
) else (
if not "%LOCAL_OHOS_PATH%"=="" (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="%LOCAL_OHOS_PATH%"
if not "!LOCAL_OHOS_PATH!"=="" (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="!LOCAL_OHOS_PATH!"
) else (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp
)
)
) else if "%PLATFORM%"=="ohosX86_64" (
REM for simulate ohos in windows x86_64
if "%BUILD_MODE%"=="release" (
if not "%LOCAL_OHOS_PATH%"=="" (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="%LOCAL_OHOS_PATH%"
) else if "!PLATFORM!"=="ohosX86_64" (
if "!BUILD_MODE!"=="release" (
if not "!LOCAL_OHOS_PATH!"=="" (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="!LOCAL_OHOS_PATH!"
) else (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp
)
) else (
if not "%LOCAL_OHOS_PATH%"=="" (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="%LOCAL_OHOS_PATH%"
if not "!LOCAL_OHOS_PATH!"=="" (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp -PharmonyAppPath="!LOCAL_OHOS_PATH!"
) else (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp
)
)
) else (
echo Error: Unsupported platform '%PLATFORM%'
echo Error: Unsupported platform '!PLATFORM!'
exit /b 4
)
if errorlevel 1 exit /b %errorlevel%
if errorlevel 1 exit /b 1
REM SO packaging end time / HAP build start time
for /f %%t in ('powershell -NoProfile -Command "[int][double]::Parse((Get-Date -UFormat '%%s'))"') do set HAP_START_TIME=%%t
REM ====================== HAP build ======================
if not "%LOCAL_OHOS_PATH%"=="" (
set "HARMONY_APP_DIR=%LOCAL_OHOS_PATH%"
) else (
set "HARMONY_APP_DIR=harmonyApp"
)
if not exist "%HARMONY_APP_DIR%" (
echo Error: harmonyApp directory not found: %HARMONY_APP_DIR%
exit /b 4
)
cd /d "%HARMONY_APP_DIR%"
echo Switched to harmonyApp directory: %CD%
echo Running ohpm and Hvigor...
cd /d "!HARMONY_APP_DIR!"
echo Switched to harmonyApp directory: !CD!
echo Running ohpm and Hvigor ^(buildMode=!BUILD_MODE!^)...
call ohpm install --all
if errorlevel 1 (echo ohpm install failed & exit /b 1)
call node "%SDK_HOME%\tools\hvigor\bin\hvigorw.js" --sync -p product=default -p buildMode=%BUILD_MODE% --analyze=normal --parallel --incremental --daemon
if "%BUILD_MODE%"=="release" (
call node "%SDK_HOME%\tools\hvigor\bin\hvigorw.js" --mode module -p module=entry -p product=default -p buildMode=release -p requiredDeviceType=phone assembleHap compileNative --analyze=normal --parallel --incremental --daemon
call node "!SDK_HOME!\tools\hvigor\bin\hvigorw.js" --sync -p product=default -p buildMode=!BUILD_MODE! --analyze=normal --parallel --incremental --daemon
if "!BUILD_MODE!"=="release" (
call node "!SDK_HOME!\tools\hvigor\bin\hvigorw.js" --mode module -p module=entry -p product=default -p buildMode=release -p requiredDeviceType=phone assembleHap compileNative --analyze=normal --parallel --incremental --daemon
) else (
call node "%SDK_HOME%\tools\hvigor\bin\hvigorw.js" --mode module -p module=entry@default -p product=default -p buildMode=debug -p requiredDeviceType=phone assembleHap --analyze=normal --parallel --incremental --daemon
call node "!SDK_HOME!\tools\hvigor\bin\hvigorw.js" --mode module -p module=entry@default -p product=default -p buildMode=debug -p requiredDeviceType=phone assembleHap --analyze=normal --parallel --incremental --daemon
)
if errorlevel 1 (echo Hvigor build failed & exit /b 1)
REM ====================== Install HAP ======================
set "HAP_DIR=entry\build\default\outputs\default"
set "SIGNED_HAP=entry-default-signed.hap"
set "HAP_FILE=%HAP_DIR%\%SIGNED_HAP%"
if not exist "%HAP_FILE%" (
echo Error: Signed HAP package not found!
echo.
echo Expected path: %HARMONY_APP_DIR%\%HAP_DIR%\%SIGNED_HAP%
echo.
echo Possible causes: build not done, build failed, or HAP not signed.
echo Suggested: check build logs, verify signing in DevEco Studio.
set "HAP_FILE=!HAP_DIR!\!SIGNED_HAP!"
if not exist "!HAP_FILE!" (
echo Error: Signed HAP package not found: !HAP_FILE!
exit /b 6
)
set DEVICE_FOUND=
for /f "delims=" %%i in ('"%HDC_BIN%" list targets 2^>nul') do echo %%i | findstr /C:"%TARGET_ID%" >nul && set DEVICE_FOUND=1
set "DEVICE_FOUND="
for /f "delims=" %%i in ('"!HDC_BIN!" list targets 2^>nul') do echo %%i | findstr /C:"!TARGET_ID!" >nul && set "DEVICE_FOUND=1"
if not defined DEVICE_FOUND (
echo Error: Device %TARGET_ID% is offline!
echo Error: Device !TARGET_ID! is offline!
exit /b 5
)
echo Pushing debug components and installing HAP...
echo - Device: %TARGET_ID%
set "REMOTE_HAP_DIR=/data/local/tmp/debug_install"
set "REMOTE_HAP_PATH=%REMOTE_HAP_DIR%/%SIGNED_HAP%"
"%HDC_BIN%" -t %TARGET_ID% shell mkdir -p %REMOTE_HAP_DIR%
"%HDC_BIN%" -t %TARGET_ID% file send "%HAP_FILE%" %REMOTE_HAP_DIR%
set "REMOTE_HAP_PATH=!REMOTE_HAP_DIR!/!SIGNED_HAP!"
"!HDC_BIN!" -t !TARGET_ID! shell mkdir -p !REMOTE_HAP_DIR!
"!HDC_BIN!" -t !TARGET_ID! file send "!HAP_FILE!" !REMOTE_HAP_DIR!
"%HDC_BIN%" -t %TARGET_ID% shell bm install -p "%REMOTE_HAP_PATH%" 2>nul
"!HDC_BIN!" -t !TARGET_ID! shell bm install -p "!REMOTE_HAP_PATH!" 2>nul
if errorlevel 1 (
echo Reinstall: uninstall then install again...
"%HDC_BIN%" -t %TARGET_ID% shell bm uninstall -n %BUNDLE_NAME% 2>nul
"!HDC_BIN!" -t !TARGET_ID! shell bm uninstall -n !BUNDLE_NAME! 2>nul
timeout /t 5 /nobreak >nul
"%HDC_BIN%" -t %TARGET_ID% shell bm install -p "%REMOTE_HAP_PATH%"
"!HDC_BIN!" -t !TARGET_ID! shell bm install -p "!REMOTE_HAP_PATH!"
timeout /t 5 /nobreak >nul
)
REM ====================== Launch and LLDB ======================
"%HDC_BIN%" -t %TARGET_ID% shell rm -rf %REMOTE_HAP_DIR%
"!HDC_BIN!" -t !TARGET_ID! shell rm -rf !REMOTE_HAP_DIR!
timeout /t 1 /nobreak >nul
echo Launching app and starting debug listener...
echo If device screen is locked, please unlock it manually.
echo.
if "%DEBUG_MODE%"=="debug" (
if "!DEBUG_MODE!"=="debug" (
echo Debug mode, starting with -D flag
"%HDC_BIN%" -t %TARGET_ID% shell aa start -a %ABILITY_NAME% -b %BUNDLE_NAME% -D
"!HDC_BIN!" -t !TARGET_ID! shell aa start -a !ABILITY_NAME! -b !BUNDLE_NAME! -D
) else (
echo Attach mode, starting without -D flag
"%HDC_BIN%" -t %TARGET_ID% shell aa start -a %ABILITY_NAME% -b %BUNDLE_NAME%
"!HDC_BIN!" -t !TARGET_ID! shell aa start -a !ABILITY_NAME! -b !BUNDLE_NAME!
)
REM Package push complete time
for /f %%t in ('powershell -NoProfile -Command "[int][double]::Parse((Get-Date -UFormat '%%s'))"') do set END_TIME=%%t
"%HDC_BIN%" -t %TARGET_ID% shell rm -rf /data/local/tmp/debugserver/lldb-server
"%HDC_BIN%" -t %TARGET_ID% shell mkdir -p /data/local/tmp/debugserver
"%HDC_BIN%" -t %TARGET_ID% file send "%SDK_HOME%\sdk\default\hms\native\lldb\aarch64-linux-ohos\lldb-server" /data/local/tmp/debugserver/
"%HDC_BIN%" -t %TARGET_ID% shell chmod 755 /data/local/tmp/debugserver/lldb-server
"!HDC_BIN!" -t !TARGET_ID! shell rm -rf /data/local/tmp/debugserver/lldb-server
"!HDC_BIN!" -t !TARGET_ID! shell mkdir -p /data/local/tmp/debugserver
"!HDC_BIN!" -t !TARGET_ID! file send "!SDK_HOME!\sdk\default\hms\native\lldb\aarch64-linux-ohos\lldb-server" /data/local/tmp/debugserver/
"!HDC_BIN!" -t !TARGET_ID! shell chmod 755 /data/local/tmp/debugserver/lldb-server
set /a COUNT=0
:wait_pid
set APP_PID=
for /f "tokens=1" %%i in ('"%HDC_BIN%" -t %TARGET_ID% shell pidof %BUNDLE_NAME% 2^>nul') do set "APP_PID=%%i"
if not "%APP_PID%"=="" goto got_pid
:wait_pid_dbg
set "APP_PID="
for /f "tokens=1" %%i in ('"!HDC_BIN!" -t !TARGET_ID! shell pidof !BUNDLE_NAME! 2^>nul') do set "APP_PID=%%i"
if not "!APP_PID!"=="" goto got_pid_dbg
timeout /t 1 /nobreak >nul
set /a COUNT+=1
if %COUNT% lss 25 goto wait_pid
if !COUNT! lss 25 goto wait_pid_dbg
echo Error: App did not start within expected time
exit /b 1
:got_pid
:got_pid_dbg
echo App started (PID: %APP_PID%)
"%HDC_BIN%" -t %TARGET_ID% shell aa attach -b %BUNDLE_NAME%
"%HDC_BIN%" -t %TARGET_ID% shell aa process -a %ABILITY_NAME% -b %BUNDLE_NAME% -D "/data/local/tmp/debugserver/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
echo App started (PID: !APP_PID!)
"!HDC_BIN!" -t !TARGET_ID! shell aa attach -b !BUNDLE_NAME!
"!HDC_BIN!" -t !TARGET_ID! shell aa process -a !ABILITY_NAME! -b !BUNDLE_NAME! -D "/data/local/tmp/debugserver/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
echo ------------------------------------------------------------
echo Build, install and app launch completed!
echo.
echo App info:
echo - Bundle: %BUNDLE_NAME%
echo - PID: %APP_PID%
echo - Device: %TARGET_ID%
set /a ELAPSED=HAP_START_TIME-START_TIME
set /a MINUTES=ELAPSED/60
set /a SECONDS=ELAPSED%%60
echo - SO build time: !MINUTES!m!SECONDS!s (!ELAPSED!s)
set /a ELAPSED=END_TIME-HAP_START_TIME
set /a MINUTES=ELAPSED/60
set /a SECONDS=ELAPSED%%60
echo - HAP package and push time: !MINUTES!m!SECONDS!s (!ELAPSED!s)
set /a ELAPSED=END_TIME-START_TIME
set /a MINUTES=ELAPSED/60
set /a SECONDS=ELAPSED%%60
echo - Total time: !MINUTES!m!SECONDS!s (!ELAPSED!s)
echo Note: You can now connect via LLDB to debug on the device
echo Round completed ^(buildMode=!BUILD_MODE!^)
echo - Bundle: !BUNDLE_NAME!
echo - PID: !APP_PID!
echo - Device: !TARGET_ID!
set /a ELAPSED=!HAP_START_TIME!-!START_TIME!
set /a MINUTES=!ELAPSED!/60
set /a SECONDS=!ELAPSED!%%60
echo - SO build time ^(from script start^): !MINUTES!m!SECONDS!s ^(!ELAPSED!s^)
set /a ELAPSED=!END_TIME!-!HAP_START_TIME!
set /a MINUTES=!ELAPSED!/60
set /a SECONDS=!ELAPSED!%%60
echo - HAP package and push ^(this round^): !MINUTES!m!SECONDS!s ^(!ELAPSED!s^)
echo Note: connect LLDB after each round; last round is final install on device.
echo ------------------------------------------------------------
cd /d "!PROJECT_ROOT!"
exit /b 0
:prompt_debug_build_modes_win
if /i "!RUNOHOS_NO_MENU!"=="1" (
set "BUILD_MODES_SELECT=debug"
exit /b 0
)
echo.
echo 请选择构建类型(输入数字后回车):
echo 1 = 仅 debug
echo 2 = 仅 release
echo 3 = debug + release
set "BMENU="
set /p "BMENU=请输入 1 / 2 / 3 [默认 1]: "
if "!BMENU!"=="" set "BMENU=1"
if "!BMENU!"=="1" set "BUILD_MODES_SELECT=debug" & exit /b 0
if "!BMENU!"=="2" set "BUILD_MODES_SELECT=release" & exit /b 0
if "!BMENU!"=="3" set "BUILD_MODES_SELECT=all" & exit /b 0
echo 无效输入,使用默认 1(debug)
set "BUILD_MODES_SELECT=debug"
exit /b 0
:show_help
echo Usage: %~nx0 [options] [PLATFORM] [TARGET_ID]
echo.
echo Parameters:
echo PLATFORM Build platform (default: %DEFAULT_PLATFORM%)
echo TARGET_ID Device ID (default: %DEFAULT_TARGET_ID%)
echo.
echo Options:
echo -m MODE Build mode: debug or release (default: debug)
echo -b BUNDLE Set bundle name (current: %DEFAULT_BUNDLE_NAME%)
echo -a ABILITY Set Ability name (current: %DEFAULT_ABILITY_NAME%)
echo -d MODE Debug mode: debug or attach (default: attach)
echo -p PATH Set external OHOS project path (localOhosPath)
echo -h Show this help
echo -M MODES debug ^| release ^| all(与 -m 二选一)
echo -m MODE 仅 debug 或 release(传了则不再弹出菜单)
echo -b BUNDLE Set bundle name
echo -a ABILITY Set Ability name
echo -d MODE Debug attach: debug or attach ^(default attach^)
echo -p PATH External OHOS project path
echo -h Show help
echo.
echo Examples:
echo %~nx0 ohosArm64 127.0.0.1:5555
echo %~nx0 -M all
echo %~nx0 -M release
echo %~nx0 -m release
echo %~nx0 -b com.test.app -a MainAbility
echo %~nx0 -p D:\path\to\external\ohos\project
exit /b 0
......@@ -50,9 +50,12 @@ clean_harmony_entry() {
echo "Warning: entry directory not found: $base"
return 0
fi
rm -rf "$base/builds" "$base/build" "$base/.cxx" \
"$base/libs/arm64-v8a" "$base/libs/x86_64"
echo "Local clean: removed entry/build, builds, .cxx, libs/(arm64-v8a|x86_64)"
rm -rf "$base/builds" "$base/build" "$base/.cxx"
if [[ -d "$base/libs" ]]; then
find "$base/libs" -type f \( -name '*.so' -o -name '*.SO' \) -delete 2>/dev/null || true
fi
rm -rf "$base/libs/arm64-v8a" "$base/libs/x86_64"
echo "Local clean: entry/build, builds, .cxx, all *.so under libs, libs/arm64-v8a, libs/x86_64"
}
run_uninstall_all() {
......
......@@ -279,11 +279,15 @@ if exist "!ENTRY_BASE!\build" rmdir /s /q "!ENTRY_BASE!\build" 2>nul
if exist "!ENTRY_BASE!\.cxx" rmdir /s /q "!ENTRY_BASE!\.cxx" 2>nul
if exist "!ENTRY_BASE!\libs\" (
for /r "!ENTRY_BASE!\libs" %%F in (*.so) do if exist "%%F" del /f /q "%%F" 2>nul
)
if exist "!ENTRY_BASE!\libs\arm64-v8a" rmdir /s /q "!ENTRY_BASE!\libs\arm64-v8a" 2>nul
if exist "!ENTRY_BASE!\libs\x86_64" rmdir /s /q "!ENTRY_BASE!\libs\x86_64" 2>nul
echo Local clean: removed entry\build, builds, .cxx, libs arm64-v8a and x86_64
echo Local clean: entry\build, builds, .cxx, all *.so under libs, libs\arm64-v8a, libs\x86_64
exit /b 0
......
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