From 626ca0f11e1d868f6d03a33910ba6794c10ab495 Mon Sep 17 00:00:00 2001 From: nianyuu Date: Fri, 6 Jun 2025 09:40:16 +0800 Subject: [PATCH] 1.2 preload Signed-off-by: nianyuu --- appspawn_preload_sts.json | 6 ++ etc/BUILD.gn | 7 +++ modules/ace_adapter/ace_adapter.cpp | 91 +++++++++++++++-------------- test/mock/js_runtime.h | 5 ++ 4 files changed, 66 insertions(+), 43 deletions(-) create mode 100644 appspawn_preload_sts.json diff --git a/appspawn_preload_sts.json b/appspawn_preload_sts.json new file mode 100644 index 00000000..bd4af66c --- /dev/null +++ b/appspawn_preload_sts.json @@ -0,0 +1,6 @@ +{ + "class" : [ + "L@ohos/app/ability/Want/Want;", + "L@ohos/deviceInfo/deviceInfo;" + ] +} diff --git a/etc/BUILD.gn b/etc/BUILD.gn index b23fdfc1..59090acd 100644 --- a/etc/BUILD.gn +++ b/etc/BUILD.gn @@ -78,6 +78,12 @@ ohos_prebuilt_etc("appspawn_preload.json") { module_install_dir = "etc/appspawn" } +ohos_prebuilt_etc("appspawn_preload_sts.json") { + source = "../appspawn_preload_sts.json" + part_name = "${part_name}" + module_install_dir = "etc/appspawn" +} + ohos_prebuilt_etc("appspawn_systemLib.json") { source = "../appspawn_systemLib.json" part_name = "${part_name}" @@ -88,6 +94,7 @@ group("etc_files") { deps = [ ":appdata-sandbox.json", ":appspawn_preload.json", + ":appspawn_preload_sts.json", ":appspawn_systemLib.json", ] if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) { diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index b10f82db..9ad701a1 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -50,61 +50,45 @@ static const bool DEFAULT_PRELOAD_VALUE = false; static const bool DEFAULT_PRELOAD_VALUE = true; #endif static const std::string PRELOAD_JSON_CONFIG("/appspawn_preload.json"); +static const std::string PRELOAD_STS_JSON_CONFIG("/appspawn_preload_sts.json"); typedef struct TagParseJsonContext { - std::set modules; + std::set names; + std::string key; } ParseJsonContext; -static void GetModules(const cJSON *root, std::set &modules) +static void GetNames(const cJSON *root, std::set &names, std::string key) { - // no config - cJSON *modulesJson = cJSON_GetObjectItemCaseSensitive(root, "napi"); - if (modulesJson == nullptr) { + cJSON *namesJson = cJSON_GetObjectItemCaseSensitive(root, key.c_str()); + if (namesJson == nullptr) { return; } - uint32_t moduleCount = (uint32_t)cJSON_GetArraySize(modulesJson); - for (uint32_t i = 0; i < moduleCount; ++i) { - const char *moduleName = cJSON_GetStringValue(cJSON_GetArrayItem(modulesJson, i)); - if (moduleName == nullptr) { + uint32_t count = (uint32_t)cJSON_GetArraySize(namesJson); + for (uint32_t i = 0; i < count; ++i) { + const char *name = cJSON_GetStringValue(cJSON_GetArrayItem(namesJson, i)); + if (name == nullptr) { continue; } - APPSPAWN_LOGV("moduleName %{public}s", moduleName); - if (!modules.count(moduleName)) { - modules.insert(moduleName); + APPSPAWN_LOGV("name %{public}s", name); + if (!names.count(name)) { + names.insert(name); } } } -static int GetModuleSet(const cJSON *root, ParseJsonContext *context) +static int GetNameSet(const cJSON *root, ParseJsonContext *context) { - GetModules(root, context->modules); + GetNames(root, context->names, context->key); return 0; } -static void LoadExtendLib(void) +static void PreloadModule(void) { - const char *acelibdir = OHOS::Ace::AceForwardCompatibility::GetAceLibName(); - APPSPAWN_LOGI("LoadExtendLib: Start calling dlopen acelibdir."); - void *aceAbilityLib = dlopen(acelibdir, RTLD_NOW | RTLD_LOCAL); - APPSPAWN_CHECK(aceAbilityLib != nullptr, return, "Fail to dlopen %{public}s, [%{public}s]", acelibdir, dlerror()); - APPSPAWN_LOGI("LoadExtendLib: Success to dlopen %{public}s", acelibdir); - - OHOS::AppExecFwk::MainThread::PreloadExtensionPlugin(); - bool preload = OHOS::system::GetBoolParameter("persist.appspawn.preload", DEFAULT_PRELOAD_VALUE); - if (!preload) { - APPSPAWN_LOGI("LoadExtendLib: Do not preload VM"); - return; - } - - APPSPAWN_LOGI("LoadExtendLib: Start preload JS VM"); - SetTraceDisabled(true); - OHOS::AbilityRuntime::Runtime::Options jsOptions; jsOptions.lang = OHOS::AbilityRuntime::Runtime::Language::JS; jsOptions.loadAce = true; jsOptions.preload = true; - auto jsRuntime = OHOS::AbilityRuntime::Runtime::Create(jsOptions); if (!jsRuntime) { APPSPAWN_LOGE("LoadExtendLib: Failed to create JS runtime"); @@ -115,28 +99,49 @@ static void LoadExtendLib(void) stsOptions.lang = OHOS::AbilityRuntime::Runtime::Language::STS; stsOptions.loadAce = true; stsOptions.preload = true; - auto stsRuntime = OHOS::AbilityRuntime::Runtime::Create(stsOptions); if (!stsRuntime) { APPSPAWN_LOGE("LoadExtendLib: Failed to create STS runtime"); return; } - SetTraceDisabled(false); - - APPSPAWN_LOGI("LoadExtendLib: Start preload STS VM"); - - ParseJsonContext context = {}; - (void)ParseJsonConfig("etc/appspawn", PRELOAD_JSON_CONFIG.c_str(), GetModuleSet, &context); - for (std::string moduleName : context.modules) { + ParseJsonContext jscontext = {{}, "napi"}; + (void)ParseJsonConfig("etc/appspawn", PRELOAD_JSON_CONFIG.c_str(), GetNameSet, &jscontext); + for (std::string moduleName : jscontext.names) { APPSPAWN_LOGI("moduleName %{public}s", moduleName.c_str()); jsRuntime->PreloadSystemModule(moduleName); } - // Save preloaded JS runtime - OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(jsRuntime), jsOptions.lang); - // Save preloaded STS runtime + ParseJsonContext stscontext = {{}, "class"}; + (void)ParseJsonConfig("etc/appspawn", PRELOAD_STS_JSON_CONFIG.c_str(), GetNameSet, &stscontext); + for (std::string className : stscontext.names) { + APPSPAWN_LOGI("className %{public}s", className.c_str()); + stsRuntime->PreloadClass(className.c_str()); + } + + OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(jsRuntime), jsOptions.lang); OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(stsRuntime), stsOptions.lang); +} + +static void LoadExtendLib(void) +{ + const char *acelibdir = OHOS::Ace::AceForwardCompatibility::GetAceLibName(); + APPSPAWN_LOGI("LoadExtendLib: Start calling dlopen acelibdir"); + void *aceAbilityLib = dlopen(acelibdir, RTLD_NOW | RTLD_LOCAL); + APPSPAWN_CHECK(aceAbilityLib != nullptr, return, "Fail to dlopen %{public}s, [%{public}s]", acelibdir, dlerror()); + APPSPAWN_LOGI("LoadExtendLib: Success to dlopen %{public}s", acelibdir); + + OHOS::AppExecFwk::MainThread::PreloadExtensionPlugin(); + bool preload = OHOS::system::GetBoolParameter("persist.appspawn.preload", DEFAULT_PRELOAD_VALUE); + if (!preload) { + APPSPAWN_LOGI("LoadExtendLib: Do not preload VM"); + return; + } + + APPSPAWN_LOGI("LoadExtendLib: Start preload VM"); + SetTraceDisabled(true); + PreloadModule(); + SetTraceDisabled(false); APPSPAWN_LOGI("LoadExtendLib: Start reclaim file cache"); OHOS::Ace::AceForwardCompatibility::ReclaimFileCache(getpid()); diff --git a/test/mock/js_runtime.h b/test/mock/js_runtime.h index 345cb1ee..f63c6320 100644 --- a/test/mock/js_runtime.h +++ b/test/mock/js_runtime.h @@ -60,6 +60,11 @@ namespace AbilityRuntime { return; } + void PreloadClass(const char *className) + { + return; + } + Runtime(const Runtime &) = delete; Runtime(Runtime &&) = delete; Runtime &operator=(const Runtime &) = delete; -- Gitee