Commit 416a773b authored by qq_38816927's avatar qq_38816927

更新脚本

parent a220503f
#!/bin/bash
#
# Eazytec is pleased to support the open source community by making CPF-KMP-CMP available.
# Copyright (C) 2026 Eazytec. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
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"
DEFAULT_TARGET_ID="127.0.0.1:5555"
DEFAULT_BUNDLE_NAME="com.example.harmonyapp"
DEFAULT_ABILITY_NAME="EntryAbility"
LOCAL_OHOS_PATH=""
usage() {
echo "Usage: $0 [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 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)"
echo " -p PATH Set external OHOS project path (localOhosPath)"
echo " -h Show this help message"
echo ""
echo "Examples:"
echo " $0 ohosArm64 127.0.0.1:5555"
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
}
# Preset variables
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'
NC='\033[0m' # No Color
# Parse options (supports options in any position, e.g. ohosArm64 62Q0226107024702 -m release)
POSITIONALS=()
while [[ $# -gt 0 ]]; do
case $1 in
-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 ;;
-p) LOCAL_OHOS_PATH="$2"; shift 2 ;;
-h) usage ;;
-*)
echo "Unknown option: $1"
usage
;;
*)
POSITIONALS+=("$1")
shift
;;
esac
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 modes: ${BUILD_MODES[*]}"
echo " - Debug mode: $DEBUG_MODE"
echo " - Bundle: $BUNDLE_NAME"
echo " - Ability: $ABILITY_NAME"
if [ -n "$LOCAL_OHOS_PATH" ]; then
echo " - External OHOS path: $LOCAL_OHOS_PATH"
fi
echo "------------------------------------------------------------"
# --- Configuration ---
DEVECO_PATH="${DEVECO_PATH:-/Applications/DevEco-Studio.app}"
MIN_VERSION="6.0.0"
echo "🔍 Checking environment configuration..."
# 1. Check if DevEco exists
if [ ! -d "$DEVECO_PATH" ]; then
echo "❌ Error: DevEco Studio not found at $DEVECO_PATH."
exit 1
fi
# 2. Get version (from Info.plist CFBundleShortVersionString)
# Output example: 5.0.3.406
CURRENT_VERSION=$(defaults read "$DEVECO_PATH/Contents/Info.plist" CFBundleShortVersionString)
echo "Current DevEco version: $CURRENT_VERSION"
echo "Minimum required version: $MIN_VERSION"
CUR_MAJOR=$(echo "$CURRENT_VERSION" | cut -d. -f1)
CUR_MINOR=$(echo "$CURRENT_VERSION" | cut -d. -f2)
REQ_MAJOR=$(echo "$MIN_VERSION" | cut -d. -f1)
REQ_MINOR=$(echo "$MIN_VERSION" | cut -d. -f2)
if [ "$CUR_MAJOR" -lt "$REQ_MAJOR" ] 2>/dev/null || \
{ [ "$CUR_MAJOR" -eq "$REQ_MAJOR" ] && [ "$CUR_MINOR" -lt "$REQ_MINOR" ]; }; then
echo "-------------------------------------------------------"
echo -e "${RED}⛔️ Error: DevEco version is too low!${NC}"
echo -e "${RED}Current version: $CURRENT_VERSION${NC}"
echo -e "${RED}Minimum required: $MIN_VERSION+${NC}"
echo -e "${RED}Please upgrade DevEco Studio and run this script again.${NC}"
echo "-------------------------------------------------------"
exit 5
fi
echo "✅ DevEco version meets requirements ($CURRENT_VERSION)"
# ====================== [2. Environment Path and SDK Configuration] ======================
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"
if [ "$PLATFORM" = "iosSimulatorArm64" ]; then
cd "$SCRIPT_DIR"
echo "Working path: $(pwd)"
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
exit 0
fi
if [ -n "$LOCAL_OHOS_PATH" ]; then
HARMONY_APP_DIR="$LOCAL_OHOS_PATH"
else
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
for BUILD_MODE in "${BUILD_MODES[@]}"; do
echo ""
echo "============================================================"
echo " buildMode=$BUILD_MODE "
echo "============================================================"
"$HDC_BIN" -t "$TARGET_ID" shell aa force-stop "$BUNDLE_NAME" >/dev/null 2>&1 || true
# ====================== [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
# ====================== [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 "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
echo ""
echo -e "\033[33m⚠ Important:\033[0m"
echo -e " If device screen is locked, please unlock it manually"
echo ""
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
REM Usage: runDebugOhosApp-Win.bat [options] [PLATFORM] [TARGET_ID]
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
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=
:parse
if "%~1"=="" goto done_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
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%"
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 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!
echo ------------------------------------------------------------
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"
) else if exist "D:\Program Files\Huawei\DevEco Studio" (
set "SDK_HOME=D:\Program Files\Huawei\DevEco Studio"
) else (
echo Error: DevEco Studio not found. Set OHOS_SDK_HOME or install to default path.
exit /b 1
)
)
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"
) 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 !CUR_MAJOR! lss !REQ_MAJOR! (
echo Error: DevEco version is too low!
exit /b 5
)
if !CUR_MAJOR! equ !REQ_MAJOR! if !CUR_MINOR! lss !REQ_MINOR! (
echo Error: DevEco version is too low!
exit /b 5
)
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!"
if not exist "!HDC_BIN!" (
echo Error: hdc not found at !HDC_BIN!
exit /b 1
)
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" (
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!"
) else (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp
)
)
) 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!"
) else (
call gradlew.bat :composeApp:publishDebugBinariesToHarmonyApp
)
)
) else (
echo Error: Unsupported platform '!PLATFORM!'
exit /b 4
)
if errorlevel 1 exit /b 1
for /f %%t in ('powershell -NoProfile -Command "[int][double]::Parse((Get-Date -UFormat '%%s'))"') do set HAP_START_TIME=%%t
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
) 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
)
if errorlevel 1 (echo Hvigor build failed & exit /b 1)
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: !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"
if not defined DEVICE_FOUND (
echo Error: Device !TARGET_ID! is offline!
exit /b 5
)
echo Pushing debug components and installing HAP...
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!
"!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
timeout /t 5 /nobreak >nul
"!HDC_BIN!" -t !TARGET_ID! shell bm install -p "!REMOTE_HAP_PATH!"
timeout /t 5 /nobreak >nul
)
"!HDC_BIN!" -t !TARGET_ID! shell rm -rf !REMOTE_HAP_DIR!
timeout /t 1 /nobreak >nul
echo Launching app and starting debug listener...
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
) else (
echo Attach mode, starting without -D flag
"!HDC_BIN!" -t !TARGET_ID! shell aa start -a !ABILITY_NAME! -b !BUNDLE_NAME!
)
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
set /a COUNT=0
: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_dbg
echo Error: App did not start within expected time
exit /b 1
: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 ------------------------------------------------------------
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 Options:
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
exit /b 0
...@@ -83,7 +83,7 @@ done ...@@ -83,7 +83,7 @@ done
PLATFORM=${POSITIONALS[0]:-$DEFAULT_PLATFORM} PLATFORM=${POSITIONALS[0]:-$DEFAULT_PLATFORM}
TARGET_ID=${POSITIONALS[1]:-$DEFAULT_TARGET_ID} TARGET_ID=${POSITIONALS[1]:-$DEFAULT_TARGET_ID}
echo -e "\033[32m Run environment configuration:\033[0m" echo -e "\033[32m Run environment configuration:\033[0m"
echo " - Platform: $PLATFORM" echo " - Platform: $PLATFORM"
echo " - Device: $TARGET_ID" echo " - Device: $TARGET_ID"
echo " - Build mode: $BUILD_MODE" echo " - Build mode: $BUILD_MODE"
...@@ -99,11 +99,11 @@ echo "------------------------------------------------------------" ...@@ -99,11 +99,11 @@ echo "------------------------------------------------------------"
DEVECO_PATH="${DEVECO_PATH:-/Applications/DevEco-Studio.app}" DEVECO_PATH="${DEVECO_PATH:-/Applications/DevEco-Studio.app}"
MIN_VERSION="6.0.0" MIN_VERSION="6.0.0"
echo " DevEco Studio Path ${DEVECO_PATH}" echo " DevEco Studio Path ${DEVECO_PATH}"
echo "🔍 Checking environment configuration..." echo "Checking environment configuration..."
# 1. Check if DevEco exists # 1. Check if DevEco exists
if [ ! -d "$DEVECO_PATH" ]; then if [ ! -d "$DEVECO_PATH" ]; then
echo " Error: DevEco Studio not found at $DEVECO_PATH." echo " Error: DevEco Studio not found at $DEVECO_PATH."
exit 1 exit 1
fi fi
...@@ -122,7 +122,7 @@ REQ_MINOR=$(echo "$MIN_VERSION" | cut -d. -f2) ...@@ -122,7 +122,7 @@ REQ_MINOR=$(echo "$MIN_VERSION" | cut -d. -f2)
if [ "$CUR_MAJOR" -lt "$REQ_MAJOR" ] 2>/dev/null || \ if [ "$CUR_MAJOR" -lt "$REQ_MAJOR" ] 2>/dev/null || \
{ [ "$CUR_MAJOR" -eq "$REQ_MAJOR" ] && [ "$CUR_MINOR" -lt "$REQ_MINOR" ]; }; then { [ "$CUR_MAJOR" -eq "$REQ_MAJOR" ] && [ "$CUR_MINOR" -lt "$REQ_MINOR" ]; }; then
echo "-------------------------------------------------------" echo "-------------------------------------------------------"
echo -e "${RED}⛔️ Error: DevEco version is too low!${NC}" echo -e "${RED} Error: DevEco version is too low!${NC}"
echo -e "${RED}Current version: $CURRENT_VERSION${NC}" echo -e "${RED}Current version: $CURRENT_VERSION${NC}"
echo -e "${RED}Minimum required: $MIN_VERSION+${NC}" echo -e "${RED}Minimum required: $MIN_VERSION+${NC}"
echo -e "${RED}Please upgrade DevEco Studio and run this script again.${NC}" echo -e "${RED}Please upgrade DevEco Studio and run this script again.${NC}"
...@@ -130,10 +130,10 @@ echo "-------------------------------------------------------" ...@@ -130,10 +130,10 @@ echo "-------------------------------------------------------"
exit 5 exit 5
fi fi
echo "DevEco version meets requirements ($CURRENT_VERSION)" echo "DevEco version meets requirements ($CURRENT_VERSION)"
# ====================== [2. Environment Path and SDK Configuration] ====================== # ====================== [2. Environment Path and SDK Configuration] ======================
DEVECO_HOME="${DEVECO_HOME:-$DEVECO_PATH/Contents}" DEVECO_HOME="${DEVECO_HOME:-$DEVECO_PATH/Contents}"
echo " ($DEVECO_HOME)" echo " ($DEVECO_HOME)"
HDC_BIN="$DEVECO_HOME/sdk/default/openharmony/toolchains/hdc" HDC_BIN="$DEVECO_HOME/sdk/default/openharmony/toolchains/hdc"
export DEVECO_SDK_HOME="$DEVECO_HOME/sdk" 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"
...@@ -201,6 +201,7 @@ HAP_DIR="./entry/build/default/outputs/default" ...@@ -201,6 +201,7 @@ HAP_DIR="./entry/build/default/outputs/default"
SIGNED_HAP="entry-default-signed.hap" SIGNED_HAP="entry-default-signed.hap"
HAP_FILE="$HAP_DIR/$SIGNED_HAP" HAP_FILE="$HAP_DIR/$SIGNED_HAP"
echo "Package path: $HAP_DIR/$SIGNED_HAP" echo "Package path: $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 -e "\033[31mError: Signed HAP package not found!\033[0m" echo -e "\033[31mError: Signed HAP package not found!\033[0m"
...@@ -254,7 +255,7 @@ sleep 1 ...@@ -254,7 +255,7 @@ sleep 1
# Check screen lock status and prompt # Check screen lock status and prompt
echo "" echo ""
echo -e "\033[33m Important:\033[0m" echo -e "\033[33m Important:\033[0m"
echo -e " If device screen is locked, please unlock it manually" echo -e " If device screen is locked, please unlock it manually"
echo -e " System cannot auto-unlock in developer mode (security restriction)" echo -e " System cannot auto-unlock in developer mode (security restriction)"
echo "" echo ""
...@@ -286,50 +287,11 @@ if echo "$AA_START_OUTPUT" | grep -q "10106102\|screen is locked"; then ...@@ -286,50 +287,11 @@ if echo "$AA_START_OUTPUT" | grep -q "10106102\|screen is locked"; then
fi fi
# If start failed but not screen lock error, continue anyway # If start failed but not screen lock error, continue anyway
if [ $AA_START_RESULT -ne 0 ]; then if [ $AA_START_RESULT -ne 0 ]; then
echo -e "\033[33m App start command returned non-zero exit code, but continuing...\033[0m" echo -e "\033[33m App start command returned non-zero exit code, but continuing...\033[0m"
fi fi
echo "------------------------------------------------------------" echo "------------------------------------------------------------"
echo -e "\033[32mBuild, install and app launch completed!\033[0m" echo -e "\033[32mBuild, install and app launch completed!\033[0m"
#------------------will delete next version start--------------------
# 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}'
}
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"
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 ""
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
# Step 3: Start lldb-server and attach to process
echo -e " - Bundle: $BUNDLE_NAME"
echo " ->(PID: $APP_PID)..."
#------------------will delete next version end--------------------
# Calculate total duration # Calculate total duration
ELAPSED_TIME=$((END_TIME - START_TIME)) ELAPSED_TIME=$((END_TIME - START_TIME))
...@@ -351,3 +313,7 @@ ELAPSED_TIME=$((END_TIME - START_TIME)) ...@@ -351,3 +313,7 @@ ELAPSED_TIME=$((END_TIME - START_TIME))
MINUTES=$((ELAPSED_TIME / 60)) MINUTES=$((ELAPSED_TIME / 60))
SECONDS=$((ELAPSED_TIME % 60)) SECONDS=$((ELAPSED_TIME % 60))
echo -e " - Total time: ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)" echo -e " - Total time: ${MINUTES}m${SECONDS}s (${ELAPSED_TIME}s)"
# ====================== 【6. Keep alive】 ======================
echo ""
echo -e "\033[32m▶ App running (click Stop button to end)...\033[0m"
echo ""
\ No newline at end of file
@echo off
setlocal EnableDelayedExpansion
REM Run OHOS app on Windows (no debug / LLDB)
REM Usage: runOhosApp-Win.bat [options] [PLATFORM] [TARGET_ID]
REM Options: -b BUNDLE -a ABILITY -p LOCAL_OHOS_PATH
REM Example: runOhosApp-Win.bat ohosArm64 127.0.0.1:5555
set DEFAULT_PLATFORM=ohosArm64
set DEFAULT_TARGET_ID=127.0.0.1:5555
set DEFAULT_BUNDLE_NAME=com.example.harmonyapp
set DEFAULT_ABILITY_NAME=EntryAbility
set BUNDLE_NAME=%DEFAULT_BUNDLE_NAME%
set ABILITY_NAME=%DEFAULT_ABILITY_NAME%
set BUILD_MODE=debug
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 "%~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)
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 - Debug mode: %DEBUG_MODE%
echo - Bundle: %BUNDLE_NAME%
echo - Ability: %ABILITY_NAME%
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 "%DEVECO_PATH%"=="" (
if exist "C:\Program Files\Huawei\DevEco Studio" (
set "DEVECO_PATH=C:\Program Files\Huawei\DevEco Studio"
) else if exist "D:\Program Files\Huawei\DevEco Studio" (
set "DEVECO_PATH=D:\Program Files\Huawei\DevEco Studio"
) else (
echo Error: DevEco Studio not found. Set OHOS_SDK_HOME or install to default path.
exit /b 1
)
)
echo DevEco Studio Path: %DEVECO_PATH%
echo Checking environment configuration...
set "MIN_VERSION=6.0.0"
set "PRODUCT_INFO=%DEVECO_PATH%\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 !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%)
)
set "HDC_BIN=%DEVECO_PATH%\sdk\default\openharmony\toolchains\hdc.exe"
set "DEVECO_SDK_HOME=%DEVECO_PATH%\sdk"
set "PATH=%DEVECO_PATH%\tools\node;%DEVECO_PATH%\tools\ohpm\bin;%DEVECO_PATH%\tools\hvigor\bin;%DEVECO_SDK_HOME%;%PATH%"
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 "%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%"
) else (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp
)
) else (
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 (
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp
)
) else (
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%'
exit /b 4
)
if errorlevel 1 exit /b %errorlevel%
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...
call ohpm install --all
if errorlevel 1 (echo ohpm install failed & exit /b 1)
call node "%DEVECO_PATH%\tools\hvigor\bin\hvigorw.js" --sync -p product=default -p buildMode=%BUILD_MODE% --analyze=normal --parallel --incremental --daemon
if "%BUILD_MODE%"=="release" (
call node "%DEVECO_PATH%\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 "%DEVECO_PATH%\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.
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
if not defined DEVICE_FOUND (
echo Error: Device %TARGET_ID% is offline!
exit /b 5
)
echo Pushing 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%
"%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
timeout /t 5 /nobreak >nul
"%HDC_BIN%" -t %TARGET_ID% shell bm install -p "%REMOTE_HAP_PATH%"
timeout /t 5 /nobreak >nul
)
REM ====================== Launch App ======================
"%HDC_BIN%" -t %TARGET_ID% shell rm -rf %REMOTE_HAP_DIR%
timeout /t 1 /nobreak >nul
echo Launching app...
echo If device screen is locked, please unlock it manually.
echo.
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
) else (
echo Attach mode, starting without -D flag
"%HDC_BIN%" -t %TARGET_ID% shell aa start -a %ABILITY_NAME% -b %BUNDLE_NAME%
)
REM ------------------will delete next version start--------------------
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
timeout /t 1 /nobreak >nul
set /a COUNT+=1
if %COUNT% lss 25 goto wait_pid
echo Error: App did not start within expected time
exit /b 1
:got_pid
REM ------------------will delete next version end--------------------
echo App started (PID: %APP_PID%)
REM Package push complete time
for /f %%t in ('powershell -NoProfile -Command "[int][double]::Parse((Get-Date -UFormat '%%s'))"') do set END_TIME=%%t
echo ------------------------------------------------------------
echo Build, install and app launch completed!
echo.
echo App info:
echo - Bundle: %BUNDLE_NAME%
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 ------------------------------------------------------------
: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.
echo Examples:
echo %~nx0 ohosArm64 127.0.0.1:5555
echo %~nx0 -m release
echo %~nx0 -b com.test.app -a MainAbility
echo %~nx0 -p D:\path\to\external\ohos\project
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