From 890cda3a7afdc72b3de11e784774bbdaf9d810a1 Mon Sep 17 00:00:00 2001 From: dzin <2363448374@qq.com> Date: Tue, 10 Jun 2025 19:57:48 +0800 Subject: [PATCH 1/2] nwebspawn prelaod render lib Signed-off-by: dzin <2363448374@qq.com> --- modules/nweb_adapter/nwebspawn_adapter.cpp | 55 ++++++++++++++++++++++ nwebspawn.cfg | 1 - 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/modules/nweb_adapter/nwebspawn_adapter.cpp b/modules/nweb_adapter/nwebspawn_adapter.cpp index 6d0ae273..291dc4fc 100644 --- a/modules/nweb_adapter/nwebspawn_adapter.cpp +++ b/modules/nweb_adapter/nwebspawn_adapter.cpp @@ -29,6 +29,7 @@ #include "appspawn_hook.h" #include "appspawn_manager.h" +#include "parameter.h" #ifdef WITH_SECCOMP #include "seccomp_policy.h" @@ -49,6 +50,17 @@ namespace { const std::string ARK_WEB_RENDER_LIB_NAME = "libarkweb_render.so"; const std::string WEB_ENGINE_LIB_NAME = "libweb_engine.so"; const std::string WEB_RENDER_LIB_NAME = "libnweb_render.so"; + const std::string ARK_WEB_ENGINE_LIB_PRELOAD_PATH = + "/data/app/el1/bundle/public/com.huawei.hmos.arkwebcore/libs/arm64"; + const std::string OHOS_ADPT_GLUE_SRC_LIB_PATH = + "/system/lib64/libohos_adapter_glue_source.z.so"; + +typedef enum { + PRELOAD_NO = 0, // 不预加载 + PRELOAD_PARTIAL = 1, // 只预加载libohos_adapter_glue_source.z.so + PRELOAD_FULL = 2 // 预加载libohos_adapter_glue_source.z.so和libarkweb_engine.so +} RenderPreLoadMode; + } // namespace static bool SetSeccompPolicyForRenderer(void *nwebRenderHandle) @@ -148,6 +160,37 @@ APPSPAWN_STATIC int RunChildProcessor(AppSpawnContent *content, AppSpawnClient * return 0; } +static void PreLoadArkWebEngineLib() +{ + Dl_namespace dlns; + Dl_namespace ndkns; + dlns_init(&dlns, "nweb_ns"); + dlns_create(&dlns, ARK_WEB_ENGINE_LIB_PRELOAD_PATH.c_str()); + dlns_get("ndk", &ndkns); + dlns_inherit(&dlns, &ndkns, "allow_all_shared_libs"); + void *webEngineHandle = dlopen_ns(&dlns, ARK_WEB_ENGINE_LIB_NAME.c_str(), RTLD_NOW | RTLD_GLOBAL); + if (!webEngineHandle) { + APPSPAWN_LOGE("Fail to dlopen libarkweb_engine.so, errno: %{public}d", errno); + } +} + +static void PreLoadOHOSAdptGlueSrcLib() +{ + void *ohosAdptGlueSrcHandle = dlopen(OHOS_ADPT_GLUE_SRC_LIB_PATH.c_str(), RTLD_NOW | RTLD_GLOBAL); + if (!ohosAdptGlueSrcHandle) { + APPSPAWN_LOGE("Fail to dlopen libohos_adapter_glue_source.z.so, errno: %{public}d", errno); + } +} + +static int GetSysParamPreLoadMode() +{ + const int BUFFER_LEN = 128; + char preLoadMode[BUFFER_LEN] = {0}; + GetParameter("const.startup.nwebspawn.preloadMode", "0", preLoadMode, BUFFER_LEN); + int ret = std::atoi(preLoadMode); + return ret; +} + static int PreLoadNwebSpawn(AppSpawnMgr *content) { APPSPAWN_LOGI("PreLoadNwebSpawn %{public}d", IsNWebSpawnMode(content)); @@ -156,6 +199,18 @@ static int PreLoadNwebSpawn(AppSpawnMgr *content) } // register RegChildLooper(&content->content, RunChildProcessor); + + // preload render lib + int preloadMode = GetSysParamPreLoadMode(); + APPSPAWN_LOGI("NwebSpawn preload render lib mode: %{public}d", preloadMode); + if (preloadMode == PRELOAD_PARTIAL) { + PreLoadOHOSAdptGlueSrcLib(); + } + if (preloadMode == PRELOAD_FULL) { + PreLoadArkWebEngineLib(); + PreLoadOHOSAdptGlueSrcLib(); + } + return 0; } diff --git a/nwebspawn.cfg b/nwebspawn.cfg index 7b41723f..f29e3c89 100644 --- a/nwebspawn.cfg +++ b/nwebspawn.cfg @@ -21,7 +21,6 @@ "option" : [ ] }], - "start-mode" : "boot", "sandbox" : 0, "secon" : "u:r:nwebspawn:s0" } -- Gitee From 1a1020f1b7abdaf9a2fd5949939463ea500cbb54 Mon Sep 17 00:00:00 2001 From: dzin <2363448374@qq.com> Date: Thu, 12 Jun 2025 10:37:43 +0800 Subject: [PATCH 2/2] change buffer_len Signed-off-by: dzin <2363448374@qq.com> --- modules/nweb_adapter/nwebspawn_adapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nweb_adapter/nwebspawn_adapter.cpp b/modules/nweb_adapter/nwebspawn_adapter.cpp index 291dc4fc..c8562fa1 100644 --- a/modules/nweb_adapter/nwebspawn_adapter.cpp +++ b/modules/nweb_adapter/nwebspawn_adapter.cpp @@ -184,7 +184,7 @@ static void PreLoadOHOSAdptGlueSrcLib() static int GetSysParamPreLoadMode() { - const int BUFFER_LEN = 128; + const int BUFFER_LEN = 8; char preLoadMode[BUFFER_LEN] = {0}; GetParameter("const.startup.nwebspawn.preloadMode", "0", preLoadMode, BUFFER_LEN); int ret = std::atoi(preLoadMode); -- Gitee