Commit 50c79b17 authored by dong's avatar dong

更新运行脚本

parent 960a4c5d
...@@ -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}")
......
...@@ -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
...@@ -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
} }
} }
...@@ -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"
} }
} }
......
...@@ -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
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
......
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'; // 未使用的依赖
//import测试区域 //import测试区域
...@@ -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生命周期断点处
if (nativeApi === undefined) {
hilog.error(DOMAIN, 'Compose', 'nativeApi is undefined, cannot create controller');
this.errorMessage = 'nativeApi is undefined';
return;
}
let unusedInt:number = 0;//未使用的变量 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() 不能使用这个 会出现无限循环 })
}) .width('100%')
} else { .height('100%')
Text(this.errorMessage)
}
} }
.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();
} }
//测试-自定义鸿蒙原生函数 //测试-自定义鸿蒙原生函数
......
...@@ -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 [ -n "$LOCAL_OHOS_PATH" ]; then
if [ "$BUILD_MODE" = "release" ]; then echo "Using external OHOS path: $LOCAL_OHOS_PATH"
if [ -n "$LOCAL_OHOS_PATH" ]; then echo "./gradlew $OHOS_KMP_RUN_GRADLE_TASK -PharmonyAppPath=..."
echo "Using external OHOS path: $LOCAL_OHOS_PATH" ./gradlew "$OHOS_KMP_RUN_GRADLE_TASK" "${GRADLE_OHOS_ARGS[@]}"
echo "/gradlew :composeApp:publishReleaseBinariesToHarmonyApp"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp -PharmonyAppPath="$LOCAL_OHOS_PATH"
else
echo "/gradlew :composeApp:publishReleaseBinariesToHarmonyApp"
./gradlew :composeApp:publishReleaseBinariesToHarmonyApp
fi
else else
if [ -n "$LOCAL_OHOS_PATH" ]; then echo "./gradlew $OHOS_KMP_RUN_GRADLE_TASK"
echo "Using external OHOS path: $LOCAL_OHOS_PATH" ./gradlew "$OHOS_KMP_RUN_GRADLE_TASK"
./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 "\033[31mError: Unsupported platform '$PLATFORM'\033[0m" echo -e "\033[31mError: Unsupported platform '$PLATFORM'\033[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 "\033[31mError: harmonyApp directory not found: $HARMONY_APP_DIR\033[0m" echo -e "\033[31mError: harmonyApp directory not found: $HARMONY_APP_DIR\033[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 "\033[31mError: Signed HAP package not found!\033[0m" echo -e "\033[31mError: Signed HAP package not found!\033[0m"
echo "" echo ""
echo -e "\033[33mExpected path:\033[0m" echo -e "\033[33mExpected path:\033[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 "\033[33mPossible causes:\033[0m" echo -e "\033[33mPossible causes:\033[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)
......
@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]
......
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