diff --git a/ArkUI/Lazy_Loading_Optimizes_Performance/README.md b/ArkUI/Lazy_Loading_Optimizes_Performance/README.md index 6f075b8b640c650a84d4c2c75ecef12959c2420a..295cbe59e4e2d612b02dad163ee1656d8ee769f0 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 diff --git a/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets b/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets index eea792f264ed25a912d6a6a87e8dc55bafc53131..fc6cdbbb49858ca29281bc3dbd96a0eeb00fb203 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(); diff --git a/FuzzySceneOptimization/entry/src/main/ets/pages/StaticBlur.ets b/FuzzySceneOptimization/entry/src/main/ets/pages/StaticBlur.ets index ac8438a0fd63efae68e02bc36cf667b03663ac2d..b65f9e75fb4c777e3b9c535e48ef1269c47170e2 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 diff --git a/LoadPerformanceInWeb/README.md b/LoadPerformanceInWeb/README.md index 51890247cecd72499e429832f6470d50d870d8e7..c76551710fca9f62d905bb8ef9ae1c386bddb6d2 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 248c3b7541a589682a250f86a6d3ecf7414d2d6a..49272b92c5bf80d3b57b46e03664b86eae213cb5 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 0000000000000000000000000000000000000000..e53f17275e5609f6543456acb87bd97336f3fe8d --- /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 0000000000000000000000000000000000000000..da0f7b8b9bd5df93b23c8da6cd9f37b6998b329f --- /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 0000000000000000000000000000000000000000..5c22bd6e63a911de3d2fb8e5ba67c6a83935fc64 --- /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 0000000000000000000000000000000000000000..ea410725a8826704d061021d98cf02aa76cd8016 --- /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 84434601ff2c032808f051571470880bf4d32db9..d48fff01cf07ea2997f148e65a94a3fa19e0878f 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 d62d4434dbcea6ab5b387c6d9728dd566da64a58..8f4fbeffc07368c878f2d98e16acd917c11d583e 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 1c4c47fde571c3db25ea5188b61aa858b39e8a30..65ee464a51d2d7b9c2a380039f9b813b0a33e494 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 3c1e086905e6f89aa604eac62b921eef37ba0632..25b841c09a8774a0695064b35bf3acf0fed7418c 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 cfd358f799c5c2c71b1036bcf56dad1ff7cfa3fc..71d01b39f5af91a636e1db27379867f2b12ecd87 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 2cac2ea40b0ed98a7c048259f66841ca0bb48cb4..c2dcbc2cf5425abd308ab071116f51f589f3ade6 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 94e1c2cba781ac06c697651c31d31a77c0938081..3d2d0267495a76338793e03f79231cdedfcdbc0e 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 806d36d256e82021ec33ecae93a63368c00dde4a..a8d66c821a276cb180d8cbe2cff3291fd8425017 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 fff0679327990bef1f973ee20abf7a9c637febe1..657ec95d1c03182570d713b0903d285de52bf796 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 53a7a29e2c40e44f953d78adcd4bc1ac55f8b48e..b4ee606e9139c5da75074a7c1e17afa975f4390c 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 fca61c2bd6a6cc2da7bd295b3099618fc94a179f..9bba57f6f05749768ae3752b186d1047da498154 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 = [ diff --git a/LowPowerOfForegroundTask/entry/src/main/ets/pages/ArticleCardButtonView.ets b/LowPowerOfForegroundTask/entry/src/main/ets/pages/ArticleCardButtonView.ets index 9a99c10dd074cdf6b78edd079d53a596c5337ac5..dd4ab65767a6ad17bd08e585a9f98bf94faa8510 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 a1cea8b6a4560cee7bda7a2db52f310c035ab6c8..ad219d733f6afa5ea07f85f580208b08cc3b9041 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, diff --git a/OptimizationAppMemoryUsage/README.md b/OptimizationAppMemoryUsage/README.md index a2588262cba36fecbbd41f17b4899afc944a4540..efaed05105c0becd7c27d620ff8f276976034bd3 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 ec5c6146f051b356dd726da641cdb85286d7929c..be42eb908050dabbf41a891a1dd7c6c0cd67eb09 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 5124b987c42d74a0a7124b62f112a2e8f231e6a9..e1ee2e78db7e496147493fe449fb741ca0f38fb3 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 e6dbc491d08a87e634752dcdcb7a57ef1667e145..a6e217dd40ec0ff9fd52c2825dd7a91a28fe354f 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 b94c1fc674136cc26c0f31e61ad3cf475d80a32a..b91b00d5bcf86931b845a5a509dedad40e9cfb70 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;