diff --git a/arkweb_utils/BUILD.gn b/arkweb_utils/BUILD.gn index fd4cdf5b64cc7ceefd6207d49b8614e338453b64..a7013d852f95ae1e229a8c455f3426bc17ea27aa 100644 --- a/arkweb_utils/BUILD.gn +++ b/arkweb_utils/BUILD.gn @@ -12,6 +12,7 @@ # limitations under the License. import("//build/ohos.gni") +import("../config.gni") ohos_shared_library("libarkweb_utils") { output_name = "arkweb_utils" @@ -60,6 +61,10 @@ ohos_shared_library("libarkweb_utils") { innerapi_tags = [ "platformsdk" ] part_name = "webview" subsystem_name = "web" + + if(webview_preload_render_lib){ + defines += ["PRELOAD_RENDER_LIB"] + } } diff --git a/arkweb_utils/arkweb_utils.cpp b/arkweb_utils/arkweb_utils.cpp index dea34ecd88a15ce3c08f3a15c098ac002a081f38..2f7b9ac80c64c8f35256a89a582997703a83ed8d 100644 --- a/arkweb_utils/arkweb_utils.cpp +++ b/arkweb_utils/arkweb_utils.cpp @@ -21,6 +21,9 @@ #include #include #include +#ifndef webview_x86_64 +#include +#endif namespace OHOS::ArkWeb { @@ -39,6 +42,7 @@ const std::string ARK_WEB_CORE_LEGACY_HAP_LIB_PATH = const std::string ARK_WEB_CORE_PATH_FOR_MOCK = "libs/arm64"; const std::string ARK_WEB_CORE_PATH_FOR_BUNDLE = "arkwebcore/libs/arm64"; const std::string ARK_WEB_CORE_LEGACY_PATH_FOR_BUNDLE = "arkwebcorelegacy/libs/arm64"; +const std::string OHOS_ADAPTER_GLUE_SRC_LIB_PATH = "/system/lib64/libohos_adapter_glue_source.z.so"; #elif defined(webview_x86_64) const std::string ARK_WEB_CORE_MOCK_HAP_LIB_PATH = "/data/storage/el1/bundle/libs/x86_64"; @@ -49,6 +53,7 @@ const std::string ARK_WEB_CORE_LEGACY_HAP_LIB_PATH = const std::string ARK_WEB_CORE_PATH_FOR_MOCK = "libs/x86_64"; const std::string ARK_WEB_CORE_PATH_FOR_BUNDLE = "arkwebcore/libs/x86_64"; const std::string ARK_WEB_CORE_LEGACY_PATH_FOR_BUNDLE = "arkwebcorelegacy/libs/x86_64"; +const std::string OHOS_ADAPTER_GLUE_SRC_LIB_PATH = ""; #else const std::string ARK_WEB_CORE_MOCK_HAP_LIB_PATH = "/data/storage/el1/bundle/libs/arm"; @@ -59,6 +64,7 @@ const std::string ARK_WEB_CORE_LEGACY_HAP_LIB_PATH = const std::string ARK_WEB_CORE_PATH_FOR_MOCK = "libs/arm"; const std::string ARK_WEB_CORE_PATH_FOR_BUNDLE = "arkwebcore/libs/arm"; const std::string ARK_WEB_CORE_LEGACY_PATH_FOR_BUNDLE = "arkwebcorelegacy/libs/arm"; +const std::string OHOS_ADAPTER_GLUE_SRC_LIB_PATH = "/system/lib/libohos_adapter_glue_source.z.so"; #endif #if defined(IS_ASAN) @@ -85,6 +91,7 @@ const std::string SANDBOX_EVERGREEN_HAP_PATH = "/data/storage/el1/bundle/arkwebc const std::string JSON_CONFIG_PATH = "/data/service/el1/public/update/param_service/install/system/etc/ArkWebSafeBrowsing/generic/ArkWebCoreCfg.json"; const std::string WEB_PARAM_PREFIX = "web.engine."; +const std::string ARK_WEB_ENGINE_LIB_NAME = "libarkweb_engine.so"; // 前向声明 static ArkWebEngineVersion CalculateActiveWebEngineVersion(); @@ -442,4 +449,112 @@ void* ArkWebBridgeHelperSharedInit(bool runMode) return libFileHandler; } + +std::string GetArkwebBundleInstallLibPath() { + std::string bundleName = OHOS::system::GetParameter("persist.arkwebcore.package_name", ""); + if (bundleName.empty()) { + WVLOG_E("Fail to get persist.arkwebcore.package_name"); + return ""; + } + if (getActiveWebEngineType() == ArkWebEngineType::LEGACY) { + bundleName += "legacy"; + } + +#ifdef webview_arm64 + const std::string arkwebEngineLibPath = "/data/app/el1/bundle/public/" + std::string(bundleName) + "/libs/arm64"; +#elif webview_x86_64 + const std::string arkwebEngineLibPath = ""; +#else + const std::string arkwebEngineLibPath = "/data/app/el1/bundle/public/" + std::string(bundleName) + "/libs/arm"; +#endif + return arkwebEngineLibPath; +} + +std::string GetOhosAdptGlueSrcLibPath() { + return OHOS_ADAPTER_GLUE_SRC_LIB_PATH; +} + +static void PreloadArkWebEngineLib() +{ + Dl_namespace dlns; + Dl_namespace ndkns; + dlns_init(&dlns, "nweb_ns"); + const std::string arkWebEngineLibPath = GetArkwebBundleInstallLibPath(); + const std::string arkwebEngineSandboxLibPath = GetArkwebLibPath(); + if (arkWebEngineLibPath.empty()) { + WVLOG_E("Fail to get libarkweb_engine.so path"); + return; + } + std::string libNsPath = arkWebEngineLibPath + ":" + arkwebEngineSandboxLibPath; + dlns_create(&dlns, libNsPath.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 == nullptr) { + WVLOG_E("Fail to dlopen libarkweb_engine.so, errno: %{public}d", errno); + } +} + +static void PreloadOHOSAdptGlueSrcLib() +{ + const std::string ohosAdptGlueSrcLibPath = OHOS::ArkWeb::GetOhosAdptGlueSrcLibPath(); + if (ohosAdptGlueSrcLibPath.empty()) { + WVLOG_E("Fail to get libohos_adapter_glue_source.z.so path"); + return; + } + void *ohosAdptGlueSrcHandle = dlopen(ohosAdptGlueSrcLibPath.c_str(), RTLD_NOW | RTLD_GLOBAL); + if (ohosAdptGlueSrcHandle == nullptr) { + WVLOG_E("Fail to dlopen libohos_adapter_glue_source.z.so, errno: %{public}d", errno); + } +} + +int PreloadArkWebLibForRender(const int &preloadMode) +{ + if (preloadMode == static_cast(RenderPreLoadMode::PRELOAD_PARTIAL)) { + PreloadOHOSAdptGlueSrcLib(); + } + if (preloadMode == static_cast(RenderPreLoadMode::PRELOAD_FULL)) { + PreloadArkWebEngineLib(); + } + return 0; +} + +double GetSysTotalRAMInfo() +{ +#ifdef webview_x86_64 + return 0; +#else + struct sysinfo sysInfo; + if (sysinfo(&sysInfo) != 0) { + return 0; + } + return static_cast(sysInfo.totalram * sysInfo.mem_unit) / (1024 * 1024 * 1024); +#endif +} + +int GetRenderPreLoadMode(const double &totalRAM) +{ +#ifdef PRELOAD_RENDER_LIB + return static_cast(RenderPreLoadMode::PRELOAD_FULL); +#endif + int preloadMode = OHOS::system::GetIntParameter("const.startup.nwebspawn.preloadMode", 0); + if (preloadMode == static_cast(RenderPreLoadMode::PRELOAD_NO)) { + return static_cast(RenderPreLoadMode::PRELOAD_NO); + } + if (totalRAM >= 16.0) { + return static_cast(RenderPreLoadMode::PRELOAD_FULL); + } + if (totalRAM >= 12.0) { + return static_cast(RenderPreLoadMode::PRELOAD_PARTIAL); + } + return static_cast(RenderPreLoadMode::PRELOAD_NO); +} + +void PreloadArkWebLibForRender() +{ + const double totalRAM = GetSysTotalRAMInfo(); + const int preloadMode = GetRenderPreLoadMode(totalRAM); + WVLOG_I("NwebSpawn preload render lib mode: %{public}d", preloadMode); + (void)PreloadArkWebLibForRender(preloadMode); +} } \ No newline at end of file diff --git a/arkweb_utils/arkweb_utils.h b/arkweb_utils/arkweb_utils.h index 9d7480473a382c330412e7927bf1ae2134e0df1c..b362a976fff1082c8287fdb58bd9e186a078a709 100644 --- a/arkweb_utils/arkweb_utils.h +++ b/arkweb_utils/arkweb_utils.h @@ -73,6 +73,12 @@ enum class ArkWebEngineType { EVERGREEN = static_cast(ArkWebEngineVersion::M132), }; +enum class RenderPreLoadMode { + PRELOAD_NO = 0, // 不预加载 + PRELOAD_PARTIAL = 1, // 只预加载libohos_adapter_glue_source.z.so + PRELOAD_FULL = 2 // 预加载libohos_adapter_glue_source.z.so和libarkweb_engine.so +}; + ARKWEB_EXPORT void setActiveWebEngineVersion(ArkWebEngineVersion version); ARKWEB_EXPORT ArkWebEngineVersion getActiveWebEngineVersion(); ARKWEB_EXPORT ArkWebEngineType getActiveWebEngineType(); @@ -85,7 +91,13 @@ ARKWEB_EXPORT std::string GetArkwebNameSpace(); ARKWEB_EXPORT std::string GetArkwebRelativePathForBundle(); ARKWEB_EXPORT std::string GetArkwebRelativePathForMock(); ARKWEB_EXPORT std::string GetArkwebInstallPath(); +// 获取libarkweb_engine.so包安装的物理路径 +ARKWEB_EXPORT std::string GetArkwebBundleInstallLibPath(); +ARKWEB_EXPORT std::string GetOhosAdptGlueSrcLibPath(); ARKWEB_EXPORT void PreloadArkWebLibForBrowser(); +ARKWEB_EXPORT int PreloadArkWebLibForRender(const int &preloadMode); +ARKWEB_EXPORT void PreloadArkWebLibForRender(); +ARKWEB_EXPORT int GetRenderPreLoadMode(const double &totalRAM); ARKWEB_EXPORT void LogForUnsupportedFunc(ArkWebEngineVersion version, const char* msg); diff --git a/config.gni b/config.gni index 3085542b6840249d02480bda73fc0c2029a3931b..8a85c61519593e971048db4054d98218b3cb6c28 100644 --- a/config.gni +++ b/config.gni @@ -27,6 +27,7 @@ declare_args() { webview_sensors_sensor_enable = true webview_enable_heif_decoder = false webview_drm_enable = true + webview_preload_render_lib = true if (defined(global_parts_info) && !defined(global_parts_info.resourceschedule_soc_perf)) { diff --git a/ohos_nweb/etc/para/web.para b/ohos_nweb/etc/para/web.para index b77bbf1e88433dd9a522218a1bd8ca80ae0b01ef..2e8f2644057eb213db1aae3ed375c394d05ec88d 100644 --- a/ohos_nweb/etc/para/web.para +++ b/ohos_nweb/etc/para/web.para @@ -26,4 +26,5 @@ web.ohos.vulkan = None web.prppreload.mode = preload web.ohos.dvsync = false web.ohos.enableCWNDSetting = false +web.engine.install.completed = false web.TCPConnectedSocket.initialCongestionWindowSize = -1 diff --git a/ohos_nweb/etc/para/web.para.dac b/ohos_nweb/etc/para/web.para.dac index f41ac035681a3da5dd0b877545bc0aafa30e43b4..1f5a7b2ca87969de2ee74b65082eded7b5d098ea 100644 --- a/ohos_nweb/etc/para/web.para.dac +++ b/ohos_nweb/etc/para/web.para.dac @@ -17,4 +17,5 @@ web.debug.trace = root:shell:0775 persist.arkwebcore.install_path = root:root:0776 persist.arkwebcore.package_name = root:root:0776 web.prppreload.mode = root:root:0644 -persist.scrollable. = root:root:0775 \ No newline at end of file +persist.scrollable. = root:root:0775 +web.engine.install.completed = root:root:0776 \ No newline at end of file diff --git a/sa/IAppFwkUpdateService.idl b/sa/IAppFwkUpdateService.idl index 2d9a27a6a5ab59e3bf0f14e1cc6441cd8f68363a..ba3dbd9c82784d6a651d9966432648f62910bd9c 100644 --- a/sa/IAppFwkUpdateService.idl +++ b/sa/IAppFwkUpdateService.idl @@ -15,4 +15,5 @@ interface OHOS.NWeb.IAppFwkUpdateService { void VerifyPackageInstall([in] String bundleName, [in] String hapPath, [out]int success); [oneway] void NotifyFWKAfterBmsStart(); + void NotifyArkWebInstallSuccess(); } diff --git a/sa/include/app_fwk_update_client.h b/sa/include/app_fwk_update_client.h index f9f9f698dd4107d90efc7003b72bcd628214aae8..5d50487330d1fd9d9b237bb407f4fb5af24f066a 100644 --- a/sa/include/app_fwk_update_client.h +++ b/sa/include/app_fwk_update_client.h @@ -34,6 +34,7 @@ public: static AppFwkUpdateClient& GetInstance(); int VerifyPackageInstall(const std::string& bundleName, const std::string& hapPath); void NotifyFWKAfterBmsStart(); + void NotifyArkWebInstallSuccess(); void OnLoadSystemAbilitySuccess(const sptr& object); void OnLoadSystemAbilityFail(); diff --git a/sa/include/app_fwk_update_service.h b/sa/include/app_fwk_update_service.h index c912669c6adf90546ae15c905f2bdcefe4bc2d6f..46d6b04c941dfe25faa89f25d6b72fab8d02ab93 100644 --- a/sa/include/app_fwk_update_service.h +++ b/sa/include/app_fwk_update_service.h @@ -51,6 +51,7 @@ public: ErrCode VerifyPackageInstall(const std::string& bundleName, const std::string& hapPath, int32_t& success) override; ErrCode NotifyFWKAfterBmsStart() override; + ErrCode NotifyArkWebInstallSuccess() override; void SubscribePackageChangedEvent(); void OnPackageChangedEvent(const std::string& bunldeName, const std::string& hapPath); diff --git a/sa/libapp_fwk_update_service.map b/sa/libapp_fwk_update_service.map index cdd06d68d272277e5739605be941618d9e1f78a1..d5bb881970d389cc161941710c492422f5114e2f 100644 --- a/sa/libapp_fwk_update_service.map +++ b/sa/libapp_fwk_update_service.map @@ -4,6 +4,7 @@ OHOS::NWeb::AppFwkUpdateClient::GetInstance*; OHOS::NWeb::AppFwkUpdateClient::VerifyPackageInstall*; OHOS::NWeb::AppFwkUpdateClient::NotifyFWKAfterBmsStart*; + OHOS::NWeb::AppFwkUpdateClient::NotifyArkWebInstallSuccess*; }; local: *; diff --git a/sa/src/app_fwk_update_client.cpp b/sa/src/app_fwk_update_client.cpp index 4d30d41a16e5250375c89199a844bb0e9b1f5335..056676b65be01696a968f4089a0b3bbf831eaa9e 100644 --- a/sa/src/app_fwk_update_client.cpp +++ b/sa/src/app_fwk_update_client.cpp @@ -109,6 +109,16 @@ void AppFwkUpdateClient::NotifyFWKAfterBmsStart() proxy->NotifyFWKAfterBmsStart(); } +void AppFwkUpdateClient::NotifyArkWebInstallSuccess() +{ + auto proxy = GetFwkUpdateProxy(); + if (proxy == nullptr) { + WVLOG_E("NotifyArkWebInstallSuccess failed, proxy is null"); + return; + } + proxy->NotifyArkWebInstallSuccess(); +} + int AppFwkUpdateClient::VerifyPackageInstall(const std::string& bundleName, const std::string& hapPath) { WVLOG_I("verify package install callingUid: %{public}d", IPCSkeleton::GetCallingUid()); diff --git a/sa/src/app_fwk_update_service.cpp b/sa/src/app_fwk_update_service.cpp index 82f1457cdfbcd0d1d586c4615cd1ca2cacf5f13c..c68acf5c7a8bd07d5663365d89be153e39289ac9 100644 --- a/sa/src/app_fwk_update_service.cpp +++ b/sa/src/app_fwk_update_service.cpp @@ -104,6 +104,20 @@ ErrCode AppFwkUpdateService::NotifyFWKAfterBmsStart() return ERR_OK; } +ErrCode AppFwkUpdateService::NotifyArkWebInstallSuccess() +{ + int preloadMode = OHOS::system::GetIntParameter("const.startup.nwebspawn.preloadMode", 0); + WVLOG_I("NwebSpawn preload render lib mode: %{public}d", preloadMode); + if (preloadMode) { + auto ret = OHOS::system::SetParameter("web.engine.install.completed", "true"); + if (!ret) { + WVLOG_E("Set parameter web.engine.install.completed failed"); + return ERR_INVALID_VALUE; + } + } + return ERR_OK; +} + ErrCode AppFwkUpdateService::VerifyPackageInstall( const std::string& bundleName, const std::string& hapPath, int32_t& isSuccess) { diff --git a/test/unittest/app_fwk_update_client_test/app_fwk_update_client_test.cpp b/test/unittest/app_fwk_update_client_test/app_fwk_update_client_test.cpp index e82cddaf54cc8b0c4b56cee7e78567f3a4581c73..a9ba44853e7f5e2a9f93b9a8f889baeb900489a2 100644 --- a/test/unittest/app_fwk_update_client_test/app_fwk_update_client_test.cpp +++ b/test/unittest/app_fwk_update_client_test/app_fwk_update_client_test.cpp @@ -217,4 +217,18 @@ HWTEST_F(AppFwkUpdateClientTest, AppFwkUpdateClientTest_009, TestSize.Level0) callback.OnLoadSystemAbilityFail(SUBSYS_WEBVIEW_SYS_UPDATE_SERVICE_ID); EXPECT_EQ(appFwkUpdateClient.GetFwkUpdate(), nullptr); } + + +/** + * @tc.name: AppFwkUpdateClientTest_010 + * @tc.desc: appFwkUpdateClient.NotifyArkWebInstallSuccess() + * @tc.type: Func + * @tc.require: +*/ +HWTEST_F(AppFwkUpdateClientTest, AppFwkUpdateClientTest_010, TestSize.Level0) +{ + AppFwkUpdateClient &appFwkUpdateClient = AppFwkUpdateClient::GetInstance(); + appFwkUpdateClient.NotifyArkWebInstallSuccess(); + EXPECT_TRUE(true); +} } // namespace OHOS::NWeb diff --git a/test/unittest/arkweb_utils_test/arkweb_utils_test.cpp b/test/unittest/arkweb_utils_test/arkweb_utils_test.cpp index 96c993a5443abcb5c04b77a405409139697cd5b4..548fda5cde0e0e03abb2defb09f33ef60c2feaba 100644 --- a/test/unittest/arkweb_utils_test/arkweb_utils_test.cpp +++ b/test/unittest/arkweb_utils_test/arkweb_utils_test.cpp @@ -223,6 +223,57 @@ TEST(arkweb_utils_test, GetArkwebInstallPath002) { OHOS::system::SetParameter("web.engine.enforce", std::to_string(webEngineEnforce)); } +TEST(arkweb_utils_test, GetArkwebBundleInstallLibPath001) { + int webEngineEnforce = OHOS::system::GetIntParameter("web.engine.enforce", 0); + OHOS::system::SetParameter("web.engine.enforce", std::to_string(0)); + setActiveWebEngineVersion(ArkWebEngineVersion::M114); + + auto arkwebLibPath = GetArkwebBundleInstallLibPath(); +#if defined(webview_x86_64) + EXPECT_TRUE(arkwebLibPath.empty()); +#else + EXPECT_TRUE(!arkwebLibPath.empty()); +#endif + OHOS::system::SetParameter("web.engine.enforce", std::to_string(webEngineEnforce)); +} + +TEST(arkweb_utils_test, GetArkwebBundleInstallLibPath002) { + const std::string pkgName; + OHOS::system::GetParameter("persist.arkwebcore.package_name", pkgName); + OHOS::system::SetParameter("persist.arkwebcore.package_name", ""); + auto arkwebLibPath = GetArkwebBundleInstallLibPath(); + EXPECT_TRUE(arkwebLibPath.empty()); + OHOS::system::SetParameter("persist.arkwebcore.package_name", pkgName); +} + +TEST(arkweb_utils_test, GetOhosAdptGlueSrcLibPath001) { + auto ohosAdptGlueSrcLibPath = GetOhosAdptGlueSrcLibPath(); +#if defined(webview_x86_64) + EXPECT_TRUE(ohosAdptGlueSrcLibPath.empty()); +#else + EXPECT_TRUE(!ohosAdptGlueSrcLibPath.empty()); +#endif +} + +TEST(arkweb_utils_test, GetRenderPreLoadMode001) { + int ret = GetRenderPreLoadMode(16.0); + EXPECT_TRUE(ret >= 0); + ret = GetRenderPreLoadMode(12.0); + EXPECT_TRUE(ret >= 0); + ret = GetRenderPreLoadMode(8.0); + EXPECT_TRUE(ret >= 0); +} + +TEST(arkweb_utils_test, PreloadArkWebLibForRender001) { + PreloadArkWebLibForRender(); + int preloadMode = 1; + int ret = PreloadArkWebLibForRender(preloadMode); + EXPECT_EQ(ret, 0); + preloadMode = 2; + ret = PreloadArkWebLibForRender(preloadMode); + EXPECT_EQ(ret, 0); +} + TEST(arkweb_utils_test, SelectWebcoreBeforeProcessRun001) { std::string appBundleName = "com.example.app"; int webEngineEnforce = OHOS::system::GetIntParameter("web.engine.enforce", 0);