From 06eecb8c2f2f2620da69dea3d07ab61ad7289bff Mon Sep 17 00:00:00 2001 From: tangkai <1944876319@qq.com> Date: Mon, 13 Jul 2026 16:39:47 +0800 Subject: [PATCH 1/2] feat(builder): migrate ohos platform plugin Move OHOS platform entries into the package-style src layout and add package metadata for builder registration. Add Pink Builder custom view and extension host for encrypted, xxteaKey, compressZip, and JobSystem fields. Add OHOS view build tooling and i18n labels for the custom native options. --- src/core/builder/platforms/ohos/i18n/en.js | 10 + src/core/builder/platforms/ohos/i18n/zh.js | 16 +- src/core/builder/platforms/ohos/package.json | 33 +++ .../platforms/ohos/scripts/build-view.js | 57 +++++ .../platforms/ohos/{ => src}/config.ts | 12 +- .../builder/platforms/ohos/{ => src}/hooks.ts | 6 +- .../builder/platforms/ohos/{ => src}/type.ts | 6 +- .../builder/platforms/ohos/{ => src}/utils.ts | 3 +- .../ohos/src/view/build-config-host.ts | 67 ++++++ .../platforms/ohos/src/view/build-config.tsx | 210 ++++++++++++++++++ .../builder/platforms/ohos/static/card@2x.png | Bin 3115 -> 13109 bytes .../builder/platforms/ohos/static/icon@2x.png | Bin 13109 -> 3115 bytes .../builder/platforms/ohos/tsconfig.view.json | 28 +++ 13 files changed, 428 insertions(+), 20 deletions(-) create mode 100644 src/core/builder/platforms/ohos/package.json create mode 100644 src/core/builder/platforms/ohos/scripts/build-view.js rename src/core/builder/platforms/ohos/{ => src}/config.ts (86%) rename src/core/builder/platforms/ohos/{ => src}/hooks.ts (93%) rename src/core/builder/platforms/ohos/{ => src}/type.ts (88%) rename src/core/builder/platforms/ohos/{ => src}/utils.ts (98%) create mode 100644 src/core/builder/platforms/ohos/src/view/build-config-host.ts create mode 100644 src/core/builder/platforms/ohos/src/view/build-config.tsx create mode 100644 src/core/builder/platforms/ohos/tsconfig.view.json diff --git a/src/core/builder/platforms/ohos/i18n/en.js b/src/core/builder/platforms/ohos/i18n/en.js index 820ace2a1..7de7a4e3e 100644 --- a/src/core/builder/platforms/ohos/i18n/en.js +++ b/src/core/builder/platforms/ohos/i18n/en.js @@ -21,6 +21,14 @@ module.exports = { google_play_instant: 'Google Play Instant', input_sdk: 'Input SDK', remoteUrl: 'Remote URL', + JobSystem: 'Job System', + none: 'None', + }, + encrypt: { + title: 'Encrypt JS', + encrypt_key: 'JS Encryption Key', + compress_zip: 'Zip Compress', + disable_tips: 'In debug mode, the Encrypt JS is invalid', }, tips: { not_empty: 'Can not be empty!', @@ -32,6 +40,8 @@ module.exports = { orientation_portrait: 'The screen is upright and the Home button is down', orientation_landscape_left: 'The screen is horizontal, the Home button is on the left side of the screen', orientation_landscape_right: 'The screen is horizontal, the Home button is on the right side of the screen', + JobSystemTaskFlow: 'TaskFlow needs C++17 support.', + JobSystemOther: 'C++17 will be enabled to support compilation.', }, make: { label: 'Make', diff --git a/src/core/builder/platforms/ohos/i18n/zh.js b/src/core/builder/platforms/ohos/i18n/zh.js index 6d6af867d..3f9a6883a 100644 --- a/src/core/builder/platforms/ohos/i18n/zh.js +++ b/src/core/builder/platforms/ohos/i18n/zh.js @@ -1,7 +1,7 @@ 'use strict'; module.exports = { - // !专用名词,不要翻译 + // 专用名词,不要翻译 title: 'HarmonyOS', options: { package_name: '应用 ID 名称', @@ -15,14 +15,24 @@ module.exports = { portrait: '竖屏', render_back_end: '渲染后端', + JobSystem: '任务调度系统', + none: '不开启', + }, + encrypt: { + title: '加密 JS', + encrypt_key: 'JS 加密密钥', + compress_zip: 'Zip 压缩', + disable_tips: '调试模式下,JS 加密无效', }, tips: { not_empty: '不能为空!', at_least_one: '请至少选择一项', - package_name_error: '请输入正确的应用 ID:必须至少包含两段(一个或多个圆点),每段必须以字母开头, 包名中只能包含数字、字母和下划线。', + package_name_error: '请输入正确的应用 ID:必须至少包含两段(一个或多个圆点),每段必须以字母开头,包名中只能包含数字、字母和下划线。', ohos_sdk_error: '找不到 HarmonyOS NDK/SDK 路径,请到 偏好设置 -> 外部程序 中设置', set_ohos_sdk: '设置 HarmonyOS SDK', - apilevel_empty: '获取 apiLevel 失败,请点击旁边的 \'设置 HarmonyOS SDK\' 按钮到 \'偏好设置 -> 外部程序\' 中检查 \'HarmonyOS NDK/SDK\' 路径配置', + apilevel_empty: '获取 apiLevel 失败,请点击旁边的“设置 HarmonyOS SDK”按钮到“偏好设置 -> 外部程序”中检查“HarmonyOS NDK/SDK”路径配置', + JobSystemTaskFlow: 'TaskFlow 需要启用 C++17', + JobSystemOther: '将会自动启用 C++17 以支持编译', }, make: { label: '生成', diff --git a/src/core/builder/platforms/ohos/package.json b/src/core/builder/platforms/ohos/package.json new file mode 100644 index 000000000..71eb6965a --- /dev/null +++ b/src/core/builder/platforms/ohos/package.json @@ -0,0 +1,33 @@ +{ + "name": "ohos", + "version": "1.0.0", + "author": "Cocos", + "description": "OHOS platform plugin", + "license": "ISC", + "type": "commonjs", + "contributes": { + "builder": { + "register": true, + "platform": "ohos", + "config": "./src/config", + "hooks": "./src/hooks" + }, + "pinkBuilder": { + "platform": "ohos", + "customView": "./dist/view/build-config.js", + "customExtensionHost": "./dist/view/build-config-host.js", + "customFields": [ + "encrypted", + "xxteaKey", + "compressZip", + "JobSystem" + ], + "card": "./static/card.png", + "icon": "./static/icon.png" + } + }, + "scripts": { + "build-view": "node scripts/build-view.js", + "watch-view": "node scripts/build-view.js --watch" + } +} diff --git a/src/core/builder/platforms/ohos/scripts/build-view.js b/src/core/builder/platforms/ohos/scripts/build-view.js new file mode 100644 index 000000000..cc6d93765 --- /dev/null +++ b/src/core/builder/platforms/ohos/scripts/build-view.js @@ -0,0 +1,57 @@ +const ps = require('path'); +const esbuild = require('esbuild'); + +const watch = process.argv.includes('--watch'); + +const viewOptions = { + entryPoints: [ps.join(__dirname, '../src/view/build-config.tsx')], + outfile: ps.join(__dirname, '../dist/view/build-config.js'), + bundle: true, + format: 'esm', + platform: 'browser', + target: 'es2022', + jsx: 'automatic', + external: [ + 'react', + 'react-dom', + 'react/jsx-runtime', + 'react-dom/client', + 'react/compiler-runtime', + '@pink/ui-kit', + ], + logLevel: 'info', +}; + +const hostOptions = { + entryPoints: [ps.join(__dirname, '../src/view/build-config-host.ts')], + outfile: ps.join(__dirname, '../dist/view/build-config-host.js'), + bundle: true, + format: 'cjs', + platform: 'node', + target: 'node18', + external: ['vscode'], + logLevel: 'info', +}; + +const allOptions = [viewOptions, hostOptions]; + +(async function buildView() { + try { + if (watch) { + for (const options of allOptions) { + const ctx = await esbuild.context(options); + await ctx.rebuild(); + await ctx.watch(); + } + console.log('[ohos build-view] watching src/view for changes...'); + } else { + console.time('Bundle OHOS View'); + await Promise.all(allOptions.map((options) => esbuild.build(options))); + console.timeEnd('Bundle OHOS View'); + process.exit(0); + } + } catch (error) { + console.error(error); + process.exit(1); + } +}()); diff --git a/src/core/builder/platforms/ohos/config.ts b/src/core/builder/platforms/ohos/src/config.ts similarity index 86% rename from src/core/builder/platforms/ohos/config.ts rename to src/core/builder/platforms/ohos/src/config.ts index 8b99a2293..c22baa60e 100644 --- a/src/core/builder/platforms/ohos/config.ts +++ b/src/core/builder/platforms/ohos/src/config.ts @@ -1,7 +1,7 @@ 'use strict'; -import { IPlatformBuildPluginConfig } from '../../@types/protected'; -import { commonOptions, baseNativeCommonOptions } from '../native-common'; +import { IPlatformBuildPluginConfig } from '../../../@types/protected'; +import { commonOptions, baseNativeCommonOptions } from '../../native-common'; const config: IPlatformBuildPluginConfig = { ...commonOptions, @@ -28,7 +28,7 @@ const config: IPlatformBuildPluginConfig = { message: 'Invalid package name specified', }, }, - hooks: './hooks', + hooks: './src/hooks', options: { ...baseNativeCommonOptions, @@ -54,11 +54,6 @@ const config: IPlatformBuildPluginConfig = { type: 'boolean', default: false, }, - upsideDown: { - label: 'i18n:ohos.options.upsideDown', - type: 'boolean', - default: false, - }, landscapeRight: { label: 'i18n:ohos.options.landscape_right', type: 'boolean', @@ -72,7 +67,6 @@ const config: IPlatformBuildPluginConfig = { }, default: { portrait: false, - upsideDown: false, landscapeRight: true, landscapeLeft: true, }, diff --git a/src/core/builder/platforms/ohos/hooks.ts b/src/core/builder/platforms/ohos/src/hooks.ts similarity index 93% rename from src/core/builder/platforms/ohos/hooks.ts rename to src/core/builder/platforms/ohos/src/hooks.ts index dad6f4e3e..158d48db0 100644 --- a/src/core/builder/platforms/ohos/hooks.ts +++ b/src/core/builder/platforms/ohos/src/hooks.ts @@ -3,8 +3,8 @@ import path from 'path'; import os from 'os'; import { accessSync, existsSync, constants, outputJSON } from 'fs-extra'; -import * as nativeCommonHook from '../native-common/hooks'; -import { BuilderCache, IBuilder } from '../../@types/protected'; +import * as nativeCommonHook from '../../native-common/hooks'; +import { BuilderCache, IBuilder } from '../../../@types/protected'; export const throwError = true; import { IBuildResult, IOhosInternalBuildOptions } from './type'; import { generateOptions } from './utils'; @@ -45,4 +45,4 @@ export function onAfterBundleInit(options: IOhosInternalBuildOptions) { options.assetSerializeOptions!['cc.EffectAsset'].glsl1 = false; options.assetSerializeOptions!['cc.EffectAsset'].glsl3 = true; options.assetSerializeOptions!['cc.EffectAsset'].glsl4 = false; -} \ No newline at end of file +} diff --git a/src/core/builder/platforms/ohos/type.ts b/src/core/builder/platforms/ohos/src/type.ts similarity index 88% rename from src/core/builder/platforms/ohos/type.ts rename to src/core/builder/platforms/ohos/src/type.ts index 9b7825d00..45a975968 100644 --- a/src/core/builder/platforms/ohos/type.ts +++ b/src/core/builder/platforms/ohos/src/type.ts @@ -1,7 +1,7 @@ -import { IInternalBuildOptions, InternalBuildResult } from '../../@types/protected'; -import { CocosParams } from '../native-common/pack-tool/base/default'; -import { ICustomBuildScriptParam, IOptions as INativeOption } from '../native-common/type'; +import { IInternalBuildOptions, InternalBuildResult } from '../../../@types/protected'; +import { CocosParams } from '../../native-common/pack-tool/base/default'; +import { ICustomBuildScriptParam, IOptions as INativeOption } from '../../native-common/type'; export type IOrientation = 'landscape' | 'portrait'; diff --git a/src/core/builder/platforms/ohos/utils.ts b/src/core/builder/platforms/ohos/src/utils.ts similarity index 98% rename from src/core/builder/platforms/ohos/utils.ts rename to src/core/builder/platforms/ohos/src/utils.ts index 6fcbfb858..ec904c4da 100644 --- a/src/core/builder/platforms/ohos/utils.ts +++ b/src/core/builder/platforms/ohos/src/utils.ts @@ -10,7 +10,6 @@ import { platform } from 'os'; */ export async function generateOptions(options: IOhosInternalBuildOptions) { const ohos = options.packages.ohos; - ohos.orientation = ohos.orientation || {}; if(!ohos.sdkPath) { ohos.sdkPath = process.env.OHOS_HOME || process.env.OHOS_SDK_ROOT || ''; @@ -66,4 +65,4 @@ export async function generateOptions(options: IOhosInternalBuildOptions) { console.log(`[OHOS] Using SDK at: ${ohos.sdkPath}, Using NDK at: ${ohos.ndkPath}`); return ohos; -} \ No newline at end of file +} diff --git a/src/core/builder/platforms/ohos/src/view/build-config-host.ts b/src/core/builder/platforms/ohos/src/view/build-config-host.ts new file mode 100644 index 000000000..3eafed73f --- /dev/null +++ b/src/core/builder/platforms/ohos/src/view/build-config-host.ts @@ -0,0 +1,67 @@ +import * as path from 'node:path'; + +type Bundle = Record; + +interface HostContext { + registerMethod(name: string, handler: (...args: any[]) => unknown | Promise): void; +} + +function currentLang(): 'zh' | 'en' { + let locale = 'en'; + try { + const cfg = process.env.VSCODE_NLS_CONFIG; + if (cfg) { + locale = (JSON.parse(cfg) as { locale?: string }).locale || locale; + } + } catch { + // Fallback to English. + } + return locale.toLowerCase().startsWith('zh') ? 'zh' : 'en'; +} + +let cache: { lang: string; bundle: Bundle } | undefined; + +function loadBundle(): Bundle { + const lang = currentLang(); + if (cache?.lang === lang) { + return cache.bundle; + } + + let bundle: Bundle = {}; + try { + const file = path.join(__dirname, '..', '..', 'i18n', `${lang}.js`); + delete require.cache[require.resolve(file)]; + bundle = (require(file) as Bundle) ?? {}; + } catch { + bundle = {}; + } + cache = { lang, bundle }; + return bundle; +} + +function lookup(bundle: Bundle, key: string): string | undefined { + let cur: unknown = bundle; + for (const seg of key.split('.')) { + if (cur && typeof cur === 'object' && seg in (cur as Bundle)) { + cur = (cur as Bundle)[seg]; + } else { + return undefined; + } + } + return typeof cur === 'string' ? cur : undefined; +} + +function substitute(text: string, sub?: Record): string { + if (!sub) { + return text; + } + return text.replace(/%?\{(\w+)\}/g, (match, key: string) => (key in sub ? String(sub[key]) : match)); +} + +export function activate(context: HostContext): void { + context.registerMethod('getI18nBundle', () => loadBundle()); + context.registerMethod('t', (key: string, sub?: Record) => { + const text = lookup(loadBundle(), key); + return text === undefined ? key : substitute(text, sub); + }); +} diff --git a/src/core/builder/platforms/ohos/src/view/build-config.tsx b/src/core/builder/platforms/ohos/src/view/build-config.tsx new file mode 100644 index 000000000..8f525c693 --- /dev/null +++ b/src/core/builder/platforms/ohos/src/view/build-config.tsx @@ -0,0 +1,210 @@ +import { useEffect, useMemo, useState, type ChangeEvent, type CSSProperties } from 'react'; +import { Checkbox, TypedField } from '@pink/ui-kit'; + +export interface PlatformBuildViewProps { + value: Record; + onChange: (path: string[], value: unknown) => void; + host?: unknown; + bridge?: { + invoke(method: string, ...args: unknown[]): Promise; + on(event: string, listener: (params: unknown) => void): () => void; + }; + commonValue?: Record; +} + +function createEncryptionKey(): string { + return Array.from({ length: 16 }, () => Math.floor(Math.random() * 16).toString(16)).join(''); +} + +const DEFAULTS: Record = { + encrypted: false, + xxteaKey: createEncryptionKey(), + compressZip: false, + JobSystem: 'none', +}; + +const ROW: CSSProperties = { padding: '2px 16px 6px 0px' }; +const INPUT: CSSProperties = { + width: '100%', + minWidth: 0, + boxSizing: 'border-box', + height: 26, + padding: '0 8px', + border: '1px solid var(--vscode-input-border, transparent)', + color: 'var(--vscode-input-foreground)', + background: 'var(--vscode-input-background)', + outline: 'none', +}; +const SELECT: CSSProperties = { ...INPUT, padding: '0 6px' }; +const ERROR: CSSProperties = { + paddingTop: 3, + fontSize: 11, + lineHeight: '16px', + color: 'var(--vscode-errorForeground, #f14c4c)', +}; +const INFO: CSSProperties = { + paddingTop: 3, + fontSize: 11, + lineHeight: '16px', + color: 'var(--vscode-descriptionForeground)', +}; +const DISABLED_BLOCK: CSSProperties = { + opacity: 0.55, + pointerEvents: 'none', +}; + +function translate(bundle: Record, key: string): string { + let cur: unknown = bundle; + for (const seg of key.split('.')) { + if (cur && typeof cur === 'object' && seg in (cur as Record)) { + cur = (cur as Record)[seg]; + } else { + return key; + } + } + return typeof cur === 'string' ? cur : key; +} + +function formatMessage(text: string, sub?: Record): string { + if (!sub) { + return text; + } + return text.replace(/\{(\w+)\}/g, (match, key) => (key in sub ? String(sub[key]) : match)); +} + +function stringValue(value: unknown): string { + return typeof value === 'string' ? value : value === undefined || value === null ? '' : String(value); +} + +function boolValue(value: unknown, fallback = false): boolean { + return typeof value === 'boolean' ? value : fallback; +} + +function TextField({ + label, + value, + disabled, + error, + onChange, +}: { + label: string; + value: unknown; + disabled?: boolean; + error?: string; + onChange: (value: string) => void; +}) { + return ( +
+ + ) => onChange(event.target.value)} + /> + + {error &&
{error}
} +
+ ); +} + +export default function OHOSBuildView({ value, onChange, bridge, commonValue }: PlatformBuildViewProps) { + const [bundle, setBundle] = useState>({}); + const t = (key: string, sub?: Record) => formatMessage(translate(bundle, key), sub); + const current = useMemo(() => ({ ...DEFAULTS, ...value }), [value]); + const encrypted = boolValue(current.encrypted); + const compressZip = boolValue(current.compressZip); + const isDebugMode = boolValue(commonValue?.debug); + const jobSystem = stringValue(current.JobSystem) || 'none'; + + const set = (key: string, next: unknown) => onChange([key], next); + + useEffect(() => { + if (!bridge) { + return; + } + + let cancelled = false; + bridge.invoke>('getI18nBundle') + .then((data) => { + if (!cancelled) { + setBundle(data ?? {}); + } + }) + .catch(() => {}); + return () => { + cancelled = true; + }; + }, [bridge]); + + useEffect(() => { + for (const [key, defaultValue] of Object.entries(DEFAULTS)) { + if (!(key in value)) { + onChange([key], defaultValue); + } + } + }, []); + + const errors = useMemo(() => { + const next: Record = {}; + if (encrypted && !stringValue(current.xxteaKey)) { + next.xxteaKey = t('tips.not_empty'); + } + return next; + }, [current.xxteaKey, encrypted, t]); + + const setEncrypted = (checked: boolean) => { + set('encrypted', checked); + if (!checked) { + set('compressZip', false); + } + }; + + return ( +
+
+ +
+ setEncrypted(!!checked)} /> +
+
+ {isDebugMode && encrypted &&
{t('encrypt.disable_tips')}
} +
+ + {encrypted && ( + <> + set('xxteaKey', next)} + /> +
+ +
+ set('compressZip', !!checked)} /> +
+
+
+ + )} + +
+ + + + {jobSystem === 'taskFlow' &&
{t('tips.JobSystemTaskFlow')}
} +
+
+ ); +} diff --git a/src/core/builder/platforms/ohos/static/card@2x.png b/src/core/builder/platforms/ohos/static/card@2x.png index e3b994883b7899c5b593e289f3fb01db6ba21847..92310bb1177d2b4a01518a58b22dc391c615cd4a 100644 GIT binary patch literal 13109 zcmZvjbyQT(`^Nzh2_*$2q~k+NNwai^fHVsN(%lWBfCADiAt@o<-AZ>#mvk&4oeRIa zfZxA<$HO_^otbBzc+cFsb6*?$MoIb^Ix#u|0>U#{83|Pc1jJ+D4*?Yg_(XC%AP@lo z8$nh=^sPJMPRips(vFL+G$&kCTpE$cKT7s)NH&pF9Tp*8krcnspS%61k)`!VS>8cs z4mbG^7iIRF|B!X&ST=4wSnF07yv$DLV}xMqF&=JiuBVBK`#ZaK)@E%mHyB^UC&V*^ zhkqhoi;oPK$dM@!5K%=CkZhDGv_$Q^1m7bdVShkCrWhte#y&p%k6sn+t{M9;&G6vI zy+n2;vHK47!3ZB06tfleDdFSOjnODJi!(aN9|lVSgI_Z;N2A{lw#N|}2EYG!(#3y2 zU3xLlUccP_;^C4HxLmi#daY3?4!15c3G{C$?(TVY*X~S(h}?uH&pjn*`0~!aP9!k* z$3U^@2j3yMBEw9yQs?i`-raY|r}~ht85kD&&|V~oAZk~1NWuLJ_b1!~|8Uw5>2B5| z(d_WZu{Y_EP(67duRWf{Axyx-;fez6OPotQyZ1hq5SU+|rtFdb!vr7b5s~Ndu;}kX zM?l&Y1@xh6{AO7J3>c>GaU=~>s;R*=u5h}&zvkwZ-@6wFm zpAKYB6t7blnF5;`5gz|zz#GIzehNq9rVl-N=dO+-W*vz*2lHUS{I05M7T&!(e?-$UKkgZ(sNE+IC{+MZD(rp#)MwT zA6)Jx$mIdr7bMF5jYk45(T0OLw2-vm-VKKViMC~SIedC&|D`mL$XY5|@qZegpaFDX zS{KRq;H@OkJ;Wa8#k~rE;4A@u$D>#HAKEd1HKm*TN(LSI?a=}6@sX%` zADq=f8V6)tu+pji&>jbDI5lq_B40ct+XeX=-P2{F4*lMJ1pgpxkztaLi8BAwx%o3u ztk)5Dl?L2*76h`l5}NSzepT{dZ=#6q2RYJ2+}R&q1EObbLF@)L33z7|p!0;|s^`DT z0=9M2v1O3%y-U{sVl6`c)Iqmy5mm+0{22s_XlQ2X{Gxov^T(IdbbhJgH93r;dcr$US9ZJ1MsdA*c_Wg z*Q(pSDIMy34=(AA)&qD~bl<1Gfl==;hpwU^`QyAW^7U)cV_^2OA&tVTj_5YIl31Jh zWbD{ktirb%k2CE%P+C|fA(IjHGx`r#@|R%ida>HbxQ2+Zp7zj{!+j>)!&4J959nxs zLOl&@L^5f-leC1%hD#fVJwXnG5*J)~6q_Xm3E1(vc3YQ(ZKdB0&Ag43G15^+D8eNk z`Mc7T9#T>AS#;$#I_v8#T#JkCk-m)YI}7az7HEIJub5d5^~52na(O#=Wuss#EXZoC ztk}I;faloOttI-$ERkVKk4@N4hINKh=gW~@R~LrGw70ng0nzigi*?kVKYZflfAlD| z-SfcY8L|^q8^O{Hf34SY7OA19Xcw>ML(n3tiz!P7h;_=s z`#8<$R%>@N%6E`%$m=RjuzHlB5)zN~J79uijKyxDT3&~PGeV3d$>i~mUPtsYbE;2x z5k>^PzpA2g+;?!exH@3h?tlBV{)fHptIQ<=1w7f0@V#ULc|wPSM)_Kp)lZnpHmKRs zub<9{lCQlog#OzEEJ|0J#<0FKyVDP2koItO%Yo0kFL!I9M4{V8#jadTLZ6?9^$9Ek z&G>OOvdedaT{j&g{|h@ z3033YIZ7fo9kDp=^kxf%gpjVsUhS)!29(@#@x(c z5p}S?x|Wc{L02SOcUq<}gg`6JZ@Aa{$Ou<#OgvbuN$C?j;@xge=uwa)l_H0b7b^st8~97Cwl&gZomk)&sgz3m`#bq zVV@mZ86H$3rpE zgNs{TKFWS#&C9cx@`089E@!>j;S9BIkkSgDrlSI~&r+x<(nbM{={y-?X1Y~ zusDp+;sKuyUzLk7QTCDDvd+|Sm+b;^$W#HB_0$}~CsVw{w$;2*D=3csih*5XBx$pW z1S=1735Z5RtK|AjK-wh7rIlj?;kL~D;%3^JzF=&!==VH7Bi(jvj-Py!cz(0Rbgp8O z?z_Q-$=nDfFbLxE&(!r@n|NtK-}Vl-QeEaodMx9G{@CU*t$bPQ+3V12 zIJHvDsP1&}6{$Y07cG+Ant`%(EL1Uf*9MBTa*0*ys(^m~{iTlPaU2_f^CN+@0sQu@ z!imqAlXUxPiS%~;ASb@?vi%I}NJu+)GOGEuJz*+2M3r5e5%*gh&nC|o3D@lyR!;kM4sTs`K}L*XDtyzG+hpfp zy@fg|l|Pznzrd#UxqmN5#XC>EH0f4nlkg4~Ae=qYe&1x9n;9r?>zOIf$OvP6K1(t( zlB{Ja#UFd$?9@I7M{RxAJ>GHD7#TkFTbyIUN{fxGaE<8E4_X_9N})p`J_KY&OH#?HKK%K3G@tb`ZFH3QOjf#0GrarJk7bAQt(4(jNsq!7{l35aAj-_@@Lp0=!HR3| zt+H@8OOw?OC%p3Bj6HYxlCs^BW_Ovl?FO$8wxRM+Hj+5eia-eivuKOkun~VcP`h>bV-`AmQ5JSxvU71)(<1&~InNzT<+h&%;B<1`31`!uLMvraEEG0Tq zh}n+6D9Go#9L1ZJ4{HDB><};CC2s2Iv+Q23JM!e*3p^a-0a+0CrzotoLs~#W-yoAW zY7qto+LpbTPIMt{#eKYWQ~HV*Hw-@i&H}EM1)Nk8Q|pqZ2+tn1nE5W?o_)u)>dVjTv$b;bja8cGst$V?@4F~tcndln-i`j(Hz zH(XPkblghND|`>~{aQgR_*Ayjua$DIc;s8H9XV&en0p3C=9e%Io=sQ$4_O98P;bF6Ibm4 zt>p<(@sJZZ{Sa?(B=;PckATwl>RSX$yL{=;C+a5d_^mxt4Xxq82PfUSf!5aMyyn15 z)mD}VUi)K>Ux}SqiYT_|?cKCyS*6yNz+E_F z1Eu?=xq{BBdWV6)(RNMQF4Zf>*<4cuj2M+?Pk8ur`iM0e1_}~ezW4p8 zXQaSNLJ!!*FV;52ownz@GFIz~Xkpg-i0WAZ5&_sls8M$-^wqj9L}Xmd=< z<7Kl6vO_1kwh%ySl5gBC7x@U4eD{Z$%1=Ppv{Os`ghRVD6UlQ8v8>fM+t0U2LjvV= z#0Q+GSVXGVsOhrB5GGIGpNE%EwQlm+xCnXZ%sIzT?&lQD zuh+Ali>TcYOVcVbeV8O83lo+!|QjmM+hbZ>S$l&k(*z zuGOnFdyDN#m_2b)vZ(gm?3ZM zJg-8Q<4v!pPxuuLCN;bkj+r%`E%;*yeaO$U{WexV4LPM^33HR82cqL`RAv`+t?d<% zA7<>YDkUU4g}cP*SDdOEPQUj!Q&y!np6BMLa~jZTaF6ROxB~8nePKT^7P)3lhHKQ= z!vv7`FgQ)GX1w?=x}NZj_<*EtYyA{5nq0d7;$1*1Y=6y}2=z&l;cPdC85CNZ6n;6&4>XX zh*CL)jIFUJBZf6}gK5E0v<-D?e=|r@Swim5dYduF#dZK&4(9-jH>LYWHLSkULnAz8 zlc0?JN5a9c2F~(sQQ7I^GX}oRZ(qOGvr`Kg#KzG|(V3hR<$ZMb=*YnvY8<@c%fXsG z+8;>ZqA}_AS9|}5OznN#d`>r&sozwd?8Uw&1oT$j8nc;><n%81wK(G4J6|8ew%M6w=u;7K|c7Ru$%D35jS_!M=h9G-(?>o)R zpa$EVE`HOG#WFY#bI49^3Lw!!tnxkUIoT3N85WarGgxX8H%Hp~#qR$xktD}PtJx|h zO%x+e%u4*)*ffwFz?L?wSq6b}4g;~mNZnne7S7Y%NK2aI<6pALgcd9AnRxR^TU`xc z9i>8WeYgkvY`6GISUpP)ETQ#jD!su6mXGtU=ja!|?0Blk9arS8 zZ8U}xayRjQw#9)w@grp861F8JiZS@stC`)zukY~IAzWS#IE|rwHHAM?*6X4q)62BK zj?U}ca1>}ULR9`3D*}}FwY%GDY;cItQgfkRUem1)d=BV_Y2|{oNP4s|$62Esy?<3$ zoHs^7&|Q!A6C#i95gq2H!{mmFAFV4&1xgxD z!2$78dyT~{URHlaqE6zD%*Eu=KKmSr+?Vo4 zA1|%hTvXidpu8+Cll~Ty)R{o%F&C#eX@S)iU%b~rir#niJ${3tmS&^lW{alFx|>EX zj*PSx=RnxumG}22Z7$8fZyz0DH|_G({4Fu9=aX-PPF)m-YZL^H?Q67L7yF5ha5vcb zbiTZ`C6Q>S%_UA7XgWFXpvy1IT|o@WxloJnR6!lycWwW z=%zKH-^=dw<5>NRza8& z!FsFv{4DWA-+)<=tn;ov539l#4MC%7*4t&)lqyI5wPRTSx5qh6a=AW4XWe z?3EPP6)RTOS4z;Em*$q5k91Ws{T*oGoLnjW@rsxCg3Z>y8hn{Wl#%#8NWgmIx81M0 zowFVuP{=jRiQQ`Uay)aYNao0F8q+v+}GpMo9F#a)e$0hpL5ZOE!IYKboU4^o zVa00b$z z^+hDG?N$&OXcF+#XY4b1eIBOF)R}m_X;WtGvz^L*+cHxx9rlX~(Z(dqi<8NBE`~0d zoTn%AMD1(MXi>FTTr!Ae#&fLa)pk$`DZ$I5w>2G%h9hf6nkQPlTsliHbFjW0_E z?(YgOJ6sO&ApS9;G>K(DFm*eng6NQ~(zUYBDMZoI#KnT~GLpGa9%QQ5c~*FyF^^A( z*?01}J>;`Bi9~v9m(?fLag&kcMm~4^4wyDmW=g1=&K19Gi&*F4B=ueToW^E>I72j%O~LAMB}_WUFb zKK0)n8nwklJ8r=eg$ z_A!PA(W-u)X1#n>j4ZlkWe(AsWH8+Lrk*_4)OieB1sQwJfmv$n6dQf5&0kby&dQ}g z!FE-6qadK+`*B$10@4D z8;fgeP;wiy{G+kp_^!q1C|YSclO!kAAD_GCM0^rP**K)AeUO)(=YiXUi}*BO5auEW z6dGi~7i!j@`)qIF*13z;47W%-F>bG#)X*-H7ThWAtBU$aw8^i~R@pSa#&vocxgZg%68>|A;mUWu+fn*4E3T|w1Im2c0d*GZ zUe;vZ-1NTmGTW~{L+5v4JV*Z(lCe+hzf0n7<(L|Q+NW)?mKZ3w%Gd9GC@##!Aek2b zvU&DGZ{u$X8*qZuEI2#!&6j)UOOc={wPIh&px|U#og1j9rvwrgQWztDU$ zQlrtUmt%zT^GoW@m#SoneL=q5(Abn6tS5@GA+>|9^Q*C0{S|Ji1OmJaOk|1C-=$An zy$qIa914n*oJCy(pshUoN%Nfwef{eO!HZ(yfxgWb7Tbo%|M5{FX(kJ zFUeY11~3Hn*mbq8EvetNkXTmqjN8ck=`Nz?s4#}P`E1(wdddOMzG?|*bCXYZ_1`u15jwKpUjO;?#;@FWQ_0@fx>X&o5Y3Y-q}vKA$s9byDYfaa|@bMb#x z>^VD?fz=AqFz3zX=S_3syndTvfp`$Fz zWubBwQ_H?u&j_%lCKP^hC;7~@$=Lln3lM3Ev@Z8P0WGm;l*QN4osU~sT|j*~lNZs4 zIB)y={DiA&N;UPlnC1HkqirU?bSpSCNVZhW_7QFNx?h^qIr<3+zjuG@+weW9C@8OE zfKOz#I@5R%y|x+guX2Q>SNru?)lQlq3u|U|z5zcNKU3=Tc|xJf$?bL;3OKB&f}`d5 znlf>+Y`vm*^z`!TrbDlX*-j_CewRy==<)uXrs@U}&j_m)aoZQ-0As%hw}7sem2kBc z8`>PCb-5u{sO0u-$3#G3wY%1FRk^2g@L6amGv}1P#o;A!G7HwZy7Euo z98J3jrUHuL9eET?`T!j_lSOp~v$(34s&xhuRhR_vtRW-GKuQgL->YQUUSB+R-O zL+&*vZRMlbS1yd`ety#}>5~;1#(l;HzKokQ1J)RBKTU&%I8MF8iF9>qj%EF1Lw#er z2moC14+_UR$)|YiVAPU(1br_gt|T;iFd2Flq9{~)tfTdPS635aNZPPCyVuWwfUxvfbzyk2Ypykdn%9Ol+eYcX;*1r`Zkpksu;H&Z8s zrl3r6uiZSl3{I{zeoMyfx}MZ#vjMyy$w=#BY0;0^AjReo!pA8q)AF>}A`_rxEl^MF z!To(!0gY81}#Xb%qXAKpT~987EexQ<@ck&iRt<__NIgAL8GY?ID1VfB^yA!&lF z(*m*y2wpyC72NsUk2fl=oP)LK6&~8h9F7(_gJ-`WR8^&yjdp8W{CAua_DWHx)Agjl zA=B=39k}fnjvQ>Wf9{mHxO!_dW|U1M4dti-VeoUtfz z-sZFCWsc*76~<}2t;6@**2lPf=oTlFtjmUw!5cilEp6Dknk;x4F~g|jLl=NBhL%8; z*gT{Zk2_rQrLLa&$pAq##@XLVo7}2n9Fj|n+3ehc!D`k&2S1q>uvRq(LkUfV*^F>p zZ6IkpR66D?o>hmPU;BEqA{Z^mHB++d_0MbK9S?0DGi`(sK~1$ST8n*Ym^4AlEZg7T z$Q*Om(<>=3Vh9IiyEl0HY0|)Hk>s|C^`MEja^c)U zD8+7nLi1|RItu5YTJ-5Jf^2+%SNJDu)72BjuZy0Rv|}0YQ4OVLgEj*iT}AcwK!6zz(2tNV|o zxXh`fP*W!{@6~Mcrz@YwyL4k1OS9&W5v%0A=-Y;?e#$-m;r+O2;O#qSpD)VI2l$QH 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 lZ(UwA+5rDSfh+nEfD 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%0A=-Y;?e#$-m;r+O2;O#qSpD)VI2l$QH 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 lZ(UwA+5rDSfh+nEf Date: Mon, 13 Jul 2026 16:43:43 +0800 Subject: [PATCH 2/2] icon delete --- src/core/builder/platforms/ohos/package.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/core/builder/platforms/ohos/package.json b/src/core/builder/platforms/ohos/package.json index 71eb6965a..06d52693e 100644 --- a/src/core/builder/platforms/ohos/package.json +++ b/src/core/builder/platforms/ohos/package.json @@ -21,13 +21,11 @@ "xxteaKey", "compressZip", "JobSystem" - ], - "card": "./static/card.png", - "icon": "./static/icon.png" + ] } }, "scripts": { "build-view": "node scripts/build-view.js", "watch-view": "node scripts/build-view.js --watch" } -} +} \ No newline at end of file