Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
TestToolChainDemo
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
dsq
TestToolChainDemo
Commits
59348341
Commit
59348341
authored
Mar 19, 2026
by
dsq
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改一键打包脚本
parent
fe1df623
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
57 additions
and
39 deletions
+57
-39
app.json5
harmonyApp/AppScope/app.json5
+2
-2
build-profile.json5
harmonyApp/build-profile.json5
+2
-2
string.json
harmonyApp/entry/src/main/resources/base/element/string.json
+1
-1
runOhosApp-Mac-auto.sh
runOhosApp-Mac-auto.sh
+52
-34
No files found.
harmonyApp/AppScope/app.json5
View file @
59348341
{
"app": {
"bundleName": "com.dong.kmp.testtoolchain",
"bundleName": "com.dong.kmp.testtoolchain
debug
",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:layered_image",
"label": "$string:app_name"
,
"label": "$string:app_name"
//"hwasanEnabled": true
//"asanEnabled": true
}
...
...
harmonyApp/build-profile.json5
View file @
59348341
...
...
@@ -7,11 +7,11 @@
"material": {
"certpath": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.cer",
"keyAlias": "debugKey",
"keyPassword": "0000001B
27C22393FFEACF897C523D53BB14B958F86E6EB6F884B402DBAC8C9D7FC6219A51BAEB0EDD9CC2
",
"keyPassword": "0000001B
F55B52AF321260D7C11253AD4CCAEB9CBF05874E8F76DE69349CEE679CF2B07FC1BA797311A0EE
",
"profile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p7b",
"signAlg": "SHA256withECDSA",
"storeFile": "/Users/dongsq/.ohos/config/default_harmonyApp_GthGxfoFAEmCFfCK6Yj5azdigDZk5Ro7gO2DpXptcpU=.p12",
"storePassword": "0000001B3
4693C04F5C3C24936B75D58936B71CB7347743A9551B05A64CD7F77E3A5ADB34C0A71B6EA0196
"
"storePassword": "0000001B3
D367C47C6BF9BCA4E0B177E5ED5735690CCE7387327A8256026BA3B93E69E8431179401DF27B5
"
}
}
],
...
...
harmonyApp/entry/src/main/resources/base/element/string.json
View file @
59348341
...
...
@@ -10,7 +10,7 @@
},
{
"name"
:
"EntryAbility_label"
,
"value"
:
"
测试工具链功能
"
"value"
:
"
工具链debug
"
},
{
"name"
:
"vibrate_permission_reason"
,
...
...
runOhosApp-Mac-auto.sh
View file @
59348341
...
...
@@ -20,11 +20,18 @@ 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"
# bundle 从 harmonyApp/AppScope/app.json5 读取,不存在则用默认
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"
LOCAL_OHOS_PATH
=
""
...
...
@@ -36,7 +43,7 @@ usage() {
echo
" TARGET_ID Device ID (default:
$DEFAULT_TARGET_ID
)"
echo
""
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
" -b BUNDLE Set bundle name (current:
$DEFAULT_BUNDLE_NAME
)"
echo
" -a ABILITY Set Ability name (current:
$DEFAULT_ABILITY_NAME
)"
...
...
@@ -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
"
# ====================== [2.5 Device List and Build Mode List] ======================
SCRIPT_DIR
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
DEVICE_IDS
=()
while
IFS
=
read
-r
line
;
do
line
=
$(
echo
"
$line
"
|
tr
-d
'\r'
| xargs
)
[
-n
"
$line
"
]
&&
DEVICE_IDS+
=(
"
$line
"
)
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
echo
""
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
BUILD_MODES_SELECT
=
"all"
fi
case
"
$(
echo
"
$BUILD_MODES_SELECT
"
|
tr
'[:upper:]'
'[:lower:]'
)
"
in
debug
)
BUILD_MODES
=(
debug
)
;;
...
...
@@ -189,18 +183,21 @@ for BUILD_MODE in "${BUILD_MODES[@]}"; do
((
TOTAL_COUNT++
))
echo
""
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"
CHECK_BASE
=
"
$SCRIPT_DIR
/harmonyApp"
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"
DEL_RETRY
=
0
while
true
;
do
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"
HAP_EXISTS
=
"无"
;
[
-f
"
$HAP_PATH
"
]
&&
HAP_EXISTS
=
"有"
LIBS_EXISTS
=
"无"
;
[
-d
"
$LIBS_ARM
"
]
||
[
-d
"
$LIBS_X86
"
]
&&
LIBS_EXISTS
=
"有"
...
...
@@ -210,35 +207,45 @@ while true; do
fi
DEL_RETRY
=
$((
DEL_RETRY
+
1
))
if
[
$DEL_RETRY
-ge
5
]
;
then
echo
-e
"
\0
33[35m删除后检测: HAP包=
${
HAP_EXISTS
}
, libs中间产物=
${
LIBS_EXISTS
}
,清理未完全,继续打包
\0
33[0m
"
break
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式(原因:清理未完全,HAP包=
${
HAP_EXISTS
}
, libs中间产物=
${
LIBS_EXISTS
}
,须清光后再打包)
"
continue
2
fi
sleep
1
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
# ====================== [3. Gradle Build] ======================
# publish 必须跑完且成功,再进行打包、推包
GRADLE_RET
=
0
if
[
"
$PLATFORM
"
=
"ohosArm64"
]
;
then
if
[
"
$BUILD_MODE
"
=
"release"
]
;
then
echo
">>> :composeApp:publishReleaseBinariesToHarmonyApp"
if
[
-n
"
$LOCAL_OHOS_PATH
"
]
;
then
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
-PharmonyAppPath
=
"
$LOCAL_OHOS_PATH
"
else
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
fi
GRADLE_RET
=
$?
else
echo
">>> :composeApp:publishDebugBinariesToHarmonyApp"
if
[
-n
"
$LOCAL_OHOS_PATH
"
]
;
then
./gradlew :composeApp:publishDebugBinariesToHarmonyApp
-PharmonyAppPath
=
"
$LOCAL_OHOS_PATH
"
else
./gradlew :composeApp:publishDebugBinariesToHarmonyApp
fi
GRADLE_RET
=
$?
fi
elif
[
"
$PLATFORM
"
=
"iosSimulatorArm64"
]
;
then
echo
">>> :composeApp:linkDebugFrameworkIosSimulatorArm64"
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
GRADLE_RET
=
$?
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
fi
# SO packaging end time
...
...
@@ -254,7 +261,7 @@ else
fi
if
[
!
-d
"
$HARMONY_APP_DIR
"
]
;
then
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式"
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式
(原因:harmonyApp 目录不存在
$HARMONY_APP_DIR
)
"
continue
fi
cd
"
$HARMONY_APP_DIR
"
...
...
@@ -273,30 +280,40 @@ SIGNED_HAP="entry-default-signed.hap"
HAP_FILE
=
"
$HAP_DIR
/
$SIGNED_HAP
"
# Check if signed HAP package exists
if
[
!
-f
"
$HAP_FILE
"
]
;
then
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式"
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式
(原因:未找到已签名 HAP 包
$HAP_FILE
)
"
cd
"
$SCRIPT_DIR
"
continue
fi
if
!
echo
"
$AVAILABLE_TARGETS
"
|
grep
-q
"
$TARGET_ID
"
;
then
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式"
echo
"错误的
$TARGET_ID
设备
$BUILD_MODE
模式
(原因:设备离线或未连接)
"
cd
"
$SCRIPT_DIR
"
continue
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"
"
$HDC_BIN
"
-t
"
$TARGET_ID
"
shell
mkdir
-p
"
$REMOTE_HAP_DIR
"
>
/dev/null 2>&1
"
$HDC_BIN
"
-t
"
$TARGET_ID
"
file send
"
$HAP_FILE
"
"
$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
_ABS
"
"
$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
=
$?
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
sleep
5
INSTALL_OUTPUT
=
$(
"
$HDC_BIN
"
-t
"
$TARGET_ID
"
shell bm
install
-p
"
$REMOTE_HAP_DIR
/
$SIGNED_HAP
"
2>&1
)
sleep
5
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] ======================
"
$HDC_BIN
"
-t
"
$TARGET_ID
"
shell
rm
-rf
"
$REMOTE_HAP_DIR
"
>
/dev/null 2>&1
sleep
1
...
...
@@ -313,7 +330,7 @@ END_TIME=$(date +%s)
AA_START_RESULT
=
$?
# Check if screen lock error
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
"
continue
fi
...
...
@@ -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}'
}
MAX_WAIT
=
20
MAX_WAIT
=
45
COUNT
=
0
APP_PID
=
""
while
[
$COUNT
-lt
$MAX_WAIT
]
;
do
...
...
@@ -336,7 +353,8 @@ while [ $COUNT -lt $MAX_WAIT ]; do
done
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
"
continue
fi
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment