From 0a3d3c61ed075c8d233d157b15c593e8087e6380 Mon Sep 17 00:00:00 2001 From: Ryan <865833921@qq.com> Date: Fri, 10 Oct 2025 16:20:16 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OptimizationAppMemoryUsage/README.md | 13 +++++++++++-- .../entry/src/main/ets/pages/Demo.ets | 12 +++++------- .../entry/src/main/ets/pages/Index.ets | 9 +++------ .../entry/src/main/ets/utils/LRUCacheUtil.ets | 8 ++++---- .../entry/src/main/ets/utils/Logger.ets | 2 +- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/OptimizationAppMemoryUsage/README.md b/OptimizationAppMemoryUsage/README.md index a2588262..efaed051 100644 --- a/OptimizationAppMemoryUsage/README.md +++ b/OptimizationAppMemoryUsage/README.md @@ -1,7 +1,13 @@ # 应用内存优化 -## 介绍 +## 项目简介 介绍了应用内存优化的多种方式,包括LRU等。 +## 效果预览 +不涉及 + +## 使用说明 +不涉及 + ## 工程目录 ``` ├──entry/src/main/cpps // C++代码区 @@ -21,8 +27,11 @@ └──entry/src/main/resources // 应用资源目录 ``` +## 具体实现 +不涉及 + ## 相关权限 -无 +不涉及 ## 约束与限制 * 本示例仅支持标准系统上运行,支持设备:华为手机。 diff --git a/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Demo.ets b/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Demo.ets index ec5c6146..be42eb90 100644 --- a/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Demo.ets +++ b/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Demo.ets @@ -7,23 +7,21 @@ struct Index { @State message: string = 'Hello World'; aboutToAppear(): void { - let lruCache = LRUCacheUtil.getInstance(); + const lruCache: LRUCacheUtil = LRUCacheUtil.getInstance(); // Add a to lrucache lruCache.putCache('nation',10); // Add another to lrucache lruCache.putCache('menu',8); // Query value through key - let result0 = lruCache.getCache('2') as number; + const result0: number = lruCache.getCache('2') as number; console.log('result0:' + result0); // Delete the specified key and its associated values from the current buffer - let result1 = lruCache.remove('2'); - console.log('result1:' + result1); + lruCache.remove('2'); // Check whether the current buffer contains the specified object - let result2 = lruCache.contains('1'); + const result2: boolean = lruCache.contains('1'); console.log('result2:' + result2); // Set a new capacity size - let result4 = lruCache.updateCapacity(110); - console.log('result4:' + result4); + lruCache.updateCapacity(110); } diff --git a/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Index.ets b/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Index.ets index 5124b987..e1ee2e78 100644 --- a/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Index.ets +++ b/OptimizationAppMemoryUsage/entry/src/main/ets/pages/Index.ets @@ -1,7 +1,6 @@ // [Start network_connection] import { connection } from '@kit.NetworkKit'; import { BusinessError } from '@kit.BasicServicesKit'; -import { promptAction } from '@kit.ArkUI'; import { Logger } from '../utils/Logger'; import { hilog } from '@kit.PerformanceAnalysisKit'; @@ -14,8 +13,6 @@ struct Index { @State netStateMessage: string = ''; @State hostName: string = ''; @State ip: string = ''; - private controller: TabsController = new TabsController(); - private netHandle: connection.NetHandle | null = null; private netCon: connection.NetConnection | null = null; scroller: Scroller = new Scroller(); @@ -88,7 +85,7 @@ struct Index { .width(200) } - getConnectionProperties() { + getConnectionProperties(): void { connection.getDefaultNet().then((netHandle: connection.NetHandle) => { connection.getConnectionProperties(netHandle, (error: BusinessError, connectionProperties: connection.ConnectionProperties) => { if (error) { @@ -108,7 +105,7 @@ struct Index { }); } - useNetworkRegister() { + useNetworkRegister(): void { this.netCon = connection.createNetConnection(); this.netStateMessage += '连接'; this.netCon.register((error) => { @@ -137,7 +134,7 @@ struct Index { }) } - unUseNetworkRegister() { + unUseNetworkRegister(): void { if (this.netCon) { this.netCon.unregister((error: BusinessError) => { if (error) { diff --git a/OptimizationAppMemoryUsage/entry/src/main/ets/utils/LRUCacheUtil.ets b/OptimizationAppMemoryUsage/entry/src/main/ets/utils/LRUCacheUtil.ets index e6dbc491..a6e217dd 100644 --- a/OptimizationAppMemoryUsage/entry/src/main/ets/utils/LRUCacheUtil.ets +++ b/OptimizationAppMemoryUsage/entry/src/main/ets/utils/LRUCacheUtil.ets @@ -28,17 +28,17 @@ export class LRUCacheUtil { } // Reset the capacity of lruCache - public updateCapacity(newCapacity: number) { + public updateCapacity(newCapacity: number): void { this.lruCache.updateCapacity(newCapacity); } // Add cache to lruCache - public putCache(key: string, value: Object) { + public putCache(key: string, value: Object): void { this.lruCache.put(key, value); } // Delete the cache corresponding to the key - public remove(key: string) { + public remove(key: string): void { this.lruCache.remove(key); } @@ -53,7 +53,7 @@ export class LRUCacheUtil { } // Clear the cached data and reset the size of lruCache - public clearCache() { + public clearCache(): void { this.lruCache.clear(); this.lruCache.updateCapacity(64); } diff --git a/OptimizationAppMemoryUsage/entry/src/main/ets/utils/Logger.ets b/OptimizationAppMemoryUsage/entry/src/main/ets/utils/Logger.ets index b94c1fc6..b91b00d5 100644 --- a/OptimizationAppMemoryUsage/entry/src/main/ets/utils/Logger.ets +++ b/OptimizationAppMemoryUsage/entry/src/main/ets/utils/Logger.ets @@ -16,7 +16,7 @@ import { hilog } from '@kit.PerformanceAnalysisKit'; export class Logger { - static error(arg0: string) { + static error(arg0: string): void { throw new Error('Method not implemented.'); } private domain: number; -- Gitee From f7605f341f9ae637c7560f82f78eb81edb67ea5b Mon Sep 17 00:00:00 2001 From: Ryan <865833921@qq.com> Date: Mon, 13 Oct 2025 16:28:09 +0800 Subject: [PATCH 2/6] =?UTF-8?q?ide=E5=91=8A=E8=AD=A6=E5=92=8Creadme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LoadPerformanceInWeb/README.md | 22 ++++-- LoadPerformanceInWeb/entry/oh-package.json5 | 4 +- .../entry/src/main/cpp/CMakeLists.txt | 16 +++++ .../src/main/{cpps => cpp}/DefineJSBridge.cpp | 0 .../entry/src/main/{cpps => cpp}/hello.cpp | 0 .../entry/src/main/cpp/napi_init.cpp | 68 +++++++++++++++++++ .../src/main/{cpps => cpp}/nnapi_init.cpp | 0 .../src/main/cpp/types/libentry/Index.d.ts | 21 ++++++ .../main/cpp/types/libentry/oh-package.json5 | 6 ++ .../entry/src/main/ets/pages/CaseOne.ets | 2 - .../main/ets/pages/CreateNodeController.ets | 15 ++-- .../src/main/ets/pages/JsBridgeOfArkTS.ets | 2 +- .../src/main/ets/pages/JsBridgeOfNdk.ets | 2 +- .../src/main/ets/pages/PracticalCaseTwo.ets | 25 ++++--- .../src/main/ets/pages/PrefetchResource.ets | 2 - .../ets/pages/RegisterJavaScriptProxy.ets | 30 ++++---- .../src/main/ets/pages/SetSchemeHandler.ets | 1 - .../src/main/ets/pages/UseNodeController.ets | 2 +- .../entry/src/main/ets/pages/common.ets | 22 +++--- .../main/ets/utils/CreateResourceConfig.ets | 4 +- 20 files changed, 178 insertions(+), 66 deletions(-) create mode 100644 LoadPerformanceInWeb/entry/src/main/cpp/CMakeLists.txt rename LoadPerformanceInWeb/entry/src/main/{cpps => cpp}/DefineJSBridge.cpp (100%) rename LoadPerformanceInWeb/entry/src/main/{cpps => cpp}/hello.cpp (100%) create mode 100644 LoadPerformanceInWeb/entry/src/main/cpp/napi_init.cpp rename LoadPerformanceInWeb/entry/src/main/{cpps => cpp}/nnapi_init.cpp (100%) create mode 100644 LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/Index.d.ts create mode 100644 LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/oh-package.json5 diff --git a/LoadPerformanceInWeb/README.md b/LoadPerformanceInWeb/README.md index 51890247..c7655171 100644 --- a/LoadPerformanceInWeb/README.md +++ b/LoadPerformanceInWeb/README.md @@ -1,10 +1,14 @@ # Web加载性能优化 -## 介绍 +## 项目简介 本示例展示了Web加载性能优化相关案例。 +## 效果预览 +不涉及 +## 使用说明 +不涉及 ## 工程目录 ``` @@ -25,12 +29,15 @@ │ │ ├──CaseTwo.ets // prepareForPageLoad预加载 │ │ ├──ClearResourceCache.ets // clearPrefetch │ │ ├──common.ets // 预渲染 +│ │ ├──CreateCarrier.ets // 预创建Web +│ │ ├──CreateNodeController.ets // 预渲染Web │ │ ├──Index.ets // 首页 │ │ ├──JsBridgeOfArkTS.ets // ArkTS的JsBridge │ │ ├──JsBridgeOfNDK.ets // NDK的JsBridge │ │ ├──LoadWebComponentError.ets // loadUrl │ │ ├──LoadWebComponentRight.ets // loadUrl │ │ ├──LoadWebPage.ets // startTrace +│ │ ├──PageRequestInterception.ets // Web拦截 │ │ ├──PracticalCaseOne.ets // 未预编译 │ │ ├──PracticalCaseTwo.ets // 预编译 │ │ ├──PrefetchResource.ets // 预加载资源 @@ -44,18 +51,19 @@ │ │ ├──UseStringInterceptReplace.ets // 拦截后使用字符串 │ │ ├──WebComponent.ets // Web组件 │ │ └──WebComponentLoad.ets // Web组件加载 -│ └──utils -│ ├──CreateResourceConfig.ets // ForEach页面 -│ └──HttpRequestPost.js // LazyForEach页面 +│ ├──utils +│ │ ├──CreateResourceConfig.ets // ForEach页面 +│ │ └──HttpRequestPost.js // LazyForEach页面 +│ └──view +│ └──Second.js // Web页面 └──entry/src/main/resources // 应用资源目录 ``` - -## 相关权限 +## 具体实现 不涉及。 -## 依赖 +## 相关权限 不涉及。 diff --git a/LoadPerformanceInWeb/entry/oh-package.json5 b/LoadPerformanceInWeb/entry/oh-package.json5 index 248c3b75..49272b92 100644 --- a/LoadPerformanceInWeb/entry/oh-package.json5 +++ b/LoadPerformanceInWeb/entry/oh-package.json5 @@ -5,6 +5,8 @@ "main": "", "author": "", "license": "", - "dependencies": {} + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } } diff --git a/LoadPerformanceInWeb/entry/src/main/cpp/CMakeLists.txt b/LoadPerformanceInWeb/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 00000000..e53f1727 --- /dev/null +++ b/LoadPerformanceInWeb/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,16 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(AVScreenCaptureScreenRecord) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) + +target_link_libraries(entry PUBLIC libace_napi.z.so) \ No newline at end of file diff --git a/LoadPerformanceInWeb/entry/src/main/cpps/DefineJSBridge.cpp b/LoadPerformanceInWeb/entry/src/main/cpp/DefineJSBridge.cpp similarity index 100% rename from LoadPerformanceInWeb/entry/src/main/cpps/DefineJSBridge.cpp rename to LoadPerformanceInWeb/entry/src/main/cpp/DefineJSBridge.cpp diff --git a/LoadPerformanceInWeb/entry/src/main/cpps/hello.cpp b/LoadPerformanceInWeb/entry/src/main/cpp/hello.cpp similarity index 100% rename from LoadPerformanceInWeb/entry/src/main/cpps/hello.cpp rename to LoadPerformanceInWeb/entry/src/main/cpp/hello.cpp diff --git a/LoadPerformanceInWeb/entry/src/main/cpp/napi_init.cpp b/LoadPerformanceInWeb/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 00000000..da0f7b8b --- /dev/null +++ b/LoadPerformanceInWeb/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "napi/native_api.h" + +static napi_value registerCustomSchemes(napi_env env, napi_callback_info info) { + size_t argc = 3; + napi_value args[3] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + int32_t outputFd, videoWidth, videoHeight; + napi_get_value_int32(env, args[0], &outputFd); + napi_get_value_int32(env, args[1], &videoWidth); + napi_get_value_int32(env, args[2], &videoHeight); + CAVScreenCaptureToStream::GetInstance().StartScreenCapture(outputFd, videoWidth, videoHeight); + + return nullptr; +} + +static napi_value StopScreenCaptureToStream(napi_env env, napi_callback_info info) { + CAVScreenCaptureToStream::GetInstance().StopScreenCapture(); + return nullptr; +} + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) { + napi_property_descriptor desc[] = { + {"startScreenCaptureToFile", nullptr, registerCustomSchemes, nullptr, nullptr, + nullptr, napi_default, nullptr}, + {"stopScreenCaptureToFile", nullptr, CAVScreenCaptureToFile::StopScreenCaptureToFile, nullptr, nullptr, nullptr, + napi_default, nullptr}, + {"setStopCallbackToFile", nullptr, CAVScreenCaptureToFile::SetStopCallbackToFile, nullptr, nullptr, nullptr, + napi_default, nullptr}, + {"startScreenCaptureToStream", nullptr, StartScreenCaptureToStream, nullptr, nullptr, nullptr, napi_default, + nullptr}, + {"stopScreenCaptureToStream", nullptr, StopScreenCaptureToStream, nullptr, nullptr, nullptr, napi_default, + nullptr}, + {"setStopCallbackToStream", nullptr, CAVScreenCaptureToStream::GetInstance().SetStopCallbackToStream, nullptr, + nullptr, nullptr, napi_default, nullptr}, + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/LoadPerformanceInWeb/entry/src/main/cpps/nnapi_init.cpp b/LoadPerformanceInWeb/entry/src/main/cpp/nnapi_init.cpp similarity index 100% rename from LoadPerformanceInWeb/entry/src/main/cpps/nnapi_init.cpp rename to LoadPerformanceInWeb/entry/src/main/cpp/nnapi_init.cpp diff --git a/LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/Index.d.ts b/LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/Index.d.ts new file mode 100644 index 00000000..5c22bd6e --- /dev/null +++ b/LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/Index.d.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const registerCustomSchemes: () => void; + +export const setSchemeHandler: () => void; + +export const nativeWebInit: (webTag: string) => void; + +export const runJavaScript: (webTag: string, js: string) => void; diff --git a/LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/oh-package.json5 b/LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 00000000..ea410725 --- /dev/null +++ b/LoadPerformanceInWeb/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libentry.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/CaseOne.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/CaseOne.ets index 84434601..d48fff01 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/CaseOne.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/CaseOne.ets @@ -1,7 +1,5 @@ // [Start case_one] import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; -import { hilog } from '@kit.PerformanceAnalysisKit'; -import { window } from '@kit.ArkUI'; import { webview } from '@kit.ArkWeb'; export default class EntryAbility extends UIAbility { diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/CreateNodeController.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/CreateNodeController.ets index d62d4434..8f4fbeff 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/CreateNodeController.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/CreateNodeController.ets @@ -40,7 +40,6 @@ function WebBuilder(data:Data) { } } -let wrap = wrapBuilder(WebBuilder); // Used to control and feedback the behavior of nodes on the corresponding NodeContainer, which needs to be used together with NodeContainer export class MyNodeController extends NodeController { @@ -67,23 +66,23 @@ export class MyNodeController extends NodeController { return null; } // Callback when layout size changes. - aboutToResize(size: Size) { + aboutToResize(size: Size): void { console.log('aboutToResize width : ' + size.width + ' height : ' + size.height ) } // Call back when the NodeContainer corresponding to the controller is in Appear. - aboutToAppear() { + aboutToAppear(): void { console.log('aboutToAppear') } // Call back when the NodeContainer corresponding to the controller is Disappear. - aboutToDisappear() { + aboutToDisappear(): void { console.log('aboutToDisappear') } // This function is a user-defined function and can be used as an initialization function. // Initialize builderNode through UIContext, and then initialize the contents in @Builder through the Build interface in BuilderNode. - initWeb(url:string, uiContext:UIContext, control:WebviewController) { + initWeb(url:string, uiContext:UIContext, control:WebviewController): void { if(this.rootNode != null) { return; @@ -91,7 +90,7 @@ export class MyNodeController extends NodeController { // Creating a node requires uiContext. this.rootNode = new BuilderNode(uiContext) // Create dynamic Web components - this.rootNode.build(wrap, { url:url, controller:control }) + this.rootNode.build(wrapBuilder(WebBuilder), { url:url, controller:control }) } } @@ -103,8 +102,8 @@ let controllerMap:Map = new Map(); // Initialization requires UIContext to be obtained in Ability. export const createNWeb = (url: string, uiContext: UIContext) => { // Create NodeController - let baseNode = new MyNodeController(); - let controller = new webview.WebviewController() ; + let baseNode: MyNodeController = new MyNodeController(); + let controller: WebviewController = new webview.WebviewController() ; // Initialize a custom web component baseNode.initWeb(url, uiContext, controller); controllerMap.set(url, controller) diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfArkTS.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfArkTS.ets index 1c4c47fd..65ee464a 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfArkTS.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfArkTS.ets @@ -6,7 +6,7 @@ import { webview } from '@kit.ArkWeb'; struct WebComponent { webviewController: webview.WebviewController = new webview.WebviewController(); - aboutToAppear() { + aboutToAppear(): void { // Configure the Web to open the debugging mode webview.WebviewController.setWebDebuggingAccess(true); } diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfNdk.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfNdk.ets index 3c1e0869..25b841c0 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfNdk.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/JsBridgeOfNdk.ets @@ -23,7 +23,7 @@ struct Index { controller: webview.WebviewController = new webview.WebviewController(this.webTag); @State testObjtest: testObj = new testObj(); - aboutToAppear() { + aboutToAppear(): void { console.info("aboutToAppear"); // init web ndk testNapi.nativeWebInit(this.webTag); diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/PracticalCaseTwo.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/PracticalCaseTwo.ets index cfd358f7..71d01b39 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/PracticalCaseTwo.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/PracticalCaseTwo.ets @@ -1,6 +1,5 @@ // [Start practical_case_two] import { webview } from '@kit.ArkWeb'; -import { hiTraceMeter } from '@kit.PerformanceAnalysisKit'; interface Config { url: string, @@ -34,18 +33,18 @@ struct Index { .onControllerAttached(async () => { // Read the configuration and precompile. for (const config of this.configs) { - let content = await this.getUIContext().getHostContext()?.resourceManager.getRawFileContentSync(config.localPath); - - try { - this.controller.precompileJavaScript(config.url, content, config.options) - .then((errCode: number) => { - console.log('precompile successfully!' ); - }).catch((errCode: number) => { - console.error('precompile failed.' + errCode); - }) - } catch (err) { - console.error('precompile failed!.' + err.code + err.message); - } + this.getUIContext() + .getHostContext()?.resourceManager.getRawFileContent(config.localPath) + .then((content: Uint8Array) => { + this.controller.precompileJavaScript(config.url, content, config.options) + .then(() => { + console.log('precompile successfully!'); + }).catch((errCode: number) => { + console.error('precompile failed.' + errCode); + }) + }).catch(() => { + console.error('precompile failed!.'); + }) } }) // [End web_attach_controller] diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/PrefetchResource.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/PrefetchResource.ets index 2cac2ea4..c2dcbc2c 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/PrefetchResource.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/PrefetchResource.ets @@ -1,7 +1,5 @@ // [Start prefetch_resource] import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; -import { hilog } from '@kit.PerformanceAnalysisKit'; -import { window } from '@kit.ArkUI'; import { webview } from '@kit.ArkWeb'; export default class EntryAbility extends UIAbility { diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/RegisterJavaScriptProxy.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/RegisterJavaScriptProxy.ets index 94e1c2cb..3d2d0267 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/RegisterJavaScriptProxy.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/RegisterJavaScriptProxy.ets @@ -3,21 +3,21 @@ import { BusinessError } from '@kit.BasicServicesKit'; // Define ETS side objects and functions class TestObj { constructor() {} - test(testStr:string): string { - let start = Date.now(); + test(): string { + let start: number = Date.now(); // Simulate time-consuming operations for(let i = 0; i < 500000; i++) {} - let end = Date.now(); + let end: number = Date.now(); console.log('objName.test start: ' + start); return 'objName.test Sync function took ' + (end - start) + 'ms'; } - asyncTestBool(testBol:boolean): Promise { + asyncTestBool(): Promise { return new Promise((resolve, reject) => { - let start = Date.now(); + let start: number = Date.now(); // Simulate time-consuming operation (asynchronous) setTimeout(() => { for(let i = 0; i < 500000; i++) {} - let end = Date.now(); + let end: number = Date.now(); console.log('objAsyncName.asyncTestBool start: ' + start); resolve('objName.asyncTestBool Async function took ' + (end - start) + 'ms'); }, 0); // Use 0 ms delay to simulate an asynchronous operation that starts immediately @@ -28,18 +28,18 @@ class TestObj { class WebObj { constructor() {} webTest(): string { - let start = Date.now(); + let start: number = Date.now(); // Simulate time-consuming operations for(let i = 0; i < 500000; i++) {} - let end = Date.now(); + let end: number = Date.now(); console.log('objTestName.webTest start: ' + start); return 'objTestName.webTest Sync function took ' + (end - start) + 'ms'; } webString(): string { - let start = Date.now(); + let start: number = Date.now(); // Simulate time-consuming operations for(let i = 0; i < 500000; i++) {} - let end = Date.now(); + let end: number = Date.now(); console.log('objTestName.webString start: ' + start); return 'objTestName.webString Sync function took ' + (end - start) + 'ms'; } @@ -51,26 +51,26 @@ class AsyncObj { asyncTest(): Promise { return new Promise((resolve, reject) => { - let start = Date.now(); + let start: number = Date.now(); // Simulate time-consuming operation (asynchronous) setTimeout(() => { for (let i = 0; i < 500000; i++) { } - let end = Date.now(); + let end: number = Date.now(); console.log('objAsyncName.asyncTest start: ' + start); resolve('objAsyncName.asyncTest Async function took ' + (end - start) + 'ms'); }, 0); // Use 0 ms delay to simulate an asynchronous operation that starts immediately }); } - asyncString(testStr:string): Promise { + asyncString(): Promise { return new Promise((resolve, reject) => { - let start = Date.now(); + let start: number = Date.now(); // Simulate time-consuming operation (asynchronous) setTimeout(() => { for (let i = 0; i < 500000; i++) { } - let end = Date.now(); + let end: number = Date.now(); console.log('objAsyncName.asyncString start: ' + start); resolve('objAsyncName.asyncString Async function took ' + (end - start) + 'ms'); }, 0); // Use 0 millisecond delay to simulate immediate asynchronous operation diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/SetSchemeHandler.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/SetSchemeHandler.ets index 806d36d2..a8d66c82 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/SetSchemeHandler.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/SetSchemeHandler.ets @@ -1,5 +1,4 @@ import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; -import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; import testNapi from 'libentry.so'; import webview from '@ohos.web.webview'; diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/UseNodeController.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/UseNodeController.ets index fff06793..657ec95d 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/UseNodeController.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/UseNodeController.ets @@ -1,7 +1,7 @@ // [Start use_node_controller] // Use the Page page of NodeController. // Index.ets -import {createNWeb, getNWeb} from './common'; +import {getNWeb} from './common'; @Entry @Component diff --git a/LoadPerformanceInWeb/entry/src/main/ets/pages/common.ets b/LoadPerformanceInWeb/entry/src/main/ets/pages/common.ets index 53a7a29e..b4ee606e 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/pages/common.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/pages/common.ets @@ -30,8 +30,6 @@ function webBuilder(data: Data) { } } -let wrap = wrapBuilder(webBuilder); - // Used to control and feedback the behavior of nodes on the corresponding NodeContainer, which needs to be used together with NodeContainer export class MyNodeController extends NodeController { private rootNode: BuilderNode | null = null; @@ -44,7 +42,7 @@ export class MyNodeController extends NodeController { console.info(' uicontext is undefined : ' + (uiContext === undefined)); try { if (this.rootNode != null) { - const parent = this.rootNode.getFrameNode()?.getParent(); + const parent: FrameNode = this.rootNode.getFrameNode()?.getParent() as FrameNode; if (parent) { console.info(JSON.stringify(parent.getInspectorInfo())); parent.removeChild(this.rootNode.getFrameNode()); @@ -63,23 +61,23 @@ export class MyNodeController extends NodeController { } // Callback when layout size changes. - aboutToResize(size: Size) { + aboutToResize(size: Size): void { console.info('aboutToResize width : ' + size.width + ' height : ' + size.height); } // Call back when the NodeContainer corresponding to the controller is in Appear. - aboutToAppear() { + aboutToAppear(): void { console.info('aboutToAppear'); } // Call back when the NodeContainer corresponding to the controller is Disappear. - aboutToDisappear() { + aboutToDisappear(): void { console.info('aboutToDisappear'); } // This function is a user-defined function and can be used as an initialization function. // Initialize builderNode through UIContext, and then initialize the contents in @Builder through the Build interface in BuilderNode. - initWeb(url: string, uiContext: UIContext, control: WebviewController) { + initWeb(url: string, uiContext: UIContext, control: WebviewController): void { if (this.rootNode != null) { return; } @@ -88,11 +86,11 @@ export class MyNodeController extends NodeController { // Creating a node requires uiContext. this.rootNode = new BuilderNode(uiContext); // Create dynamic Web components - this.rootNode.build(wrap, { url: url, controller: control }); + this.rootNode.build(wrapBuilder(webBuilder), { url: url, controller: control }); } // This function is a user-defined function and can be used as an initialization function. - loadUrl(url: string) { + loadUrl(url: string): void { if (this.rootWebviewController !== null) { try { // Reuse the pre-created components and reload the url. @@ -112,8 +110,8 @@ let controllerMap: Map = new Map(); // Initialization requires UIContext to be obtained in Ability. export const createNWeb = (url: string, uiContext: UIContext) => { // Create NodeController - let baseNode = new MyNodeController(); - let controller = new webview.WebviewController(); + let baseNode: MyNodeController = new MyNodeController(); + let controller: WebviewController = new webview.WebviewController(); // Initialize a custom web component baseNode.initWeb(url, uiContext, controller); controllerMap.set(url, controller); @@ -125,7 +123,7 @@ export const getNWeb = (url: string): MyNodeController | undefined => { // When loading a new Url, it is recommended to reuse pre-created Web components. if (!NodeMap.get(url) && NodeMap.get('about://blank')) { // Get pre-created Web components - let webNode = NodeMap.get('about://blank') as MyNodeController; + let webNode: MyNodeController = NodeMap.get('about://blank') as MyNodeController; // Reload url webNode.loadUrl(url); return webNode; diff --git a/LoadPerformanceInWeb/entry/src/main/ets/utils/CreateResourceConfig.ets b/LoadPerformanceInWeb/entry/src/main/ets/utils/CreateResourceConfig.ets index fca61c2b..9bba57f6 100644 --- a/LoadPerformanceInWeb/entry/src/main/ets/utils/CreateResourceConfig.ets +++ b/LoadPerformanceInWeb/entry/src/main/ets/utils/CreateResourceConfig.ets @@ -19,8 +19,8 @@ export interface ExceptionResource { } -export const baseURL = 'http://localhost:8083/resource/'; -export const baseURL1 = 'http://localhost:8083/resource/'; +export const baseURL: string = 'http://localhost:8083/resource/'; +export const baseURL1: string = 'http://localhost:8083/resource/'; export const basicResources: Array = [ -- Gitee From 89b8f2010831a68a4afdc51c43a550a82025c650 Mon Sep 17 00:00:00 2001 From: Ryan <865833921@qq.com> Date: Mon, 13 Oct 2025 16:35:59 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=90=8C=E6=BA=90=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entry/src/main/ets/pages/ArticleCardButtonView.ets | 2 +- LowPowerOfForegroundTask/entry/src/main/module.json5 | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/LowPowerOfForegroundTask/entry/src/main/ets/pages/ArticleCardButtonView.ets b/LowPowerOfForegroundTask/entry/src/main/ets/pages/ArticleCardButtonView.ets index 9a99c10d..dd4ab657 100644 --- a/LowPowerOfForegroundTask/entry/src/main/ets/pages/ArticleCardButtonView.ets +++ b/LowPowerOfForegroundTask/entry/src/main/ets/pages/ArticleCardButtonView.ets @@ -31,7 +31,7 @@ export struct ArticleCardButtonView { private mainCanvasRenderingContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.mainRenderingSettings); - startLottieAnimation() { + startLottieAnimation(): void { const animationItem = LottieUtil.loadAnimation({ container: this.mainCanvasRenderingContext, renderer: 'canvas', diff --git a/LowPowerOfForegroundTask/entry/src/main/module.json5 b/LowPowerOfForegroundTask/entry/src/main/module.json5 index a1cea8b6..ad219d73 100644 --- a/LowPowerOfForegroundTask/entry/src/main/module.json5 +++ b/LowPowerOfForegroundTask/entry/src/main/module.json5 @@ -5,9 +5,7 @@ "description": "$string:module_desc", "mainElement": "EntryAbility", "deviceTypes": [ - "phone", - "tablet", - "2in1" + "phone" ], "deliveryWithInstall": true, "installationFree": false, -- Gitee From 9b7e82948de14001bfdd4ae8644771f7f2512018 Mon Sep 17 00:00:00 2001 From: Ryan <865833921@qq.com> Date: Mon, 13 Oct 2025 17:07:31 +0800 Subject: [PATCH 4/6] =?UTF-8?q?readme=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/ArkUI/Lazy_Loading_Optimizes_Performance/README.md b/ArkUI/Lazy_Loading_Optimizes_Performance/README.md index 6f075b8b..295cbe59 100644 --- a/ArkUI/Lazy_Loading_Optimizes_Performance/README.md +++ b/ArkUI/Lazy_Loading_Optimizes_Performance/README.md @@ -2,13 +2,19 @@ ## 介绍 本例介绍了5种优化手段,分别为使用系统提供的动画接口、使用图形变换属性变化组件布局、参数相同时使用同一个animateTo、多次animateTo时统一更新状态变量、使用renderGroup。通过这些优化手段的单个使用或组合使用,可以对动画帧率、应用卡顿等方面带来优化,提升性能和用户体验。 +## 效果预览 +不涉及 + +## 使用说明 +不涉及 + ## 工程目录 ``` ├──entry/src/main/ets // 代码区 │ ├──entryability │ │ └──EntryAbility.ets // 程序入口类 │ ├──entrybackupability -│ │ └──EntryBackupAbility.ets +│ │ └──EntryBackupAbility.ets // 应用数据备份和恢复 │ ├──pages │ │ └──Index.ets // 首页 │ └──segment @@ -17,14 +23,20 @@ └──entry/src/main/resources // 应用资源目录 ``` +## 具体实现 + +不涉及。 + ## 相关权限 -无 + +不涉及。 ## 约束与限制 -* 本示例仅支持标准系统上运行,支持设备:华为手机。 -* HarmonyOS系统:HarmonyOS 5.0.5 Release及以上。 +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.5 Release及以上。 -* DevEco Studio版本:DevEco Studio 5.0.5 Release及以上。 +3. DevEco Studio版本:DevEco Studio 5.0.5 Release及以上。 -* HarmonyOS SDK版本:HarmonyOS 5.0.5 Release SDK及以上。 \ No newline at end of file +4. HarmonyOS SDK版本:HarmonyOS 5.0.5 Release SDK及以上。 \ No newline at end of file -- Gitee From fb7f1cde61799d9a4e91e52c4eb7603af3a770ae Mon Sep 17 00:00:00 2001 From: Ryan <865833921@qq.com> Date: Mon, 13 Oct 2025 17:22:27 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entry/src/main/ets/pages/ColorPickerMode.ets | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets b/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets index eea792f2..fc6cdbbb 100644 --- a/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets +++ b/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets @@ -16,8 +16,6 @@ // [Start color_picker] import { image } from '@kit.ImageKit'; import { effectKit } from '@kit.ArkGraphics2D'; -import { hilog } from '@kit.PerformanceAnalysisKit'; -import { BusinessError } from '@kit.BasicServicesKit'; @Component export struct ColorPickerMode { @@ -33,11 +31,10 @@ export struct ColorPickerMode { async blurPix(resource: Resource) { try { - const context = this.getUIContext().getHostContext()!; - const resourceMgr = context.resourceManager - const fileData = await resourceMgr.getMediaContent(resource.id); - const buffer = fileData.buffer - let imageSource = image.createImageSource(buffer as ArrayBuffer) + const context: Context = this.getUIContext().getHostContext()!; + const fileData: Uint8Array = await context.resourceManager.getMediaContent(resource.id); + const buffer: ArrayBufferLike = fileData.buffer + let imageSource: image.ImageSource = image.createImageSource(buffer as ArrayBuffer) this.pixMap = await imageSource.createPixelMap(); // create a color picker for color extraction this.kitColor = (await effectKit.createColorPicker(this.pixMap, [0, 0, 1, 1])).getAverageColor(); -- Gitee From f08f7ceaf9d0a35f7733c3049f91f513a1afa237 Mon Sep 17 00:00:00 2001 From: Ryan <865833921@qq.com> Date: Mon, 13 Oct 2025 17:26:32 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entry/src/main/ets/pages/StaticBlur.ets | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/FuzzySceneOptimization/entry/src/main/ets/pages/StaticBlur.ets b/FuzzySceneOptimization/entry/src/main/ets/pages/StaticBlur.ets index ac8438a0..b65f9e75 100644 --- a/FuzzySceneOptimization/entry/src/main/ets/pages/StaticBlur.ets +++ b/FuzzySceneOptimization/entry/src/main/ets/pages/StaticBlur.ets @@ -50,10 +50,8 @@ export struct StaticBlur { } async staticBlur() { - let context = this.getUIContext().getHostContext()!; - let resourceMgr = context.resourceManager; // retrieve the resourceManager object - // const fileData = await resourceMgr.getRawFileContent('test.png'); // retrieve images from the rawfile directory - await resourceMgr.getRawFileContent('test.png') // retrieve images from the rawfile directory + let context: Context = this.getUIContext().getHostContext()!; + await context.resourceManager.getRawFileContent('test.png') // retrieve images from the rawfile directory .then((fileData: Uint8Array) => { let buffer: ArrayBuffer = fileData.buffer.slice(0); // create an ArrayBuffer instance this.imgSource = image.createImageSource(buffer); // create an image source instance @@ -127,5 +125,4 @@ export struct StaticBlur { .hideTitleBar(true) } } - // [End static_start] \ No newline at end of file -- Gitee