From 6f8f69c765adb5044c813c2f91a0fea2f4488fad Mon Sep 17 00:00:00 2001 From: TinyLight Date: Sat, 12 Jul 2025 22:46:10 +0800 Subject: [PATCH] nwebspawn prelaod render so Signed-off-by: TinyLight --- appspawn.cfg | 9 ++- appspawn.gni | 1 + bundle.json | 3 +- modules/nweb_adapter/BUILD.gn | 3 + modules/nweb_adapter/nwebspawn_adapter.cpp | 91 ++++++++++++++++++++++ 5 files changed, 105 insertions(+), 2 deletions(-) diff --git a/appspawn.cfg b/appspawn.cfg index f81a7339..254845f7 100644 --- a/appspawn.cfg +++ b/appspawn.cfg @@ -21,6 +21,13 @@ "chmod 0750 /dev/pids/tasks", "chmod 0750 /dev/pids/cgroup.procs" ] + }, + { + "name" : "param:bootevent.boot.completed", + "condition" : "bootevent.boot.completed=true", + "cmds" : [ + "start NWebSpawn" + ] } ], "services" : [{ @@ -60,7 +67,7 @@ ] }], "sandbox" : 0, - "start-mode" : "boot", + "start-mode" : "condition", "secon" : "u:r:appspawn:s0", "bootevents" : "bootevent.appspawn.started" } diff --git a/appspawn.gni b/appspawn.gni index cc2fd8e3..fae9d077 100644 --- a/appspawn.gni +++ b/appspawn.gni @@ -36,6 +36,7 @@ declare_args() { appspawn_support_code_signature = true appspawn_allow_internet_permission = false appspawn_custom_sandbox = false + appspawn_arkweb_preload = true } if (!defined(global_parts_info) || diff --git a/bundle.json b/bundle.json index 8deb812f..a6053415 100644 --- a/bundle.json +++ b/bundle.json @@ -28,7 +28,8 @@ "appspawn_support_prefork", "appspawn_support_code_signature", "appspawn_allow_internet_permission", - "appspawn_custom_sandbox" + "appspawn_custom_sandbox", + "appspawn_arkweb_preload" ], "rom": "296KB", "ram": "13125KB", diff --git a/modules/nweb_adapter/BUILD.gn b/modules/nweb_adapter/BUILD.gn index acd15abe..35ea32b4 100644 --- a/modules/nweb_adapter/BUILD.gn +++ b/modules/nweb_adapter/BUILD.gn @@ -31,6 +31,9 @@ ohos_shared_library("appspawn_nweb") { if (target_cpu == "x86_64") { defines += [ "webview_x86_64" ] } + if (appspawn_arkweb_preload) { + defines += [ "preload_rk3568" ] + } external_deps = [ "c_utils:utils", diff --git a/modules/nweb_adapter/nwebspawn_adapter.cpp b/modules/nweb_adapter/nwebspawn_adapter.cpp index 6d0ae273..0e8d887a 100644 --- a/modules/nweb_adapter/nwebspawn_adapter.cpp +++ b/modules/nweb_adapter/nwebspawn_adapter.cpp @@ -49,6 +49,19 @@ 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"; + +#if defined(preload_rk3568) + const std::string ARKWEB_BUNDLE_NAME = "com.ohos.arkwebcore"; +#else + const std::string ARKWEB_BUNDLE_NAME = "com.huawei.hmos.arkwebcore"; +#endif + +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 +161,68 @@ APPSPAWN_STATIC int RunChildProcessor(AppSpawnContent *content, AppSpawnClient * return 0; } +static std::string GetOHOSAdptGlueSrcLibPath() +{ +#if defined(webview_arm64) + const std::string ARK_WEB_CORE_HAP_LIB_PATH = + "/system/lib64/libohos_adapter_glue_source.z.so"; +#else + const std::string ARK_WEB_CORE_HAP_LIB_PATH = + "/system/lib/libohos_adapter_glue_source.z.so"; +#endif + return ARK_WEB_CORE_HAP_LIB_PATH; +} + +static std::string GetArkWebEngineLibPath() +{ +#if defined(webview_arm64) + const std::string ARK_WEB_CORE_HAP_LIB_PATH = + "/data/app/el1/bundle/public/" + ARKWEB_BUNDLE_NAME + "/libs/arm64"; +#elif defined(webview_x86_64) + const std::string ARK_WEB_CORE_HAP_LIB_PATH = + "/data/app/el1/bundle/public/" + ARKWEB_BUNDLE_NAME + "/libs/x86_64"; +#else + const std::string ARK_WEB_CORE_HAP_LIB_PATH = + "/data/app/el1/bundle/public/" + ARKWEB_BUNDLE_NAME + "/libs/arm"; +#endif + return ARK_WEB_CORE_HAP_LIB_PATH; +} + +static void PreLoadArkWebEngineLib() +{ + Dl_namespace dlns; + Dl_namespace ndkns; + dlns_init(&dlns, "nweb_ns"); + const std::string arkWebEngineLibPath = GetArkWebEngineLibPath(); + dlns_create(&dlns, arkWebEngineLibPath.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() +{ + const std::string ohosAdptGlueSrcLibPath = GetOHOSAdptGlueSrcLibPath(); + void *ohosAdptGlueSrcHandle = dlopen(ohosAdptGlueSrcLibPath.c_str(), RTLD_NOW | RTLD_GLOBAL); + if (!ohosAdptGlueSrcHandle) { + APPSPAWN_LOGE("Fail to dlopen libohos_adapter_glue_source.z.so, errno: %{public}d", errno); + } +} + +#if !defined(preload_rk3568) +static int GetSysParamPreLoadMode() +{ + const int BUFFER_LEN = 8; + char preLoadMode[BUFFER_LEN] = {0}; + GetParameter("const.startup.nwebspawn.preloadMode", "0", preLoadMode, BUFFER_LEN); + int ret = std::atoi(preLoadMode); + return ret; +} +#endif + static int PreLoadNwebSpawn(AppSpawnMgr *content) { APPSPAWN_LOGI("PreLoadNwebSpawn %{public}d", IsNWebSpawnMode(content)); @@ -156,6 +231,22 @@ static int PreLoadNwebSpawn(AppSpawnMgr *content) } // register RegChildLooper(&content->content, RunChildProcessor); + + // preload render lib +#if defined(preload_rk3568) + int preloadMode = RenderPreLoadMode::PRELOAD_FULL; +#else + int preloadMode = GetSysParamPreLoadMode(); +#endif + APPSPAWN_LOGI("NwebSpawn preload render lib mode: %{public}d", preloadMode); + if (preloadMode == PRELOAD_PARTIAL) { + PreLoadOHOSAdptGlueSrcLib(); + } + if (preloadMode == PRELOAD_FULL) { + PreLoadArkWebEngineLib(); + PreLoadOHOSAdptGlueSrcLib(); + } + return 0; } -- Gitee