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
50c79b17
Commit
50c79b17
authored
Jun 26, 2026
by
dong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
更新运行脚本
parent
960a4c5d
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
157 additions
and
160 deletions
+157
-160
build.gradle.kts
composeApp/build.gradle.kts
+15
-15
gradle.properties
gradle.properties
+9
-3
app.json5
harmonyApp/AppScope/app.json5
+0
-1
compose.har
harmonyApp/entry/libs/compose.har
+0
-0
oh-package-lock.json5
harmonyApp/entry/oh-package-lock.json5
+10
-10
oh-package.json5
harmonyApp/entry/oh-package.json5
+1
-1
Index.d.ts
harmonyApp/entry/src/main/cpp/types/libentry/Index.d.ts
+1
-1
Index.ets
harmonyApp/entry/src/main/ets/pages/Index.ets
+20
-49
runOhosApp-Mac.sh
runscript/runOhosApp-Mac.sh
+36
-32
runOhosApp-Win.bat
runscript/runOhosApp-Win.bat
+65
-48
No files found.
composeApp/build.gradle.kts
View file @
50c79b17
...
@@ -31,11 +31,6 @@ kotlin {
...
@@ -31,11 +31,6 @@ kotlin {
baseName
=
"ComposeApp"
baseName
=
"ComposeApp"
isStatic
=
true
isStatic
=
true
}
}
iosTarget
.
compilations
.
getByName
(
"main"
)
{
compilerOptions
.
configure
{
freeCompilerArgs
.
add
(
"-Xbinary=sanitizer=address"
)
}
}
}
}
...
@@ -73,9 +68,6 @@ kotlin {
...
@@ -73,9 +68,6 @@ kotlin {
}
}
}
}
ohosTarget
.
compilations
.
getByName
(
"main"
)
{
ohosTarget
.
compilations
.
getByName
(
"main"
)
{
compilerOptions
.
configure
{
freeCompilerArgs
.
add
(
"-Xbinary=sanitizer=address"
)
}
val
resource
by
cinterops
.
creating
{
val
resource
by
cinterops
.
creating
{
defFile
(
file
(
"src/ohosArm64Main/cinterop/resource.def"
))
defFile
(
file
(
"src/ohosArm64Main/cinterop/resource.def"
))
includeDirs
(
file
(
"src/ohosArm64Main/cinterop/include"
))
includeDirs
(
file
(
"src/ohosArm64Main/cinterop/include"
))
...
@@ -161,14 +153,17 @@ dependencies {
...
@@ -161,14 +153,17 @@ dependencies {
debugImplementation
(
libs
.
compose
.
ui
.
tooling
)
debugImplementation
(
libs
.
compose
.
ui
.
tooling
)
}
}
//// OHOS 渲染模式二选一:自渲染(Skia)或统一渲染(ohrender)。切换时只保留其一,另一行注释掉。
val
ohosSkikoVersion
=
rootProject
.
findProperty
(
"ohosSkikoVersion"
)
?.
toString
()
?:
"0.9.22.2-0.4.0-04"
//compose {
val
ohosRendererBackend
=
rootProject
.
findProperty
(
"rendererBackend"
)
?.
toString
()
?:
"fusion-renderer"
// ohos {
// skia("0.9.22.2-0.2.0-05") // 自渲染:Compose 用 Skia 自绘
// // ohrender("0.9.22.2-0.1.0") // 统一渲染:与 ArkUI 统一渲染管线;启用时注释上一行
// }
//}
compose
{
ohos
{
when
(
ohosRendererBackend
)
{
"fusion-renderer"
->
fusionRenderer
(
ohosSkikoVersion
)
else
->
skia
(
ohosSkikoVersion
)
}
}
}
// 为 ohosArm64 目标配置依赖处理
// 为 ohosArm64 目标配置依赖处理
val
versionCatalog
=
extensions
.
getByType
<
VersionCatalogsExtension
>().
named
(
"libs"
)
val
versionCatalog
=
extensions
.
getByType
<
VersionCatalogsExtension
>().
named
(
"libs"
)
...
@@ -178,6 +173,11 @@ val cmpVersion = versionCatalog.findVersion("composeMultiplatform")
...
@@ -178,6 +173,11 @@ val cmpVersion = versionCatalog.findVersion("composeMultiplatform")
configurations
.
all
{
configurations
.
all
{
resolutionStrategy
{
resolutionStrategy
{
force
(
"org.jetbrains.skiko:skiko-ohosarm64:${ohosSkikoVersion}"
)
force
(
"org.jetbrains.skiko:skiko-ohosarm64-fusionrenderer:${ohosSkikoVersion}"
)
force
(
"org.jetbrains.skiko:skiko-ohosx64:${ohosSkikoVersion}"
)
force
(
"org.jetbrains.skiko:skiko-ohosx64-fusionrenderer:${ohosSkikoVersion}"
)
force
(
"org.jetbrains.skiko:skiko:${ohosSkikoVersion}"
)
// TODO: 强制刷新 compose ui ohosarm64 依赖
// TODO: 强制刷新 compose ui ohosarm64 依赖
force
(
"org.jetbrains.compose.export:export-ohosarm64:${cmpVersion}"
)
force
(
"org.jetbrains.compose.export:export-ohosarm64:${cmpVersion}"
)
force
(
"org.jetbrains.compose.ui:ui-ohosarm64:${cmpVersion}"
)
force
(
"org.jetbrains.compose.ui:ui-ohosarm64:${cmpVersion}"
)
...
...
gradle.properties
View file @
50c79b17
...
@@ -5,8 +5,6 @@ kotlin.daemon.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m
...
@@ -5,8 +5,6 @@ kotlin.daemon.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m
#Gradle
#Gradle
org.gradle.jvmargs
=
-Xmx8192m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8
org.gradle.jvmargs
=
-Xmx8192m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8
org.gradle.configuration-cache
=
true
org.gradle.caching
=
true
#Android
#Android
android.nonTransitiveRClass
=
true
android.nonTransitiveRClass
=
true
...
@@ -26,8 +24,16 @@ kotlin.debug.generateLocalVariables=true
...
@@ -26,8 +24,16 @@ kotlin.debug.generateLocalVariables=true
ohosSkikoVersion
=
0.9.22.2-0.4.0-04
ohosSkikoVersion
=
0.9.22.2-0.4.0-04
#rendererBackend=fusion-renderer
# 统一渲染(fusion-renderer);自渲染用 skia
rendererBackend
=
fusion-renderer
#rendererBackend=skia
#rendererBackend=skia
#Enable all of the following switches to improve debug incremental compilation performance.
org.gradle.caching
=
true
org.gradle.configuration-cache
=
true
org.gradle.parallel
=
true
kotlin.incremental.native
=
true
kotlin.incremental.useClasspathSnapshot
=
true
harmonyApp/AppScope/app.json5
View file @
50c79b17
...
@@ -6,7 +6,6 @@
...
@@ -6,7 +6,6 @@
"versionName": "1.0.0",
"versionName": "1.0.0",
"icon": "$media:layered_image",
"icon": "$media:layered_image",
"label": "$string:app_name",
"label": "$string:app_name",
//"hwasanEnabled": true
"asanEnabled": true
"asanEnabled": true
}
}
}
}
harmonyApp/entry/libs/compose.har
View file @
50c79b17
No preview for this file type
harmonyApp/entry/oh-package-lock.json5
View file @
50c79b17
...
@@ -6,15 +6,15 @@
...
@@ -6,15 +6,15 @@
"lockfileVersion": 3,
"lockfileVersion": 3,
"ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
"ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
"specifiers": {
"specifiers": {
"
compose@libs/compose.har": "
compose@libs/compose.har",
"
@cpf-kmp-cmp/compose@libs/compose.har": "@cpf-kmp-cmp/
compose@libs/compose.har",
"libcompose_arkui_utils.so@../oh_modules/.ohpm/
compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules/compose/src/main/cpp/types/libcompose_arkui_utils": "libcompose_arkui_utils.so@../oh_modules/.ohpm/compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules
/compose/src/main/cpp/types/libcompose_arkui_utils",
"libcompose_arkui_utils.so@../oh_modules/.ohpm/
@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp/compose/src/main/cpp/types/libcompose_arkui_utils": "libcompose_arkui_utils.so@../oh_modules/.ohpm/@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp
/compose/src/main/cpp/types/libcompose_arkui_utils",
"libentry.so@src/main/cpp/types/libentry": "libentry.so@src/main/cpp/types/libentry",
"libentry.so@src/main/cpp/types/libentry": "libentry.so@src/main/cpp/types/libentry",
"libskikobridge.so@../oh_modules/.ohpm/
compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules/compose/src/main/cpp/types/libskikobridge": "libskikobridge.so@../oh_modules/.ohpm/compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules
/compose/src/main/cpp/types/libskikobridge"
"libskikobridge.so@../oh_modules/.ohpm/
@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp/compose/src/main/cpp/types/libskikobridge": "libskikobridge.so@../oh_modules/.ohpm/@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp
/compose/src/main/cpp/types/libskikobridge"
},
},
"packages": {
"packages": {
"compose@libs/compose.har": {
"
@cpf-kmp-cmp/
compose@libs/compose.har": {
"name": "compose",
"name": "
@cpf-kmp-cmp/
compose",
"version": "1.
0.0
",
"version": "1.
9.2-0.4.0-12
",
"resolved": "libs/compose.har",
"resolved": "libs/compose.har",
"registryType": "local",
"registryType": "local",
"dependencies": {
"dependencies": {
...
@@ -22,10 +22,10 @@
...
@@ -22,10 +22,10 @@
"libskikobridge.so": "file:./src/main/cpp/types/libskikobridge"
"libskikobridge.so": "file:./src/main/cpp/types/libskikobridge"
}
}
},
},
"libcompose_arkui_utils.so@../oh_modules/.ohpm/
compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules
/compose/src/main/cpp/types/libcompose_arkui_utils": {
"libcompose_arkui_utils.so@../oh_modules/.ohpm/
@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp
/compose/src/main/cpp/types/libcompose_arkui_utils": {
"name": "libcompose_arkui_utils.so",
"name": "libcompose_arkui_utils.so",
"version": "1.0.0",
"version": "1.0.0",
"resolved": "../oh_modules/.ohpm/
compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules
/compose/src/main/cpp/types/libcompose_arkui_utils",
"resolved": "../oh_modules/.ohpm/
@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp
/compose/src/main/cpp/types/libcompose_arkui_utils",
"registryType": "local"
"registryType": "local"
},
},
"libentry.so@src/main/cpp/types/libentry": {
"libentry.so@src/main/cpp/types/libentry": {
...
@@ -34,10 +34,10 @@
...
@@ -34,10 +34,10 @@
"resolved": "src/main/cpp/types/libentry",
"resolved": "src/main/cpp/types/libentry",
"registryType": "local"
"registryType": "local"
},
},
"libskikobridge.so@../oh_modules/.ohpm/
compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules
/compose/src/main/cpp/types/libskikobridge": {
"libskikobridge.so@../oh_modules/.ohpm/
@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp
/compose/src/main/cpp/types/libskikobridge": {
"name": "libskikobridge.so",
"name": "libskikobridge.so",
"version": "0.0.0",
"version": "0.0.0",
"resolved": "../oh_modules/.ohpm/
compose@opnyu8tyn8egb98fwqxbhqbcwchostjr+vmpjsjs+hm=/oh_modules
/compose/src/main/cpp/types/libskikobridge",
"resolved": "../oh_modules/.ohpm/
@cpf-kmp-cmp+compose@yhmw27c2+so7kcxbrlgwgo0np34hjlcdkcuhl2iqwbe=/oh_modules/@cpf-kmp-cmp
/compose/src/main/cpp/types/libskikobridge",
"registryType": "local"
"registryType": "local"
}
}
}
}
...
...
harmonyApp/entry/oh-package.json5
View file @
50c79b17
...
@@ -8,6 +8,6 @@
...
@@ -8,6 +8,6 @@
"dependencies": {
"dependencies": {
"libentry.so": "file:./src/main/cpp/types/libentry",
"libentry.so": "file:./src/main/cpp/types/libentry",
// 添加 compose.har 依赖
// 添加 compose.har 依赖
"compose": "file:./libs/compose.har"
"
@cpf-kmp-cmp/
compose": "file:./libs/compose.har"
}
}
}
}
\ No newline at end of file
harmonyApp/entry/src/main/cpp/types/libentry/Index.d.ts
View file @
50c79b17
import
{
ArkUIViewController
,
testArkTsToKotin
}
from
"compose/src/main/cpp/types/libcompose_arkui_utils"
;
import
{
ArkUIViewController
,
testArkTsToKotin
}
from
"
@cpf-kmp-cmp/
compose/src/main/cpp/types/libcompose_arkui_utils"
;
export
const
MainArkUIViewController
:
()
=>
ArkUIViewController
export
const
MainArkUIViewController
:
()
=>
ArkUIViewController
...
...
harmonyApp/entry/src/main/ets/pages/Index.ets
View file @
50c79b17
import {
ArkUIViewController, Compose } from '
compose';
import {
Compose } from '@cpf-kmp-cmp/
compose';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import
nativeApi
from 'libentry.so';
import
{ MainArkUIViewController, testArkTsToKotin }
from 'libentry.so';
import { testArkTsToArkTs } from './TestJumpClass';
import { testArkTsToArkTs } from './TestJumpClass';
import { MyFunction } from './MyFunction';
import { MyFunction } from './MyFunction';
import { promptAction } from '@kit.ArkUI'; // 未使用的依赖
import { promptAction } from '@kit.ArkUI'; // 未使用的依赖
...
@@ -12,41 +12,18 @@ const DOMAIN = 0x0000;
...
@@ -12,41 +12,18 @@ const DOMAIN = 0x0000;
@Entry
@Entry
@Component
@Component
struct Index {
struct Index {
private controller: ArkUIViewController | undefined = undefined;
private controller = MainArkUIViewController();
@State errorMessage: string = 'Native module not ready';
aboutToAppear() {
aboutToAppear() {
hilog.info(DOMAIN, 'Compose', 'aboutToAppear');
hilog.info(DOMAIN, 'Compose', 'aboutToAppear');
//ArkTs生命周期断点处
let unusedInt: number = 0;//未使用的变量
if (nativeApi === undefined) {
hilog.error(DOMAIN, 'Compose', 'nativeApi is undefined, cannot create controller');
this.errorMessage = 'nativeApi is undefined';
return;
}
let unusedInt:number = 0;//未使用的变量
//ArkTs到Kotlin的单向跳转
//ArkTs到Kotlin的单向跳转
nativeApi.
testArkTsToKotin();
testArkTsToKotin();
//原生内部跳转
//原生内部跳转
testArkTsToArkTs();
testArkTsToArkTs();
try {
this.controller = nativeApi.MainArkUIViewController();
const state = this.controller ? 'created' : 'not_created';
hilog.info(DOMAIN, 'Compose', 'controller init state: %{public}s', state);
if (!this.controller) {
this.errorMessage = 'Controller creation failed (returned null)';
}
} catch (e) {
hilog.error(DOMAIN, 'Compose', 'Exception creating controller: %{public}s', JSON.stringify(e));
this.errorMessage = 'Exception creating controller: ' + JSON.stringify(e);
}
}
}
// 模拟耗时操作
// 模拟耗时操作
...
@@ -59,35 +36,29 @@ struct Index {
...
@@ -59,35 +36,29 @@ struct Index {
build() {
build() {
Column() {
Column() {
if (this.controller) {
Compose({
Compose({
controller: this.controller,
controller: this.controller,
libraryName: 'entry',
libraryName: 'entry',
onBackPressed: () => false
onBackPressed: () => false
// onBackPressed: () => this.controller!
.onBackPress() 不能使用这个 会出现无限循环
// onBackPressed: () => this.controller
.onBackPress() 不能使用这个 会出现无限循环
})
})
} else {
.width('100%')
Text(this.errorMessage)
.height('100%')
}
}
}
.width('100%')
.width('100%')
.height('100%')
.height('100%')
}
}
onPageShow() {
onPageShow() {
if (this.controller) {
this.controller.onPageShow();
this.controller.onPageShow();
}
}
}
onPageHide() {
onPageHide() {
if (this.controller) {
this.controller.onPageHide();
this.controller.onPageHide();
}
}
}
onBackPress(): boolean {
onBackPress(): boolean {
return this.controller
? this.controller.onBackPress() : false
;
return this.controller
.onBackPress()
;
}
}
//测试-自定义鸿蒙原生函数
//测试-自定义鸿蒙原生函数
...
...
runscript/runOhosApp-Mac.sh
View file @
50c79b17
...
@@ -140,49 +140,53 @@ export PATH="$DEVECO_SDK_HOME:$DEVECO_HOME/jbr/Contents/Home/bin:$DEVECO_HOME/to
...
@@ -140,49 +140,53 @@ export PATH="$DEVECO_SDK_HOME:$DEVECO_HOME/jbr/Contents/Home/bin:$DEVECO_HOME/to
"
$HDC_BIN
"
-t
"
$TARGET_ID
"
shell aa force-stop
"
$BUNDLE_NAME
"
>
/dev/null 2>&1
||
true
"
$HDC_BIN
"
-t
"
$TARGET_ID
"
shell aa force-stop
"
$BUNDLE_NAME
"
>
/dev/null 2>&1
||
true
echo
"[Harmony-Debug-Pipeline] Prep: hdc force-stop
$BUNDLE_NAME
(ignore errors if not running)"
echo
"[Harmony-Debug-Pipeline] Prep: hdc force-stop
$BUNDLE_NAME
(ignore errors if not running)"
# Harmony run config: passed from IDE (Kotlin reads local.properties); defaults for CLI.
if
[
-n
"
$LOCAL_OHOS_PATH
"
]
;
then
HARMONY_APP_DIR
=
"
$LOCAL_OHOS_PATH
"
else
HARMONY_APP_DIR
=
"harmonyApp"
fi
OHOS_KMP_RUN_GRADLE_MODULE
=
"
${
OHOS_KMP_RUN_GRADLE_MODULE
:-
composeApp
}
"
if
[
"
$BUILD_MODE
"
=
"release"
]
;
then
OHOS_KMP_RUN_PUBLISH_TASK
=
"
${
OHOS_KMP_RUN_PUBLISH_TASK
:-
publishReleaseBinariesToHarmonyApp
}
"
else
OHOS_KMP_RUN_PUBLISH_TASK
=
"
${
OHOS_KMP_RUN_PUBLISH_TASK
:-
publishDebugBinariesToHarmonyApp
}
"
fi
OHOS_KMP_RUN_GRADLE_TASK
=
"
${
OHOS_KMP_RUN_GRADLE_TASK
:-
:
${
OHOS_KMP_RUN_GRADLE_MODULE
}
:
${
OHOS_KMP_RUN_PUBLISH_TASK
}}
"
OHOS_KMP_RUN_ENTRY_MODULE
=
"
${
OHOS_KMP_RUN_ENTRY_MODULE
:-
entry
}
"
GRADLE_OHOS_ARGS
=()
if
[
-n
"
$LOCAL_OHOS_PATH
"
]
;
then
GRADLE_OHOS_ARGS
=(
-PharmonyAppPath
=
"
$LOCAL_OHOS_PATH
"
)
fi
# ====================== [3. Gradle Build] ======================
# ====================== [3. Gradle Build] ======================
echo
"[Harmony-Debug-Pipeline] Build: Gradle KMP
publishBinariesToHarmonyApp
(mode=
$BUILD_MODE
; first run slower, later incremental)"
echo
"[Harmony-Debug-Pipeline] Build: Gradle KMP
$OHOS_KMP_RUN_GRADLE_TASK
(mode=
$BUILD_MODE
; first run slower, later incremental)"
echo
"Working path:
$(
pwd
)
"
echo
"Working path:
$(
pwd
)
"
echo
" - KMP module:
$OHOS_KMP_RUN_GRADLE_MODULE
"
echo
" - Publish task:
$OHOS_KMP_RUN_PUBLISH_TASK
"
echo
"Building OpenHarmony ARM64..."
echo
"Building OpenHarmony ARM64..."
if
[
"
$PLATFORM
"
=
"ohosArm64"
]
;
then
if
[
"
$PLATFORM
"
=
"ohosArm64"
]
;
then
# Execute Gradle build in project root
if
[
"
$BUILD_MODE
"
=
"release"
]
;
then
if
[
-n
"
$LOCAL_OHOS_PATH
"
]
;
then
if
[
-n
"
$LOCAL_OHOS_PATH
"
]
;
then
echo
"Using external OHOS path:
$LOCAL_OHOS_PATH
"
echo
"Using external OHOS path:
$LOCAL_OHOS_PATH
"
echo
"/gradlew :composeApp:publishReleaseBinariesToHarmonyApp
"
echo
"./gradlew
$OHOS_KMP_RUN_GRADLE_TASK
-PharmonyAppPath=...
"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
-PharmonyAppPath
=
"
$LOCAL_OHOS_PATH
"
./gradlew
"
$OHOS_KMP_RUN_GRADLE_TASK
"
"
${
GRADLE_OHOS_ARGS
[@]
}
"
else
else
echo
"/gradlew :composeApp:publishReleaseBinariesToHarmonyApp"
echo
"./gradlew
$OHOS_KMP_RUN_GRADLE_TASK
"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
./gradlew
"
$OHOS_KMP_RUN_GRADLE_TASK
"
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
fi
elif
[
"
$PLATFORM
"
=
"iosSimulatorArm64"
]
;
then
elif
[
"
$PLATFORM
"
=
"iosSimulatorArm64"
]
;
then
./gradlew
:composeApp:linkDebugFrameworkIosSimulatorArm64
./gradlew
":
${
OHOS_KMP_RUN_GRADLE_MODULE
}
:linkDebugFrameworkIosSimulatorArm64"
else
else
echo
-e
"
\0
33[31mError: Unsupported platform '
$PLATFORM
'
\0
33[0m"
echo
-e
"
\0
33[31mError: Unsupported platform '
$PLATFORM
'
\0
33[0m"
exit
4
exit
4
fi
fi
echo
"[Harmony-Debug-Pipeline] Build: KMP publish finished — next ohpm/hvigor HAP (incremental builds may be faster)"
echo
"[Harmony-Debug-Pipeline] Build: KMP publish finished — next ohpm/hvigor HAP (incremental builds may be faster)"
echo
" - OHOS entry module:
$OHOS_KMP_RUN_ENTRY_MODULE
"
# SO packaging end time
# SO packaging end time
HAP_START_TIME
=
$(
date
+%s
)
HAP_START_TIME
=
$(
date
+%s
)
# --- Subsequent install logic (hdc install etc.) ---
# --- Subsequent install logic (hdc install etc.) ---
# ====================== [4. HAP Package Build] ======================
# ====================== [4. HAP Package Build] ======================
# Switch to harmonyApp directory for subsequent OHOS commands
# 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"
fi
if
[
!
-d
"
$HARMONY_APP_DIR
"
]
;
then
if
[
!
-d
"
$HARMONY_APP_DIR
"
]
;
then
echo
-e
"
\0
33[31mError: harmonyApp directory not found:
$HARMONY_APP_DIR
\0
33[0m"
echo
-e
"
\0
33[31mError: harmonyApp directory not found:
$HARMONY_APP_DIR
\0
33[0m"
exit
4
exit
4
...
@@ -193,16 +197,16 @@ echo "Running Hvigor sync and HAP packaging (buildMode=$BUILD_MODE)..."
...
@@ -193,16 +197,16 @@ echo "Running Hvigor sync and HAP packaging (buildMode=$BUILD_MODE)..."
ohpm
install
--all
ohpm
install
--all
node
"
$DEVECO_HOME
/tools/hvigor/bin/hvigorw.js"
--sync
-p
product
=
default
-p
buildMode
=
"
$BUILD_MODE
"
--analyze
=
normal
--parallel
--incremental
--daemon
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
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
node
"
$DEVECO_HOME
/tools/hvigor/bin/hvigorw.js"
--mode
module
-p
module
=
"
$OHOS_KMP_RUN_ENTRY_MODULE
"
-p
product
=
default
-p
buildMode
=
release
-p
requiredDeviceType
=
phone assembleHap compileNative
--analyze
=
normal
--parallel
--incremental
--daemon
else
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
node
"
$DEVECO_HOME
/tools/hvigor/bin/hvigorw.js"
--mode
module
-p
module
=
"
${
OHOS_KMP_RUN_ENTRY_MODULE
}
@default"
-p
product
=
default
-p
buildMode
=
debug
-p
requiredDeviceType
=
phone assembleHap
--analyze
=
normal
--parallel
--incremental
--daemon
fi
fi
echo
"[Harmony-Debug-Pipeline] Build: HAP assemble finished"
echo
"[Harmony-Debug-Pipeline] Build: HAP assemble finished"
# ====================== [5. Install and Push Debug Components] ======================
# ====================== [5. Install and Push Debug Components] ======================
AVAILABLE_TARGETS
=
$(
"
$HDC_BIN
"
list targets
)
AVAILABLE_TARGETS
=
$(
"
$HDC_BIN
"
list targets
)
HAP_DIR
=
"./
entry
/build/default/outputs/default"
HAP_DIR
=
"./
${
OHOS_KMP_RUN_ENTRY_MODULE
}
/build/default/outputs/default"
SIGNED_HAP
=
"
entry
-default-signed.hap"
SIGNED_HAP
=
"
${
OHOS_KMP_RUN_ENTRY_MODULE
}
-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
"
...
@@ -211,7 +215,7 @@ if [ ! -f "$HAP_FILE" ]; then
...
@@ -211,7 +215,7 @@ if [ ! -f "$HAP_FILE" ]; then
echo
-e
"
\0
33[31mError: Signed HAP package not found!
\0
33[0m"
echo
-e
"
\0
33[31mError: Signed HAP package not found!
\0
33[0m"
echo
""
echo
""
echo
-e
"
\0
33[33mExpected path:
\0
33[0m"
echo
-e
"
\0
33[33mExpected path:
\0
33[0m"
echo
"
$HARMONY_APP_DIR
/
entry/build/default/outputs/default/entry
-default-signed.hap"
echo
"
$HARMONY_APP_DIR
/
${
OHOS_KMP_RUN_ENTRY_MODULE
}
/build/default/outputs/default/
${
OHOS_KMP_RUN_ENTRY_MODULE
}
-default-signed.hap"
echo
""
echo
""
echo
-e
"
\0
33[33mPossible causes:
\0
33[0m"
echo
-e
"
\0
33[33mPossible causes:
\0
33[0m"
echo
" • HAP package has not been built yet"
echo
" • HAP package has not been built yet"
...
@@ -222,7 +226,7 @@ if [ ! -f "$HAP_FILE" ]; then
...
@@ -222,7 +226,7 @@ if [ ! -f "$HAP_FILE" ]; then
echo
" 1. Check the build logs above for errors"
echo
" 1. Check the build logs above for errors"
echo
" 2. Verify DevEco Studio signing configuration is correct"
echo
" 2. Verify DevEco Studio signing configuration is correct"
echo
" 3. Manually build and sign HAP package in DevEco Studio"
echo
" 3. Manually build and sign HAP package in DevEco Studio"
echo
" 4. Check files in
entry
/build/default/outputs/default/ directory"
echo
" 4. Check files in
${
OHOS_KMP_RUN_ENTRY_MODULE
}
/build/default/outputs/default/ directory"
exit
6
exit
6
fi
fi
AVAILABLE_TARGETS
=
$(
"
$HDC_BIN
"
list targets
)
AVAILABLE_TARGETS
=
$(
"
$HDC_BIN
"
list targets
)
...
...
runscript/runOhosApp-Win.bat
View file @
50c79b17
@echo off
@echo off
@echo off
rem Eazytec is pleased to support the open source community by making CPF-KMP-CMP available.
rem Eazytec is pleased to support the open source community by making CPF-KMP-CMP available.
rem Copyright (C) 2026 Eazytec. All rights reserved.
rem Copyright (C) 2026 Eazytec. All rights reserved.
rem
rem
...
@@ -130,59 +129,47 @@ if not exist "%HDC_BIN%" (
...
@@ -130,59 +129,47 @@ if not exist "%HDC_BIN%" (
"%HDC_BIN%" -t %TARGET_ID% shell aa force-stop %BUNDLE_NAME% 2>nul
"%HDC_BIN%" -t %TARGET_ID% shell aa force-stop %BUNDLE_NAME% 2>nul
echo [Harmony-Debug-Pipeline] Prep: hdc force-stop %BUNDLE_NAME% (ignore errors if not running)
echo [Harmony-Debug-Pipeline] Prep: hdc force-stop %BUNDLE_NAME% (ignore errors if not running)
REM Harmony run config: passed from IDE (Kotlin reads local.properties); defaults for CLI.
if not "%LOCAL_OHOS_PATH%"=="" (
set "HARMONY_APP_DIR=%LOCAL_OHOS_PATH%"
) else (
set "HARMONY_APP_DIR=harmonyApp"
)
if not defined OHOS_KMP_RUN_GRADLE_MODULE set "OHOS_KMP_RUN_GRADLE_MODULE=composeApp"
if "%BUILD_MODE%"=="release" (
if not defined OHOS_KMP_RUN_PUBLISH_TASK set "OHOS_KMP_RUN_PUBLISH_TASK=publishReleaseBinariesToHarmonyApp"
) else (
if not defined OHOS_KMP_RUN_PUBLISH_TASK set "OHOS_KMP_RUN_PUBLISH_TASK=publishDebugBinariesToHarmonyApp"
)
if not defined OHOS_KMP_RUN_GRADLE_TASK set "OHOS_KMP_RUN_GRADLE_TASK=:%OHOS_KMP_RUN_GRADLE_MODULE%:%OHOS_KMP_RUN_PUBLISH_TASK%"
if not defined OHOS_KMP_RUN_ENTRY_MODULE set "OHOS_KMP_RUN_ENTRY_MODULE=entry"
REM ====================== Gradle Build ======================
REM ====================== Gradle Build ======================
echo [Harmony-Debug-Pipeline] Build: Gradle KMP
publishBinariesToHarmonyApp
(mode=%BUILD_MODE%; first run slower, later incremental)
echo [Harmony-Debug-Pipeline] Build: Gradle KMP
%OHOS_KMP_RUN_GRADLE_TASK%
(mode=%BUILD_MODE%; first run slower, later incremental)
echo Working path: %CD%
echo Working path: %CD%
echo - KMP module: %OHOS_KMP_RUN_GRADLE_MODULE%
echo - Publish task: %OHOS_KMP_RUN_PUBLISH_TASK%
echo Building OpenHarmony (%PLATFORM%)...
echo Building OpenHarmony (%PLATFORM%)...
if "%PLATFORM%"=="ohosArm64" (
if "%PLATFORM%"=="ohosArm64" goto gradle_ohos_build
REM for ohosArm64 ohos in windows x86_64 build
if "%PLATFORM%"=="ohosX86_64" goto gradle_ohos_build
if "%BUILD_MODE%"=="release" (
echo Error: Unsupported platform '%PLATFORM%'
if not "%LOCAL_OHOS_PATH%"=="" (
exit /b 4
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="%LOCAL_OHOS_PATH%"
) else (
:gradle_ohos_build
call gradlew.bat :composeApp:publishReleaseBinariesToHarmonyApp
if not "%LOCAL_OHOS_PATH%"=="" (
)
call gradlew.bat %OHOS_KMP_RUN_GRADLE_TASK% -PharmonyAppPath="%LOCAL_OHOS_PATH%"
) 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 (
) else (
echo Error: Unsupported platform '%PLATFORM%'
call gradlew.bat %OHOS_KMP_RUN_GRADLE_TASK%
exit /b 4
)
)
if errorlevel 1 exit /b %errorlevel%
echo [Harmony-Debug-Pipeline] Build: KMP publish finished next ohpm/hvigor HAP (incremental builds may be faster)
echo [Harmony-Debug-Pipeline] Build: KMP publish finished next ohpm/hvigor HAP (incremental builds may be faster)
echo - OHOS entry module: %OHOS_KMP_RUN_ENTRY_MODULE%
REM SO packaging end time / HAP build start time
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
for /f %%t in ('powershell -NoProfile -Command "[int][double]::Parse((Get-Date -UFormat '%%s'))"') do set HAP_START_TIME=%%t
REM ====================== HAP build ======================
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%" (
if not exist "%HARMONY_APP_DIR%" (
echo Error: harmonyApp directory not found: %HARMONY_APP_DIR%
echo Error: harmonyApp directory not found: %HARMONY_APP_DIR%
exit /b 4
exit /b 4
...
@@ -195,19 +182,48 @@ echo Running ohpm and Hvigor...
...
@@ -195,19 +182,48 @@ echo Running ohpm and Hvigor...
call ohpm install --all
call ohpm install --all
if errorlevel 1 (echo ohpm install failed & exit /b 1)
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
REM hvigorw.js may return exit code 0 even when logging BUILD FAILED; detect failure from log text.
set "HVIGOR_LOG=%TEMP%\hvigor_sync_%RANDOM%_%RANDOM%.log"
call node "%DEVECO_PATH%\tools\hvigor\bin\hvigorw.js" --sync -p product=default -p buildMode=%BUILD_MODE% --analyze=normal --parallel --incremental --daemon > "%HVIGOR_LOG%" 2>&1
set "HVIGOR_SYNC_ERR=0"
if errorlevel 1 set "HVIGOR_SYNC_ERR=1"
type "%HVIGOR_LOG%"
findstr /I /C:"BUILD FAILED" "%HVIGOR_LOG%" >nul && set "HVIGOR_SYNC_ERR=1"
if "!HVIGOR_SYNC_ERR!"=="1" (
echo.
echo Error: hvigor sync failed ^(BUILD FAILED in log or non-zero exit^).
del "%HVIGOR_LOG%" 2>nul
exit /b 1
)
del "%HVIGOR_LOG%" 2>nul
set "HVIGOR_ERR=0"
if "%BUILD_MODE%"=="release" (
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
set "HVIGOR_LOG=%TEMP%\hvigor_asm_%RANDOM%_%RANDOM%.log"
call node "%DEVECO_PATH%\tools\hvigor\bin\hvigorw.js" --mode module -p module=%OHOS_KMP_RUN_ENTRY_MODULE% -p product=default -p buildMode=release -p requiredDeviceType=phone assembleHap compileNative --analyze=normal --parallel --incremental --daemon > "!HVIGOR_LOG!" 2>&1
if errorlevel 1 set "HVIGOR_ERR=1"
type "!HVIGOR_LOG!"
findstr /I /C:"BUILD FAILED" "!HVIGOR_LOG!" >nul && set "HVIGOR_ERR=1"
) else (
) 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
set "HVIGOR_LOG=%TEMP%\hvigor_asm_%RANDOM%_%RANDOM%.log"
call node "%DEVECO_PATH%\tools\hvigor\bin\hvigorw.js" --mode module -p module=%OHOS_KMP_RUN_ENTRY_MODULE%@default -p product=default -p buildMode=debug -p requiredDeviceType=phone assembleHap --analyze=normal --parallel --incremental --daemon > "!HVIGOR_LOG!" 2>&1
if errorlevel 1 set "HVIGOR_ERR=1"
type "!HVIGOR_LOG!"
findstr /I /C:"BUILD FAILED" "!HVIGOR_LOG!" >nul && set "HVIGOR_ERR=1"
)
)
if errorlevel 1 (echo Hvigor build failed & exit /b 1)
if "!HVIGOR_ERR!"=="1" (
echo.
echo Error: Hvigor assembleHap failed ^(BUILD FAILED in log or non-zero exit; node may still report 0^).
del "!HVIGOR_LOG!" 2>nul
exit /b 1
)
del "!HVIGOR_LOG!" 2>nul
echo [Harmony-Debug-Pipeline] Build: HAP assemble finished
echo [Harmony-Debug-Pipeline] Build: HAP assemble finished
REM ====================== Install HAP ======================
REM ====================== Install HAP ======================
set "HAP_DIR=
entry
\build\default\outputs\default"
set "HAP_DIR=
%OHOS_KMP_RUN_ENTRY_MODULE%
\build\default\outputs\default"
set "SIGNED_HAP=
entry
-default-signed.hap"
set "SIGNED_HAP=
%OHOS_KMP_RUN_ENTRY_MODULE%
-default-signed.hap"
set "HAP_FILE=%HAP_DIR%\%SIGNED_HAP%"
set "HAP_FILE=%HAP_DIR%\%SIGNED_HAP%"
if not exist "%HAP_FILE%" (
if not exist "%HAP_FILE%" (
...
@@ -280,6 +296,7 @@ set /a MINUTES=ELAPSED/60
...
@@ -280,6 +296,7 @@ set /a MINUTES=ELAPSED/60
set /a SECONDS=ELAPSED%%60
set /a SECONDS=ELAPSED%%60
echo - Total time: !MINUTES!m!SECONDS!s (!ELAPSED!s)
echo - Total time: !MINUTES!m!SECONDS!s (!ELAPSED!s)
echo ------------------------------------------------------------
echo ------------------------------------------------------------
exit /b 0
:show_help
:show_help
echo Usage: %~nx0 [options] [PLATFORM] [TARGET_ID]
echo Usage: %~nx0 [options] [PLATFORM] [TARGET_ID]
...
...
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